12.2.2 include指令
include指令用于JSP页面转换成Servlet时引入其他文件。该指令语法如下:
<%@ include file="relative url" %>
这里所指定的URL是和发出引用指令的JSP页面相对的URL,然而,与通常意义上的相对URL一样,你可以利用以“/”开始的URL告诉系统把URL视为从Web服务器根目录开始。包含文件的内容也是JSP代码,即包含文件可以包含静态HTML、脚本元素、JSP指令和动作。
例如,许多网站的每个页面都有一个小小的导航条。由于HTML框架存在不少问题,导航条往往用页面顶端或左边的一个表格制作,同一份HTML代码重复出现在整个网站的每个页面上。include指令是实现该功能的非常理想的方法。使用include指令,开发者不必再把导航HTML代码拷贝到每个文件中,从而可以更轻松地完成维护工作。
由于include指令是在JSP转换成Servlet的时候引入文件,因此如果导航条改变了,所有使用该导航条的JSP页面都必须重新转换成Servlet。如果导航条改动不频繁,而且你希望包含操作具有尽可能好的效率,使用include指令是最好的选择。然而,如果导航条改动非常频繁,你可以使用jsp:include动作。jsp:include动作在出现对JSP页面请求的时候才会引用指定的文件,请参见本文后面的具体说明。
12.3 实例:脚本元素和指令的应用
下面是一个使用JSP表达式、Scriptlet、声明、指令的简单例子。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>JavaServer Pages</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE">
JSP应用实例</TABLE>
</CENTER>
<P>
下面是一些利用各种JSP功能生成的动态内容:
<UL>
<LI><B>表达式.</B><BR>
你的主机名: <%= request.getRemoteHost() %>.
<LI><B>JSP Scriptlet.</B><BR>
<% out.println("查询字符串: " +
request.getQueryString()); %>
<LI><B>声明(和表达式).</B><BR>
<%! private int accessCount = 0; %>
服务器启动以来访问次数: <%= ++accessCount %>
<LI><B>指令(和表达式).</B><BR>
<%@ page import = "java.util.*" %>
当前日期: <%= new Date() %>
</UL>
</BODY>
</HTML>
12.4 JSP预定义变量
为了简化JSP表达式和Scriptlet的代码,JSP提供了8个预先定义的变量(或称为隐含对象)。这些变量是request、response、out、session、application、config、pageContext和page。
12.4.1 request
这是和请求关联的HttpServletRequest,通过它可以查看请求参数(调用getParameter),请求类型(GET,POST,HEAD,等),以及请求的HTTP头(Cookie,Referer,等)。严格说来,如果请求所用的是HTTP之外的其他协议,request可以是ServletRequest的子类(而不是HttpServletRequest),但在实践中几乎不会用到。
12.4.2 response
这是和应答关联的HttpServletResponse。注意,由于输出流(参见下面的out)是带缓冲的,因此,如果已经向客户端发送了输出内容,普通Servlet不允许再设置HTTP状态代码,但在JSP中却是合法的。
12.4.3 out
这是用来向客户端发送内容的PrintWriter。然而,为了让response对象更为实用,out是带缓存功能的PrintWriter,即JspWriter。JSP允许通过page指令的buffer属性调整缓存的大小,甚至允许关闭缓存。
out一般只在Scriptlet内使用,这是因为JSP表达式是自动发送到输出流的,很少需要显式地引用out。
12.4.4 session
这是和请求关联的HttpSession对象。前面我们已经介绍过会话的自动创建,我们知道,即使不存在session引用,这个对象也是自动绑定的。但有一个例外,这就是如果你用page指令的session属性关闭了会话,此时对session变量的引用将导致JSP页面转换成Servlet时出错。
12.4.5 application
这是一个ServletContext,也可以通过getServletConfig().getContext()获得。
12.4.6 config
这是当前页面的ServletConfig对象。
12.4.7 pageContext
主要用来管理页面的属性。
12.4.8 page
它是this的同义词,当前用处不大。它是为了Java不再是唯一的JSP编程语言而准备的占位符。