3.3 JSP指令元素

JSP的指令元素描述了JSP页面转换成JSP容器所能执行的Java代码的控制信息,如JSP页面所使用的语言、导入的Java类、网页的编码方式和指定错误处理页面等。JSP的指令元素独立于JSP页面接受的任何请求,且不产生任何页面输出信息。

指令元素的语法格式如下:

     <%@ 指令名 属性1="值1" 属性2="值2" …属性n="值n"%>

例如,用户常在每个JSP页头加上一个指定页面语言和编码方式的指令:

     <%@ page language="java" contentType="text/html; charset=gb2312"%>

JSP中包括page、include和taglib三种指令。

3.3.1 page指令

page指令用来定义JSP页面中的全局属性,它描述与页面相关的一些信息。page指令的位置一般在JSP页面的开头,放在其他位置也是可行的,在一个JSP页面中可以有多个page指令。其语法格式如下:

page指令语法中各属性的含义如下。

(1)language="java"

JSP中仅定义了一个language属性值Java,表示脚本的语法必须符合Java语法规范。该属性的默认值即为Java,所以可以不指定该属性。

(2)extends="package.class"

标明JSP编译时需要加入的Java Class的全名,但是得慎重使用,除非用户对Java非常熟悉,因为它会限制JSP的编译能力。

(3)import="{package.class | package.* },..."

import属性用于导入JSP页面中将要使用的Java类,一个import属性导入一个或多个Java类的定义,中间用逗号分隔,例如:

     <%@ page import="java.util.Vector, java.util.Calendar" %>

     <%@ page import="java.util.Vector" %>
     <%@ page import="java.util.Calendar " %>

另外有些Java类是默认导入的,不需要用户特别指定,例如:

     java.lang.*
     javax.servlet.*
     javax.servlet.jsp.*
     javax.servlet.http.*

(4)session="true | false"

设定客户是否需要HTTP Session,如果它为true,那么session是有用的;如果它为false,那么用户就不能使用session对象,以及定义scope=session的<jsp:useBean>元素。默认值是true。

例如:

     <%@ page session="false" %>
     <%= session.getId() %>

由于session被设置为false,无法使用session对象,因此该实例代码运行时将产生异常。

(5)buffer="none | 8kb | sizekb"

buffer的大小被out对象用于处理执行后的JSP对客户浏览器的输出,默认值是8KB。如果设置为none,则不使用缓冲区。

例如,设置页面缓冲区的大小为64KB:

     <%@ page  buffer="64kb" %>

禁用缓冲区:

     <%@ page  buffer="none" %>

(6)autoFlush="true | false"

设置如果buffer溢出,是否需要强制输出,如果其值被定义为true(默认值),输出正常;如果它被设置为false,这个buffer溢出就会导致一个意外错误的发生。如果用户把buffer设置为none,那么就不能把autoFlush设置为false。

(7)isThreadSafe="true | false"

设置JSP文件是否能多线程使用,默认值是true。也就是说,JSP能够同时处理多个用户的请求,如果设置为false,一个JSP一次只能处理一个请求。

(8)info="text"

一个文本在执行JSP时将会被逐字加入JSP中,能够使用Servlet.getServletInfo方法取回。使用方法如下:

     <%@ page info="要设置的字符串信息"%>

(9)errorPage="relativeURL"

设置处理异常事件的JSP文件。

(10)isErrorPage="true | false"

isErrorPage属性设置此JSP页面是否为错误处理页面,默认值为false。如果设置为true,则表明在该页面中可以获取异常对象exception,并通过该对象取得从发生错误的页面传出的错误信息,获取错误信息的常用方法如下:

     <%=exception.getMessage()%>

(11)contentType="mimeType [ ;charset=characterSet ]" | "text/html

contentType属性指定返回浏览器的内容类型,可用的属性值有text/plain(纯文本页面)、text/html(纯文本的HTML页面)、text/xml(XML页面)、applcation/x-msexcel(Excel文件)和application/msword(Word文件)等。contentType中可以同时指定返回页面中所使用的字符编码,如charset=gbk等。常用格式如下:

     <%@ page contentType="text/html; charset=gb2312"%>

注意

无论把<%@ page %>指令放在JSP文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及养成良好的编程习惯,最好还是把它放在JSP文件的顶部。

下面通过几个简单的实例来设置page指令。

【例3-8】中文编码示例(setCharset.jsp)。

contentType的设置对于JSP网页的中文显示有非常大的影响,JSP网页默认的编码方式并没有办法识别中文,因此用户会发现网页内容的中文部分将呈现乱码。想要正常显示中文,contentType属性的charset项目必须设置为GB2312。

     <html>
     <head>
     <title>演示page指令charset设置</title>
     </head>
     <body>
     <%
     out.println("Hello,欢迎使用JSP 2.x 技术 !! ");
     %>
     </body>
     </html>

在网页开始的地方并没有设置page指令,其执行结果如图3-9所示。

图3-9 setCharset.jsp执行结果

从浏览结果可以很明显地看出,标题栏和网页内容均呈现乱码。下面将上述page指令的设置程序片段<%@ page contentType="text/html; charset=gb2312"%>加入网页开始的地方。重新浏览网页,这时中文部分已经能正常显示,如图3-10所示。

图3-10 添加中文编码后的网页执行结果

contentType是网页最常使用的指令,为了正常显示中文,这个指令的设置是必要的。

【例3-9】setInfo.jsp简单示范info属性的设置方式。

程序代码设置info属性为说明字符串,再引用getServletInfo()方法,取得此说明字符串,并且将其输出到网页上,如图3-11所示。

图3-11 setInfo.jsp执行结果

【例3-10】出错页面pageError.jsp如何从error.jsp中获取发生的错误信息。

pageError.jsp程序中设置了出错处理页面为errorPage="error.jsp",在页面运行过程中一旦遇到异常,就自动跳转到error.jsp中处理异常。在error.jsp中利用isErrorPage="true"将其设置为错误页面,可以在该页面中处理捕捉到的异常。

pageError.jsp程序代码如下:

error.jsp代码如下:

由于IE浏览器在出现错误时会将默认的错误页面替代返回的错误页面,因此必须先在IE中将该功能屏蔽才能看到运行效果。打开IE浏览器,然后在IE中选择“工具”|“Internet选项”菜单命令,在弹出的“Internet选项”对话框中单击打开“高级”选项卡,如图3-12所示,取消选中“显示友好HTTP错误信息”复选框,然后单击“确定”按钮,完成设置,运行效果如图3-13所示。

图3-12 屏蔽IE默认错误页面的设置

图3-13 出现异常的返回页面

<%@ page %>指令作用于整个JSP页面,同样包括静态的包含文件。但是<%@ page %>指令不能作用于动态的包含文件,如<jsp:include>。

可以在一个页面中使用多个<%@ page %>指令,但是其中的属性只能用一次,不过也有例外,那就是import属性。因为import属性和Java中的import语句类似(import语句引入的是Java语言中的类),所以此属性就能多用几次。

3.3.2 include指令

JSP中的include指令用来包含一个静态的文件,在解析当前页面时,这个文件中的代码会被复制到当前页面中。其语法格式如下:

     <%@ include file="relative url" %>

其中,file="filename"这个被包含文件的路径名一般来说是指相对路径,不需要什么端口、协议和域名,例如"conn.jsp"、"/beans/calendar.jsp"等。如果路径是以文件名或目录名开头,那么这个路径就是正在使用的JSP文件的当前路径;如果这个路径以“/”开头,那么这个路径主要是参照JSP应用的上下关系路径。

<%@ include %>指令将会在JSP程序代码被编译时,插入一个包含文本或者源代码的文件一起进行编译。使用<%@ include %>指令语句去包含某个文本或程序代码文件的过程是静态的,静态包含的具体含义是指这个被包含的文件将会被完整地插入到原来的主JSP文件中去,这个由主JSP文件包含的文件可以是JSP文件、HTML文件、文本文件或者是一段Java代码等。如果<%@ include %>指令包含的文件是JSP文件,则该JSP文件将会被主JSP文件一起编译执行。

include指令将会在JSP编译时插入一个文件,而这个包含过程是静态的。所谓静态的是指file属性值不能是一个变量。例如,下面为file属性赋值的方式是不合法的。

     <%String url="header.htmlf";%>
     <%@include file="<%=url%>"%>

也不可以在file所指定的文件后添加任何参数,下面这行代码也是不合法的。

     <%@ include file="query.jsp?name=browser"%>

如果只是用include来包含一个静态文件,那么这个包含的文件所执行的结果将会插入到JSP文件中放<% @ include %>的地方。一旦包含文件被执行,那么主JSP文件的过程将会被恢复,继续执行下一行。但是要注意,在这个包含文件中不能使用<html>、</html>、<body>、</body>标记,因为这将会影响在原JSP文件中同样的标记,有时会导致错误。

一旦引用了include指令,加载的外部文件内容将成为当前网页的一部分。下面示范include指令操作。使用include指令有一点必须特别注意:当文件的内容包含中文时,Tomcat会显示为乱码;在外部文件中加入page指令,即可将中文正确显示出来。

【例3-11】文件include.jsp中静态包含了4个文件:HTML文件include_html.html、文本文件include_txt.txt、JSP文件include_jsp.jsp、JSP代码include_code.cod。执行结果如图3-14所示。

图3-14 include.jsp中静态包含了4个文件的执行结果

include.jsp代码如下:

     <%@ page contentType="text/html; charset=gb2312" language="java"%>
     <html>
     <head>
     <title>Include指令示例</title>
     </head>
     <body>
     <p>插入HTML文件:<%@ include file="include_html.html"%>
     <p>插入文本文件:<%@ include file="include_txt.txt"%>
     <p>插入JSP文件,显示现在的日期时间:<%@include file="include_jsp.jsp"%>
     <p>插入JSP代码:<%@ include file="include_code.cod"%>
     </body>
     </html>

include_html.html代码如下:

     <%@ page contentType="text/html; charset=gb2312" %>
     <font color=blue size=4>
     这是插入的HTML文件
     </font>

include_txt.txt代码如下:

     <%@ page contentType="text/html; charset=gb2312" %>
     <%="这是插入的文本文件"%>

include_jsp.jsp代码如下:

     <%@ page contentType="text/html; charset=gb2312"%>
     <%@ page import="java.util.*"%>
     <%=new Date().toString()%>
     <%="这是插入的JSP文件的内容"%>

include_code.code代码如下:

     <%@ page contentType="text/html; charset=gb2312" %>
     <% String s="这是插入执行代码的内容";
        out.print(s);
     %>

include指令只能加载指定的外部文件,而且不能进行传递参数操作,后面将要说明action element有一个与此类似的指令,可以突破这些限制。如果外部文件只包含单纯的静态内容,使用include指令是理所当然的选择。include指令将会在JSP编译时插入被包含文件的内容,被包含的文件内容常常是代码片段,因此代码片段的扩展名最好以f(fragment的第一个字母)结尾,例如,.htmlf、.jspf等。这么做的好处是避免JSP编辑器对该文件内容进行语法检查。

【例3-12】文件static_include.jsp中静态包含了两个文件:header.htmlf和footer.jspf。执行结果如图3-15所示。

图3-15 static_include.jsp中静态包含了2个文件的执行结果

static_include.jsp代码如下:

     <%@ page contentType="text/html; charset=GBK" %>
     <%@ page import="java.util.Calendar" %>
     <%@ page import="java.text.SimpleDateFormat" %>
     <%@ include file="template/header.htmlf" %>
     <h3>本页面使用include指令,导入了header.htmlf和footer.jspf</h3>
     <%@ include file="template/footer.jspf" %>

header.htmlf代码如下:

     <%@ page contentType="text/html; charset=GBK" %>
     <html>
     <head>
     <title>
     Include指令示例
     </title>
     </head>
     <body>
     <hr>

footer.jspf代码如下:

     <%@ page contentType="text/html; charset=GBK" %>
     <hr>
     <%
     Calendar cal  = Calendar.getInstance();
     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
     %>
     <P align=center>今天:<%=formatter.format(cal.getTime())%>
     <hr>
     </body>
     </html>

使用include指令可以把一个复杂的JSP页面分成若干简单的部分,这样大大增加了JSP页面的管理性。当要对页面进行更改时,只需要更改对应的部分就可以。

3.3.3 taglib指令

taglib指令用来定义一个标签库及其自定义标签的前缀,其语法格式如下:

     <%@ taglib uri=" tagLibraryURI" prefix=" tagPrefix" %>

其中,属性uri(Uniform Resource Identifier,统一资源标识符)用来唯一地确定标签库的路径,并告诉JSP引擎在编译JSP程序时如何处理指定标签库中的标签;属性prefix定义了一个指示使用此标签库的前缀。例如:

     <%@ taglib uri="http://www.jspcentral.com/tags" prefix="public" %>
     <public:loop>
     …
     </public:loop>

在上边的代码中,uri=http://www.jspcentral.com/tags说明了使用的标签库所在的路径,<public:loop>说明了要使用public标签库中的loop标签,如果这里不写public,就是不合法的。定义标签时,不能使用jsp、jspx、java、javax、servlet、sun和sunw作为前缀,这些前缀是JSP保留的。在使用自定义标签之前必须使用<% @ taglib %>指令,并且可以在一个页面中多次使用,但是前缀只能使用一次。