从零开始学Java Web开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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用户自定义标签的强大功能。