在JSP页面的转换阶段,容器在_jspService()方法中申明并初始化一些变量,可以在JSP页面小脚本中或表达式中直接使用这些变量。
一、JSP页面中可使用的隐含变量
1、applicationjavax.servlet.ServletContext接口引用WEB应用程序的上下文
2、sessionjavax.servlet.http.HttpSession接口引用用户会话
3、requestjavax.servlet.http.HttpServletRequest接口引用页面的当前请求对象
4、responsejavax.servlet.http.HttpServletResponse接口引用向客户发送的一个响应
5、outjavax.servlet.jsp.JspWriter类引用页面输出流
6、pagejava.lang.Object类引用页面的Servlet实例
7、pageContextjavax.servlet.jsp.PageContext类引用页面上下文
8、configjavax.servlet.Servletconfig接口引用Servlet的配置对象
9、exceptionjava.lang.Throwable类用来处理错误
下面的是JSP页面转换成Servlet中的部内容:
...
public void _jspService(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
...其他代码
PageContext pageContext = null;
HttpSession session = null;
ServletContext application= null;
ServletConfig config= null;
JspWriter out = null;
Object page = this;
...创建有关对象的代码
pageContext = _jspFactoty.getPageContext(this,request,response,null,ture,8192,true);
session = pageContext.getSession();
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
...其他代码
}
可以看到在_jspService方法中申明了8个变量(加粗字体表示的)。如果一个也I安是错误处理页面的,即页面中包含下面的page指令:
<%@ page isErrorPage="true" %>
则页面实现类中将自动申明一个exception隐含变量,如下:
Throwable exception = (Throwable) request.getAttribute("javax.servlet.jsp.jspException");
二、各隐含变量讲解
1、request与response变量
request与response分别对应HttpServletRequest和HttpServletResponse类型的隐含变量,当页面的Servlet向客户端提供服务时,他们作为参数传递给_jspService()方法。在jsp页面中他们与在servlet中使用完全一样,即用来分析请求和发送响应。
例如:
<% String remoteAddr = request.getRemoteAddr();
response.setContextType("text/html,charset=ISO-8859-1");
%>
<html><body>
Hi,Your IP address is <%=remoteAddr%>
</body></html>
2、out变量
out是javax.servlet.jsp.JspWriter类型的隐含变量,JspWriter类扩展了java.io.writer并继承了所有重载的write()方法。在此基础上,还增加了其自己的一组print()和println()方法来打印输出所有的基本数据类型、字符串以及用户定义的对象。可以在小脚本中直接使用它,也可以在表达式中间间接使用它产生HTML代码。
例如:
<% out.print("Hello World!"; %>
<%= "Hello User" %>
3、application变量
application是javax.servlet.ServletContext类型的隐含变量,它是JSP页面所在的Web应用程序的上下文的引用。
例如下面两个是等价的:
<% String path = application.getRealPath("/WEB-INF/counter.db");
application.log("Using:"+path);
%>
<% String path = getServletContext().getRealPath("/WEB-INF/counter.db");
getServletContext().log("Using:"+path);
%>
4、session变量
session是javax.servlet.http.HttpSession类型的隐含变量,它在JSP页面中表示会话对象。要使用会话对象,必须要求JSP页面参加Http会话,即要求将JSP页面的page指令的session属性值设置为true。
如果page指令的session属性设置为true,那么在页面转换的类中就会申明一个session隐含变量。由于默认情况下,session属性的值为true,所以即使没有指定page指令,该变量也会被申明并可以使用。然而,如果明确将session属性设置为false,容器将不会申明改变量,对该变量的使用将产生错误。
例如;
<%@ page session="false" %>
<html><body>
会话ID=<%=session.getId()%>
</body></html>
5、pageContext是javax.servlet.jsp.PageContext类型的隐含变量,它是一个页面上下文对象。PageContext类是一个抽象类,容器厂商提供了一个具体子类(如jspContext),它有三个作用:
(1)、存储隐含对象的引用。pageContext对象是作为管理所有在JSp页面中使用的其他对象的一个地方,包括用户定义的和隐含的对象,并且它提供了一个访问方法来检索他们。session、application、config、out这些隐含变量都是调用pageContext对象的相应方法得到的。
(2)、提供了在不同作用域内返回或设置属性的方便的方法。
(3)、提供了forward()方法和include()方法实现将请求转发到另一个资源和将一个资源的输出包含到当前页面中的功能,它们的格式如下:
1)、public void include(String relativeURL)将另一个资源的输出包含在当前页面的输出中,与RequestDispatcher()接口的include()方法功能类似。
2)、public void forward(String relativeURL)将请求转发到参数指定的资源,与RequestDispatcher接口中的forward()方法功能相同。
例如:
RequestDispatcher view = request.getRequestDispatcher("index.html");
view.forward(request,response);
或者
pageContext.forward("index.html");
6、page变量
page变量是java.lang.Object类型的对象,申明如下:
Object page = this;
它指生成的servlet实例,该变量较少适用。
7、config变量
config是javax.servlet.ServletConfig类型的银行变量。可以在JSp页面传递一组初始化参数,这些参数可以在JSp页面中使用config隐含变量来检索。
例如:
<html><body>
Servlet Name = <%= config.getServletName() %><br>
Email Address = <%=config.getInitParameter("email") %>
</body></html>
8、exception变量
exception是java.lang.Throwable类型的隐含变量,它被用来作为其他页面的错误处理器。为使页面能够使用exception变量,必须在页面的page指令中将isErrorPage的属性值为true。
例如:
<%@ page isErrorPage='true' %>
<html><body>
页面发生了下面的错误:<%= exception.toString() %>
</body></html>
出处: 作者:伫望碧落