您的位置:首页 > 编程语言 > Java开发

JavaEE jsp的编译指令和动作指令

2017-02-04 17:45 302 查看
jsp页面除了静态文本和jsp脚本外,还包括编译指令和动作指令。

jsp编译指令

常见的jsp编译指令有3个:

- page:针对当前的jsp页面;

- include:将另一个页面(不仅仅是jsp文件,也可以是其他类型的文件)包含到当前的jsp页面;

- taglib:定义和访问自定义标签。

使用jsp编译指令的语法格式为:
<%@ 编译指令 属性名="属性值" ...%>


page指令

page指令通常位于jsp页面顶端,一个jsp页面可以包含多个page指令。page指令具有如下属性:

- language:声明当前jsp页面使用的脚本语言,默认是java;

- extends:指定当前jsp页面编译生成的类所继承的父类或实现的接口;

- import:用来导入包,
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
是默认导入的;

- session:指定当前jsp页面是否需要HttpSession;

- buffer:指定输出缓冲区的大小,单位为KB;

- autoFlush:指定当输出缓冲区满时,是否强制输出缓冲区中内容;

- isThreadSafe:指定当前jsp页面是否是线程安全的;

- info:指定当前jsp页面的说明信息,通过调用Servlet.getServletInfo方法获得;

- errorPage:指定错误处理页面;

- contentType:设定生成网页的文件格式和编码字符集,MIME默认为
text/html
,charset默认为
ISO-8859-1


- pageEncoding:指定当前jsp页面的编码字符集;

- isErrorPage:指定当前jsp页面是否是错误处理页面。

关于contentType和pageEncoding

在jsp标准语法中,如果pageEncoding属性存在,则jsp页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的charset决定。如果charset也不存在,jsp页面的字符编码方式就采用默认的ISO-8859-1字符集。

- ContentType属性指定了生成网页的MIME类型和字符编码方式。MIME类型默认是
text/html
; 字符编码方式默认是
ISO-8859-1
。contentType的charset是指服务器发送给客户端时的内容编码。

- pageEncoding是jsp文件本身的编码,只是用于jsp输出时的编码,不会作为header发出去。pageEncoding是通知web server当前jsp页面的编码方式。

jsp页面要经过两次“编码”,第一阶段使用pageEncoding,第二阶段使用UTF-8至UTF-8,第三阶段使用contentType,即由Tomcat生成的网页。

1. 第一阶段是jsp页面编译成.java文件,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方式转换成统一的UTF-8编码的.java文件。如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

2. 第二阶段是.java文件编译成.class文件,不论jsp页面用的是什么编码方式,这个阶段的结果全部是UTF-8编码的.class文件。

3. 第三阶段是Tomcat(或其它的application container)载入和执行上个阶段生成的.class文件,这时contentType属性就发挥了功效。

举个例子:

<%@ page contentType="text/html;charset=utf-8" %>


大都会打印出乱码,因为输入的中文是GBK编码的,服务器是否能正确识别中文不得而知。

但是如果改为

<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>


这样服务器一定能正确识别中文了。

include指令

include指令也叫作静态包含,它可以将一个文件包含到当前jsp页面中,既包括静态的文本,也包括动态的jsp语句,作用类似于C/C++中的include关键字。include编译指令只需要指定
file
属性,例如:
<%@ include file="another.jsp" %>


include编译指令会将被包含文件的jsp编译指令也包含进来(如果有的话),如果两个页面的jsp编译指令冲突,则页面将会出错。

taglib指令

taglib指令涉及到jsp自定义标签的开发,具体介绍可以看我的另一篇文章:《JavaEE jsp自定义标签》

jsp动作指令

动作指令不同于编译指令,编译指令是通知Servlet引擎的处理消息,而动作指令只是在运行时的动作。编译指令在将jsp文件编译成Servlet类时起作用,而动作指令通常可替换成jsp脚本,它是jsp脚本的标准化写法。

jsp动作指令主要有:

- jsp:forward:执行页面跳转,将用户请求转发到另一个页面;

- jsp:param:用于传递参数,不能单独使用;

- jsp:include:用于动态引入一个jsp页面;

- jsp:plugin:用于下载JavaBean或Applet到客户端执行,现在已不常用;

- jsp:useBean:创建一个JavaBean对象实例;

- jsp:setProperty:设置JavaBean的属性值;

- jsp:getProperty:获取JavaBean的属性值。

forward指令

forward指令可以将用户请求转发到其他页面,既可以是静态的HTML页面,也可以是动态的jsp页面,还可以转发给web容器中的Servlet。

forward指令的语法格式为:

<jsp:forward page="another.jsp">
<jsp:param name="key" value="value"/>
</jsp:froward>


在使用forward指令时可以指定额外的请求参数,这些参数(包括原来的用户请求参数)可以在跳转目标页面中通过调用
HttpServletRequest.getParameter
方法得到。

include指令

jsp编译指令和动作指令中都有include指令,不同的是,include编译指令会将被包含页面的jsp编译指令包含进来,而include动作指令不会将被包含页面的jsp编译指令包含进来。

include动作指令的语法格式为:

<jsp:include page="another.jsp" flush="true">
<jsp:param name="key" value="value"/>
</jsp:include>


page属性指定被包含的页面;flush属性控制缓冲,如果jsp页面的输出流(JspWriter对象)具有缓冲区并且flush属性为true,则在缓冲区满之前强制输出,flush默认为false。

在使用include动作指令时同样可以提供额外的参数,这些参数可以在被包含页面中通过
HttpServletRequest.getParameter
方法获得。

include编译指令和include动作指令

include编译指令:在页面请求前预编译,将所有代码包含进来后一起进行处理,并把所有代码合在一起编译成一个Servlet类,因此也称为静态包含;

include动作指令:所有代码分别处理,在页面被请求时才编译,被编译成多个Servlet类,页面语法相对独立,处理完成之后再将代码的显示结果(处理结果)组合进来,因此也称为动态包含;

对于静态包含,所包含的文件只是简单的嵌入到主文件中,就是在jsp页面转化成Servlet时才嵌入到主文件中,因为运行的结果是只生成了一个Servlet;

对于动态包含,如果被包含文件是动态的(比如jsp文件),那么就会生成两个Servlet,也就是被包含文件也要经过jsp引擎编译执行生成一个Servlet,这两个Servlet通过request和reponse进行通信。如果被包含的文件是静态的,那么这种情况和静态包含就很相似,只生成了一个Servlet,但是他们之间没有进行简单的嵌入,而依然是通过request和reponse进行通信。

useBean、setProperty和getProperty指令

这三个指令用来操作JavaBean对象,useBean指令创建一个JavaBean对象,setProperty指令设置JavaBean对象的属性值,getProperty指令获取JavaBean对象的属性值。

他们的语法格式如下:

<jsp:useBean id="instance" class="package.class" scope="page"/>
<jsp:setProperty name="instance" property="attribution" value="value"/>
<jsp:getProperty name="instance" property="attribution"/>


useBean指令中的
id
属性是JavaBean对象的实例名(相当于变量名),
class
属性指明JavaBean对象的类(这个类必须有一个无参构造器方法),
scope
属性指明JavaBean对象的作用域,可以设置4个作用域:

- page:在当前页面中存在;

- request:在本次请求中存在;

- session:在本次session中存在;

- application:在本应用中存在。

setProperty和getProperty指令中的
name
属性指明操作的JavaBean对象,即useBea
abc5
n指令的
id
属性的值,
property
属性指明JavaBean对象的属性(此属性必须有get和set方法)。setProperty指令中的
value
属性赋予指定属性的新值,getProperty指令会直接输出JavaBean对象的属性值。

这三个指令完全可以用jsp脚本替代。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java ee jsp