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

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对象,即useBean指令的id属性的值,property属性指明JavaBean对象的属性(此属性必须有get和set方法)。setProperty指令中的value属性赋予指定属性的新值,getProperty指令会直接输出JavaBean对象的属性值。

这三个指令完全可以用jsp脚本替代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值