6.3.2 page指令
page指令用于设置JSP页面的各种属性。大多数的JSP页面中都包含page指令。虽然page指令可以出现在JSP页面的任何位置,但最好将page指令放到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" ] [ isErrorPage="true| false" ]
[ contentType="{mimeType [ ; charset=characterSet ] | text/html ; charset=ISO-8859-1}" ]
[ pageEncoding="{characterSet | ISO-8859-1}" ]
[ isELIgnored="true | false" ]
%>
上面定义中的每对方括号“[]”分别表示page指令的一个属性。属性值中用坚杠(|)分隔的不同部分为该属性可以设置的值,如session属性可以设置为true或false。属性值中黑体部分为该属性的默认值。在这些属性中,import属性是唯一允许出现多次的属性。下面是对page指令的所有属性的详细描述。
1. language属性
language属性用来设置JSP页面所使用的开发语言(也就是在<% ... %>和<%= ... %>中所使用的语言)。由于目前JSP只支持Java,因此,language属性的值只能为java,而且这个值也是language属性的默认值。因此,可以不指定该属性。
2. extends属性
extends属性设置了由JSP生成的Servlet类的父类。一般不需要设置这个属性。如果在某些特殊情况下非要设置这个属性,应该注意设置后可能会对JSP造成的影响。
3. import属性
import属性指定在JSP页面被翻译成Servlet源代码后要导入的包或类。也就是翻译成Java中的import语句。在page指令中可以有多个import属性,如下面的page指令所示:
<%@ page import="java.util.*" import = "java.text.SimpleDateFormat" %>
上面的page指令将被翻译成如下的Java代码:
import java.util.*;
import java.text.SimpleDateFormat;
在page指令中不仅可以有多个import 属性,还可以在一个import属性中使用逗号(,)分割不同的包或类。如上面的page指令也可以写成如下的形式:
<%@ page import="java.util.*, java.text.SimpleDateFormat"s %>
4. session属性
session属性用于指定在JSP页面中是否可以使用内置session对象。session属性的默认值为true。也就是说,JSP在默认的情况下会自动创建HttpSession对象。
在JSP页面被翻译成Servlet类时,会自动在Servlet类的_jspService方法中添加相应的语句来创建一个HttpSession对象。下面是_jspService方法中创建HttpSession对象的代码片段:
... ...
HttpSession session = null; // 在JSP中使用的session就是这个HttpSession对象
... ...
pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
... ...
session = pageContext.getSession();
... ...
要注意的是,getPageContext方法的第5个参数的值实际上就是session属性的值,也就是说,当session的值为true时,不仅会在_jspService方法中定义一个HttpSession对象,而且getPageContext方法的第5个参数值为true。如果session属性值为false,则getPageContext方法的第5个参数值为false,而且也不会生成定义和创建HttpSession对象的代码。
当session属性值为false时,在JSP页面中调用PageContext类的getSession方法并不会抛出异常,而是返回null。如下面的JSP代码所示:
<%@ page session="false" contentType="text/html" %>
<%
HttpSession newSession = pageContext.getSession(); // newSession为null
System.out.println(newSession); // 在控制台中输出null
%>
如果当客户端访问一个JSP页面时,而这个JSP页面又不需要对这个客户端进行跟踪。那么这个JSP页面就会白白为该客户端创建一个HttpSession对象。当这样的客户端非常多时,服务器就会存在大量无用的HttpSession对象。因此,如果某个JSP页面不需要对客户端进行跟踪时,最好将session属性的值设为false,以避免过多地创建HttpSession对象。
5. buffer属性
buffer属性用于设置JSP中out对象的缓冲区大小,默认值是8kb。如果将buffer设为none,out对象则不使用缓冲区。还可以通过这个属性来自定义out对象的缓冲区的大小。但单位必须是kb,也就是说,buffer属性的值的最后两个字母必须是kb,而且必须是非负整数。如10kb,120kb等。将buffer属性的值设为0kb的效果和设为none是一样的。
实际上,在JSP页面被翻译成Servlet类时,JSP引擎会自动将buffer属性的值翻译成getPageContext方法的第6个参数。如下面代码如示:
pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
6. autoFlush属性
autoFlush属性用于设置当out对象的缓冲区已满时如何处理缓冲区中的内容,如果autoFlush属性的值为true,则当out对象的缓冲区已满时直接将缓冲区中的内容刷新到客户端。如果autoFlush属性的值为false,则对于已满的缓冲区,系统会抛出缓冲区溢出的异常。该属性其默认值为true。如果buffer属性的值为none或0kb,autoFlush属性的值不能为false。因为将buffer属性的值设为none或0kb,表明未使用缓冲区,也就相当于缓冲区永远是满的。这时将autoFlush属性值设为false,JSP引擎会在编译JSP页面时会产生一个内部编译错误。
autoFlush属性的值实际上就是getPageContext方法的最后一个参数,代码如下:
pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
7. isThreadSafe属性
isThreadSafe属性用于设置JSP页面是否是线程安全的,该属性的默认值是true。当isThreadSafe属性值为true时,说明当前的JSP页面在设计时已经考虑到了线程安全(如全局共享的资源已经同步),并不需要Servlet引擎再来考虑这些问题了。当isThreadSafe属性为false时,由JSP页面翻译成的Servlet类会实现SingleThreadModel接口,也就是说,线程完全将由Servlet引擎来负责。
8. info属性
info属性用于定义一个描述当前JSP页面的字符串信息。在翻译JSP页面时,info属性值被翻译成getServletInfo方法的返回值。看下面的JSP代码:
<%@ page info ="输出info属性的值" contentType="text/html" pageEncoding="UTF-8"%>
上面的JSP代码中的info属性将被翻译成getServletInfo方法的返回值,代码如下:
... ...
public final class info_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent
{
// info属性值实际上是getServletInfo方法的返回值
public String getServletInfo()
{
return "输出info属性的值";
}
... ...
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException
{
... ...
}
... ...
}
在JSP页面中可以通过如下的代码来输出info属性的值:
info属性的值:<%= getServletInfo() %>
9. errorPage属性
errorPage属性用于指定处理当前JSP页面抛出的异常的页面。如果JSP页面抛出了未被捕获的异常,就会自动跳转到errorPage属性所指的页面。errorPage属性的值必须是相对路径。如果以“/”开头,表示相对于当前Web应用程序的根目录,否则,表示相对于当前JSP页面所在的目录。errorPage属性实际上对应了由JSP页面生成的Servlet类中的getPageContext方法的第4个参数。如下面代码所示:
pageContext = _jspxFactory.getPageContext(this, request, response, "error.jsp", true, 1024, true);
要注意的是,errorPage属性的值可以是JSP页面,也可以是静态的页面(如html、图象文件等)。
10.isErrorPage属性
isErrorPage属性指定当前JSP页面是否可用于处理其他JSP页面未捕获的异常。该属性的默认值为false。errorPage属性所指的异常处理JSP页面必须将isErrorPage属性设为true。否则,无法在异常处理页中使用exception对象。关于JSP页面异常的处理将在6.3.3节详细讲解。
11. contentType属性
contentType属性用于设置响应消息头的Content-Type字段,该字段设置了响应正文的MIME类型和JSP页面中文本内容的字符集编码。contentType属性的默认MIME类型是text/html,默认字符集是ISO-8859-1。对于简体中文来说,可以将contentType属性设为如下两个值中的任何一个:
<%@ page errorPage="error.jsp" contentType="text/html; charset=GBK"%>
<%@ page errorPage="error.jsp" contentType="text/html; charset=UTF-8"%>
12. pageEncoding属性
pageEncoding属性用于指定JSP页面中文本内容的字符集编码格式。如果指定了pageEncoding属性,contentType属性中的charset就不再表示JSP页面的字符集编码了。如果contentType属性中未指定字符集编码格式(也就是没有charset),pageEncoding属性同时还具有设置Content-Type字段中的字符集编码的作用(相当于设置了contentType属性的charset)。
13. isELIgnored属性
isELIgnored属性用于设置JSP页面是否支持EL(表达式语言,Expression Language)。如果Web应用程序是遵循Servlet2.3或更低版本,isELIgnored属性的默认值为true(表示JSP页面在默认情况下不支持EL),如果遵循Servlet2.4或更高版本,isELIgnored属性的默认值为false(表示JSP页面在默认情况下支持EL)。