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

    xiaoxiao2021-03-26  39

    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脚本替代。

    转载请注明原文地址: https://ju.6miu.com/read-658605.html

    最新回复(0)