Page指令:
page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
JSP 2.0规范中定义的page指令的完整语法:<%@ page[ language="java" ][ extends="package.class" ][ import="{package.class |
package.*}, ..." ][ session="true | false" ][ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ][ isThreadSafe="true | false" ]
[ info="text" ][ errorPage="relative_url" ][ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ pageEncoding="characterSet|
ISO-8859-1" ][ isELIgnored="true | false" ]
%>
include指令
include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。
语法:<%@ include file="relativeURL"%>其中的file属性用于指定被引入文件的相对路径。
细节:被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素、JSP指令和JSP行为元素等普通JSP页面所具有的一切内容。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
在将JSP文件翻译成Servlet源文件时,JSP引擎将合并被引入的文件与当前JSP页面中的指令元素(设置pageEncoding属性的page指令除外),所以,除了import和pageEncoding属性之外,page指令的其他属性不能在这两个页面中有不同的设置值。
include指令(续)
细节:除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。
引入文件与被引入文件是在被JSP引擎翻译成Servlet的过程中进行合并,而不是先合并源文件后再对合并的结果进行翻译。当前JSP页面的源文件与被引入文件的源文件可以采用不同的字符集编码,即使在一个页面中使用page指令的pageEncoding或contentType属性指定了其源文件的字符集编码,在另外一个页面中还需要用page指令的pageEncoding或contentType属性指定其源文件所使用的字符集 。
Tomcat 5.x在访问JSP页面时,可以检测它所引入的其他文件是否发生了修改,如果发生了修改,则重新编译当前JSP页面
file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
假设myweb应用程序的根目录下有一个a.jsp文件,其一般的访问路径形式为:http://localhost:8080/myweb/a.jsp在a.jsp页面中使用了如下语句引入b.jspf文件:<%@ include file=“b.jspf”%>请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为什么?如果将a.jsp页面映射为如下地址:http://localhost:8080/myweb/dir1/a.html请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为:http://localhost:8080/myweb/b.jspf
out隐式对象
在JSP页面中应使用out隐式对象来向客户端发送文本形式的实体内容。
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
JSP页面中的out隐式对象相当于插入到ServletResponse.getWriter方法返回的PrintWriter对象前面的缓冲包装类对象。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性关闭了out对象的缓存功能写入到out对象中的内容充满了out对象的缓冲整个JSP页面结束
<jsp:include>标签:
<jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。
语法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
<jsp:include>标签与include指令的比较
<jsp:include>标签是在当前JSP页面的执行期间插入被引入资源的输出内容,当前JSP页面与被动态引入的资源是两个彼此独立的执行实体,被动态引入的资源必须是一个能独立被WEB容器调用和执行的资源。include指令只能引入遵循JSP格式的文件,被引入文件与当前JSP文件共同合并翻译成一个Servlet的源文件。
<jsp:include>标签的作用与运行原理类似RequestDispatcher.include方法,被引入页面不能改变响应状态码和设置响应头,与此相关的语句的执行结果将被忽略。include指令没有这方面的限制。
<jsp:include>标签的执行效率要比include指令稍微差一点,但它的灵活性却要好得多。
使用<jsp:include>标签和include指令都可以把一个页面的内容分成多个组件来生成,开发者不必再把页眉和页脚部分的相同HTML代码复制到每个JSP文件中,从而可以更轻松地完成维护工作,但是都应注意最终的输出结果内容应遵循HTML语法结构,例如,如果当前页面产生了<html>、</html>、<body>、</body>等标记,那么在被引入文件中就不能再输出<html>、</html>、<body>、</body>等标记。
<jsp:include>标签对JSP引擎翻译JSP页面的过程不起作用,它是在JSP页面的执行期间才被调用,因此不会影响两个页面的编译。由于include指令是在JSP引擎翻译JSP页面的过程中被解释处理的,所以它对JSP引擎翻译JSP页面的过程起作用,如果多个JSP页面中都要用到一些相同的声明,那么就可以把这些声明语句放在一个单独的文件中编写,然后在每个JSP页面中使用include指令将那个文件包含进来。因为include指令引入的文件被合并翻译到当前JSP页面中,向被引入的文件传递参数信息的做法根本就没有任何意义,它们将被JSP引擎忽略。而<jsp:include>标签可以传递参数信息和接受通过表达式动态产生的被引入资源的名称,所以,如果要用参数来控制引入的结果或动态生成引入的资源名,只能使用<jsp:include>标签。
<jsp:include>标签使用page属性指定被引入资源的相对路径,而include指令使用file属性指定被引入资源的相对路径。
假设myweb应用程序的根目录下有一个a.jsp文件,其一般的访问路径形式为:
http://localhost:8080/myweb/a.jsp
在a.jsp页面中使用了如下语句引入b.jsp文件:<jsp:include page="b.jsp" flush="true" />
请问:这时候JSP引擎调用的b.jsp文件的完整URL路径为什么?
如果将a.jsp页面映射为如下地址:http://localhost:8080/myweb/dir1/a.html
请问:这时候JSP引擎调用的b.jsp文件的完整URL路径为:http://localhost:8080/myweb/b.jspf
<jsp:forward>标签
<jsp:forward>标签用于把请求转发给另外一个资源。语法:<jsp:forward page="relativeURL | <%=expression%>" />page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
<jsp:param>标签
当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给的资源是一个能动态执行的程序时,例如Servlet和JSP页面,那么,还可以使用<jsp:param>标签向这个程序传递参数信息。
语法1:<jsp:include page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /></jsp:include>l语法2:<jsp:forward page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /></jsp:include><jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
<jsp:plugin>标签
<jsp:plugin>标签用来根据浏览器的类型,在当前JSP页面产生的网页文档内容中插入调用Java Applet的语句,即生成引用Java Applet的<OBJECT>或<EMBED>元素内容。
语法:<jsp:plugin type="bean | applet" code="classFileName" codebase="classFileDirectoryName"[ name="instanceName" ][ archive="URIToArchive, ..." ][ align="bottom | top | middle | left | right" ][ height="displayPixels" ][ width="displayPixels" ][ hspace="leftRightPixels" ][ vspace="topBottomPixels" ][ jreversion="JREVersionNumber" ][ nspluginurl="URLToPlugin" ][ iepluginurl="URLToPlugin" ] >[ <jsp:params><jsp:param name="parameterName" value="parameterValue | <%= expression %>" />…</jsp:params> ][ <jsp:fallback> text message for user </jsp:fallback> ]</jsp:plugin><Tomcat 5.x 的安装目录>\webapps\jsp-examples\plugin\plugin.jsp文件是一个使用<jsp:plugin>标签的例子程序,查看该jsp文件返回到浏览器中的HTML内容和该jsp文件所生成的Servlet源文件,有助于更好地理解<jsp:plugin>标签的作用。
脚本元素标签
<% code %>替代为<jsp:scriptlet> code </jsp:scriptlet><%! code %>替代为<jsp:declaration> code </jsp:declaration><%= expression %>替代为<jsp:expression> expression </jsp:expression>
指令标签
JSP 2.0规范中定义了<jsp:directive.directiveType>标签来替代<%@ directive … %>语句,以便采用XML的语法格式来定义JSP指令。语法格式:<jsp:directive.directiveType attribute="value" />举例:<%@ page import="java.util.*" %>替换为<jsp:directive.page import="java.util.*" /><%@ include file="b.jspf" %>替换为<jsp:directive.include file="b.jspf" />
<jsp:text>标签
JSP 2.0规范中定义了一个<jsp:text>标签,可以将JSP 页面中的模版内容封装在这个标签当中,嵌套在<jsp:text>标签中的内容将被作为模版内容输出给客户端。<jsp:text>标签中不能嵌套任何形式的子标签,如果输出给客户端的内容中包含有HTML标签或XML语法规定的特殊字符,应将这些内容封装在CDATA区中或用预定义实体替代特殊字符。