4.4 JSP中的编译指令
JSP编译指令是用来设置与JSP页面编译相关的属性,通过它JSP页面可以向服务器发送命令,按照它的意图指导服务器执行动作,它不直接产生任何可视的输出,只是指示服务器对JSP页面需要做什么。而且所有的指令都只在当前的JSP页面中有效。
JSP编译指令的使用格式如下:
<%@ directive {attr=”value”} %>
在JSP中包含以下3种指令。
❑ page指令:<%@ page %>。
❑ include指令:<%@ include %>。
❑ taglib指令:<%@ taglib %>。
4.4.1 page指令
page指令用来定义JSP页面的全局属性,它描述了例如,指定页面所使用的脚本语言、页面中引入的包等与页面相关的一些指示信息。它的作用域是它所在的JSP页面及该页面所包含的文件。page指令以“<%@page”为起始标记,以“%>”为结束标记。
page指令可以在一个JSP文件中多次、多处使用,但是其中的属性却只能使用一次(import属性例外),重复的属性设置将会覆盖掉先前的设置。无论用户把page指令放在JSP程序文件中的哪个地方,它的作用范围都是覆盖整个JSP页面。不过,为了养成一个良好的编程习惯,也为了JSP程序的可读性,建议最好还是把它放在JSP程序文件的顶部。
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="relativeURL" ] [ contentType="mimeType [;charset=characterSet]"|"text/html;charset=encodeType" ] [ isErrorpage="true | false" ] %>
语法格式中方括号的内容是page指令的属性和属性值,这些属性都是可选的,它们描述了与页面相关的指示信息。
❑ language="java"。language属性告诉服务器在JSP页面中将采用哪种语言,在JSP当前的规范中,Java是JSP唯一支持的语言,因此该属性一般情况下省略不写。
❑ extends="package.class"。JSP文件编译后的结果是一个Java类,所以一个JSP文件可以继承其他的Java类。这个属性标明JSP编译时需要继承的Java类的完整类名,但是继承父类的同时也会限制JSP的编译能力。因此,实际开发中往往忽略这个属性。
❑ import="{ package.class | package.* },……"。表示需要导入的Java包的列表,这些包的作用域与page指令的作用域相同。当在JSP页面中导入多个Java包时,多个Java包需要用逗号隔开,此外,还可以在多个page指令中分别导入Java包。例如:
<%@ page import=” java.util.* ,java.sql.*” %>
与下面的代码实现的功能是一样的
<%@ page import=” java.util.*” %> <%@ page import=” java.sql.*” %>
说明
java.lang.*、javax.servlet. *、javax.servlet.jsp. *和javax.servlet.http. *这4个包已经默认在程序编译时被导入,所以不用再次显式地声明了。
❑ session="true | false"。该属性决定当前JSP文件是否需要管理用户的会话级信息,这些信息可能来自多个网页。属性值的设定取决于客户是否需要HTTP Session。如果为true,则启用Session,同时还可以在<jsp:useBean>元素中定义scope=session,否则不能使用。该属性值默认为true。
❑ buffer="none | 8Kb | sizekb"。buffer的大小以千字节为单位,它是out内置对象处理JSP页面后在客户端浏览器输出时使用的缓冲区。定义的值不小于8KB。Buffer的默认值为8KB。
❑ autoFlush="true | false"。设置对buffer溢出时的处理方式。如果为false,一旦溢出将导致一个意外错误的发生。而且,如果用户把buffer设置为none,那么就不能把autoFlush设置为false。此属性默认设置为true。
❑ isThreadSafe="true | false"。设置JSP文件是否能使用多线程。如果为true,JSP能同时处理多个客户的请求;如果设置为false,JSP一次就只能处理一个客户请求。
❑ info="text"。设置一个插入到JSP页面中的文本。可以使用servlet.getServletInfo()方法重新得到这个文本。默认则忽略。
❑ errorpage="relativeURL"。设置用于处理异常事件的JSP页面。设置该项后,当运行JSP页面出错时JSP引擎会将页面转向处理异常事件的页面。
❑ contentType="mimeType[ ;charset=characterSet]" | "text/htm l ;charset=encodeType"。该属性负责定义JSP字符的编码和JSP页面响应的MIME类型。其中contentType参数指定http响应的头部的Content-Type的值。客户端的浏览器会根据page指令中的contentType属性所指定的MIME类型设置来显示JSP页面的输出内容。JSP默认的MIME类型是text/html。charset参数是可选的,它指定了JSP字符的编码类型。客户端的浏览器会根据page指令中的charset属性所指定的字符编码类型,采用相应的字符集来显示JSP网页的输出字符。JSP默认的charset类型是ISO-8859-1。表4.5中列出了一些常见的charset字符集类型。
表4.5 常见的charset字符集类型
说明
不同的国家和地区都制定了各自的编码方式,常用的汉字编码方式有如下几种:GB2312码,中华人民共和国标准汉字信息交换用编码,简称国标码,是16位编码;GBK码,它是对GB2312的扩展,包含GB2312的字符集;BIG5码,是台湾地区采用的繁体中文的编码方式。
❑ isErrorpage="true | false"。该属性表明当前页是否作为其他JSP页面的出错页面的URL目标。如果作为其他页面的出错页面的URL目标,则将isErrorpage设为true,否则设为false。该属性的默认值为false。
【实例4-3】处理错误页。
01 <%@ page language="java" errorPage="error.jsp" contentType="text/html;charset=GBK"%> 02 <% 03 int dividend=0; //声明被除数变量 04 int divisor=0; //声明除数变量 05 int result=0; //声明除法运算结果变量 06 try { 07 result=dividend/divisor; //执行除数运算 08 } 09 catch(ArithmeticException zz) { 10 throw new ArithmeticException( "除数不能为零!" );//抛出异常 11 } 12 %>
【代码说明】在实例4-3页面中的第7行定义了除法操作,由于定义的除数divisor为零,因此该页面在执行时将抛出异常,导致页面无法正常显示。但是在该页面第1行的page指令中设置了errorpage属性,因此JSP引擎会将页面转向处理异常事件的error.jsp页面。
error.jsp页面的具体代码如下:
01 <%@page language="java"isErrorPage="true"contentType="text/html;charset=GBK"%> 02 当前页面是出错页面:error.jsp<br> 03 <%out.print(exception.toString()); //显示捕获的异常对象信息%>
图4.33 显示出错页面
【代码说明】该页面中第1 行的page指令中设置了isErrorpage属性为ture,表示该页面可以充当其他页面的出错页。
【运行结果】打开浏览器在其中输入进行除法运算的页面的URL地址后,将显示如图4.33所示的访问页面。
说明
图4.33所示的浏览器中的地址栏里的页面和浏览中显示的页面是不同的,这是因为跳转到出错页时,浏览器中的URL地址是不会随同发生改变的。
4.4.2 include指令
include指令用来在JSP文件中插入一个包含文本和代码的文件。被包含的文件可以是JSP文件、HTML文件或文本文件。如果被包含的文件是JSP文件,则当JSP引擎编译时,就要将被包含的JSP文件插入到include指令所在的位置一起编译。如果被包含的文件是HTML文件或文本文件,则JSP引擎不对其进行编译,直接将其内容插入到include指令所在的位置。这种包含是静态包含,即包含和被包含的JSP文件被JSP引擎一起编译。假如被包含的文件发生变化,那么包含的JSP页面将被重新编译。
include指令的语法格式如下:
<%@ include file="relativeURL" %>
include指令只有一个属性file,用来指定所要包含的文件的相对路径。如果路径直接以文件名开头,则指的是当前正在使用的JSP文件所在的路径;如果路径以“/”开头,则要参照正在使用的JSP文件的上下文路径。
include指令具体示例代码如下;
<%@ include file="helloworld.jsp" %> <%@ include file="name.html" %> <%@ include file="/chap04/test.txt" %>
上述示例代码中的“file="/chap04/test.txt "”表明所要包含的文件test.txt在当前使用的JSP文件同级路径中的chap04目录中。
说明
在使用该指令时需要注意,被包含的JSP文件中不能含有page指令。因为被包含的文件的全部内容将被插入到JSP文件中include指令所在的地方,将会同JSP文件中已有的同样的指令发生冲突。
【实例4-4】include指令的应用。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <html> 03 <body> 04 include编译指令测试<br> 05 <%@ include file="include.jsp"%> <%-- 使用include指令包含include.jsp页面--%> 06 </body> 07 </html>
【代码说明】在实例4-4页面的第5行中使用include指令包含JSP页面include.jsp。
include.jsp页面的具体代码如下:
01 <%@ page contentType="text/html;charset=ISO-8859-1"%> 02 <%! String str=" Here is include’s context!"; //声明要显示在页面中的字符串对象%> 03 <% out.println(str+"<br>"); //将字符串显示在页面中%>
【代码说明】在该页面的第1行中使用了page指令,这样当该页面被包含到另一个JSP页面中时,在包含页面中就会出现两个page指令,这将违反page指令的使用规则。
【运行结果】运行实例4-4的JSP页面将显示如图4.34所示的出错信息。如果将include.jsp页面中的page指令去掉,再运行实例4-4的JSP页面显示如图4.35所示的运行结果。
图4.34 显示page指令重复错误
图4.35 使用include指令包含JSP页面
4.4.3 taglib指令
taglib指令是当JSP页面中引用了用户自定义标签时,用来声明这些用户自定义的标签的。该指令指定标签的前缀,同时也为标签库命名。JSP引擎使用taglib指令以确定在JSP中遇到用户自定义标签时要怎样去做。
taglib指令的语法形式如下:
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
其属性说明如下。
❑ uri属性:一个URI(Uniform Resource Identifier,统一资源标识符)标识标签库描述符。该标签库描述符用来唯一地确定标签库的名字,并告诉JSP引擎在编译JSP页面时如何处理指定标签库中的标签。
❑ prefix属性:定义标签中的前缀字符串。
JSP中的标签是一个经常使用的技术,这里只是简单地介绍了一下taglib指令的格式,该指令的具体使用将在本书的第10章中详细介绍,到时读者将会体会到JSP用户自定义标签的强大功能。