jsp中page指令用法详解
本文实例讲述了jsp中page指令用法。分享给大家供大家参考。具体如下:
一、JSP指令
JSP指令(directive)影响由JSP页面生成的servlet的整体结构。下面的模板给出指令的两种可能形式。属性值两边的双引号可以替换为单引号,但引号标记不能完全省略。如果要在属性值中使用引号,则要在它们之前添加反斜杠,'使用\',"使用\"
<%directiveattribute="value"%> <%directiveattribute1="value1" attribute2="value2" ...... attribute3="value3"%>
在JSP中,主要有3种类型的指令:page,include和taglib。page指令允许通过类的导入、servlet超类的定制、内容类型的设置、以及诸如此类的事物来控制servlet的结构。page指令可以放在文档中的任何地方。第二个指令,include允许在JSP文件转换到servlet时,将一个文件插入到JSP页面中。include指令应该放置在文档中希望插入文件的地方。第三个指令,taglib,定义自定义的标记标签。
二、JSPpage指令
page指令可以定义下面这些大小写敏感的属性(大致按照使用的频率列出):import、contentType、pageEncoding、session、isELIgnored(只限JSP2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language和extends。
2.1import属性
使用page指令的import属性指定JSP页面转换成的servlet应该输入的包。在JSP中,包是绝对必需的。原因是,如果没有使用包,系统则认为所引用的类与当前类在同一个包中。例如,假定一个JSP页面包含下面的scriptlet:
<%Testt=newTest();%>
在此,如果Test在某个输入包中,则没有歧义。但是,如果Test不在包中,或者页面没有明确地导入Test所属的包,那么系统将会认为Test就在这个自动生成的servlet所在的包中。但问题是自动生成的servlet所在的包是未知的!服务器在创建servlet时,常常会根据JSP页面所在的目录来决定它的包。别的服务器可能使用其他不同的方式。因此,不能指望不使用包的类能够正常工作。对于bean也同样如此,因为bean不过是遵循某些简单命名约定和结构约定的类。
默认情况下,servlet导入java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*,也许还包括一些服务器特有的包。编写JSP代码时,绝不要依靠任何自动导入的服务器特有类。这样做会使得代码不可移植。
使用import属性时,可以采用下面两种形式:
<%@pageimport="package.class"%> <%@pageimport="package.class1,...,package.classN"%>
例如,下面的指令表示java.util包和cn.foololdfat包中的所有类在使用时无需给出明确的包标识符:
<%@pageimport="java.uti1.*,cn.foololdfat.*"%>
import是page的属性中惟一允许在同一文档中多次出现的属性。尽管page指令可以出现在文档中的任何地方,但一般不是将import语句放在文档顶部附近,就是放在相应的包首次使用之前。
2.2contentType和pageEncoding属性
contentType属性设置Content-Type响应报头,标明即将发送到客户程序的文档的MIME类型。有关MIME类型的更多信息,参见JavaWeb开发(5)HTTP响应报头。
使用contentType属性时,可以采用下面两种形式:
<%@pagecontentType="MIME-TYPE"%> <%@pagecontentType="MIME-Type;charset=Character-Set"%>
例如,指令
<%@pagecontentType="application/vnd.ms-excel"%>
和下面的scriptlet所起到的作用基木相同
<%responce.setContentType("application/vnd.ms-excel");%>
两种形式的第一点不同是,response.setContentType使用明确的Java代码(这是一些开发人员力图避免使用的方式),而page指令只用到JSP语法。第二点不同是,指令被特殊处理,它们不是在出现的位置直接成为_jspService代码。这意味着response.setContentType能够有条件地调用,而page指令不能。条件性地设置内容的类型主要用在同一内容能够以多种不同的形式进行显示的情况下。
不同于常规servlet(默认的MIME类型为text/plain),JSP页面的默认MIME类型是text/html(默认字符集为ISO-8859-1)。因此,如果JSP页曲以Latin字符集输出HTML则根本无需使用contentType,如果希望同时更改内容的类型和字符集,可以使用下面的语句:
<%@pagecontentType="someMimeType;charset=someCharacterSet"%>
但是,如果只想更改字符集,使用pageEncoding属性更为简单。例如,中文JSP页面可以使用下面的语句:
<%@pagepageEncoding="GBK"%>
可考虑将JavaWeb开发(5)HTTP响应报头中生成Excel表格的例子用JSP实现,以体会contentType的作用。
2.3session属性
session属性控制页面是否参与HTTP会话。使用这个属性时,可以采用下面两种形式:
<%@pagesession="true"%><%--Default--%> <%@pagesession="false"%>
true值(默认)表示,如果存在已有会话,则预定义变量session(类型为HttpSession)应该绑定到现有的会话;否则,创建新的会话并将其绑定到session。false值表示不自动创建会话,在JSP页面转换成servlet时,对变量session的访问会导致错误。
对于高流量的网站,使用session="false"可以节省大量的服务器内存。但要注意,session="false"并不禁用会话跟踪,它只是阻止JSP页面为那些尚不拥有会话的用户创建新的会话。由于会话是针对用户,不是针对贞面,所以,关闭某个页面的会话跟踪没有任何益处,除非有可能在同一客户会话中访问到的相关页面都关闭会话跟踪。
2.4isELIgnored属性
isELIgnored属性控制的是:忽略(true)JSP2.0表达式语言(EL),还是进行正常的求值(false)。这是JSP2.0新引入的属性;在只支持JSP1.2及早期版本的服务器中,使用这项属性是不合法的。这个属性的默认值依赖于Web应用所使用的web.xml的版本。如果web.xml指定servlet2.3(对应JSP1.2)或更早版本,默认值为true(但变更默认值依旧是合法的,JSP2.0兼容的服务器中都允许使用这项属性,不管web.xml的版本如何)。如果web.xml指定servlet2.4(对应JSP2.0)或之后的版本,那么默认值为false。使用这个属性时,可以采用下面两种形式:
<%@pageisELIgnored="false"%> <%@pageisELIgnored="true"%>
2.5buffer和autoFlush属性
buffer属性指定out变量(类型为JspWriter)使用的缓冲区的大小。使用这个属性时,可以采用下面两种形式:
<%@pagebuffer="sizekb"%> <%@pagebuffer="none"%>
服务器实际使用的缓冲区可能比指定的更大,但不会小于指定的大小。例如,<%@pagebuffer="32kb"%>表示应该对文档的内容进行缓存,除非累积至少为32KB、页面完成或明确地对输出执行清空(例如使用response.flushBuffer),否则不将文档发送给客户。
默认的缓冲区大小与服务器相关,但至少8KB。如果要将缓冲功能关闭,应该十分小心:这样做要求设置报头或状态代码的JSP元素都要出现在文件的顶部,位于任何HTML内容之前。另一方面,有时输出内容的每一行都需要较长的生成时间,此时禁用缓冲或使用小缓冲区会更有效率;这样,用户能够在每一行生成之后立即看到它们,而不是等待更长的时间看到成组的行。
autoFlush属性控制当缓冲区充满之后,是应该自动清空输出缓冲区(默认),还是在缓冲区溢出后抛出一个异常(autoFlush="false")。使用这个属性时,可以采用下面两种形式:
<%@pageautoFlush="true"%><%--Default--%> <%@pageautoFlush="false"%>
在buffer="none"时,false值是不合法的。如果客户程序是常规的Web浏览器,那么autoFlush="false"的使用极为罕见。但是,如果客户程序是定制应用程序,可能希望确保应用程序要么接收到完整的消息,要么根本没有消息。false值还可以用来捕获产生过多数据的数据库查询,但是,一般说来,将这些逻辑放在数据访问代码中(而非表示代码)要更好一些。
2.6info属性
info属性定义一个可以在servlet中通过getServletInfo方法获取的字符串,使用info属性时,采用下面的形式:
<%@pageinfo="SomeMessage"%>
2.7errorPage和isErrorPage属性
errorPage属性用来指定一个JSP页面,由该页面来处理当前页面中抛出但未被捕获的任何异常(即类型为Throwable的对象)。它的应用方式如下:
<%@pageerrorPaqe="RelativeURL"%>
指定的错误页面可以通过exception变量访问抛出的异常。
isErrorPage属性表示当前页是否可以作为其他JSP页面的错误页面。使用isErrorPage属性时,可以采用下面两种形式:
<%@pageisErrorPage="true"%> <%@pageisErrorPage="false"%><%--Default--%>
2.8isThreadSafe属性
isThreadSafe属性控制由JSP页面生成的servlet是允许并行访问(默认),还是同一时间不允许多个请求访问单个servlet实例(isThreadSafe="false")。使用isThreadSafe属性时,可以采用下面两种形式:
<%@pageisThreadSafe="true"%><%--Default--%> <%@pageisThreadSafe="false"%>
遗憾的是,阻止并发访问的标准机制是实现SingleThreadModel接口。尽管在早期推荐使用SingleThreadModel和isThreadSafe="false",但最近的经验表明SingleThreadModel的设计很差,使得它基本土毫无用处。因而,应该避免使用isThreadSafe,采用显式的同步措施取而代之。
2.9extends属性
extends属性指定JSP页面所生成的servlet的超类(superclass)。它采用下面的形式:
<%@pageextends="package.class"%>
这个属性一般为开发人员或提供商保留,由他们对页面的运作方式做出根本性的改变(如添加个性化特性)。一般人应该避免使用这个属性,除非引用由服务器提供商专为这种目的提供的类。
2.10language属性
从某种角度讲,language属性的作用是指定页面使用的脚本语言,如下所示:
<%@pagelanguage="java"%>
就现在来说,由于Java既是默认选择,也是惟一合法的选择,所以没必要再去关心这个属性。
希望本文所述对大家的JSP程序设计有所帮助。