3.3 隐式对象

3.3 隐式对象

概述

Servlet容器会传递几个对象给它运行的Servlet。例如,可以通过Servletservice方法拿到HttpServletRequestHttpServletResponse对象,以及可以通过init方法访问到ServletConfig对象。此外,可以通过调用HttpServletRequest对象的getSession方法拿到HttpSession对象。

JSP隐式对象

JSP中,可以通过使用隐式对象来访问上述对象。JSP隐式对象如下表所示。

对象 类型
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
out javax.servlet.jsp.JspWriter
session javax.servlet.http.HttpSession
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
pageContext javax.servlet.jsp.PageContext
page javax.servlet.jsp.HttpJspPage
exception java.lang.Throwable

request隐式对象

该隐式对象代表Servlet/JSP容器传递给Servlet服务方法的HttpServletRequest对象。可以将request理解为一个指向HttpServletRequest对象的引用变量。下面的代码示例,从HttpServletRequest对象中返回userName参数值:

1
2
3
<%
String userName = request.getParameter("userName");
%>

pageContext隐式对象

获取Servlet相关对象

pageContext提供了有用的上下文信息,并且通过其方法可以访问各种Servlet相关对象,如getRequestgetResponsegetServletContextgetServletConfiggetSession。当然,这些方法在脚本中不是非常有用的,因为可以更直接地通过隐式对象requestresponsesessionapplication等来直接访问。

获取和设置属性

PageContext中提供了另一组有趣的方法:用于获取和设置属性的方法,也就是getAttribute方法和setAttribute方法。属性值可被存储在4个范围之一:页面请求会话应用程序

  • 页面范围是最小范围,这里存储的属性只在同一个JSP页面之中可用。
  • 请求范围是指属性存储在当前的ServletRequest里面。
  • 会话范围指属性存储在当前的HttpSession里面。
  • 应用程序范围指属性存储在应用的ServletContext里面。

setAttribute方法

PageContextsetAttribute方法签名如下:

1
2
public abstract void setAttribute(java.lang.String name,
java.lang.Object value, int scope)

其中,scope的取值范围为PageContext对象的中存储静态int值:PAGE_SCOPEREQUEST_ SCOPESESSION_SCOPEAPPLICATION_SCOPE

把属性存储到页面范围

若要保存一个属性到页面范围,可以直接使用setAttribute重载方法:

1
2
public abstract void setAttribute(java.lang.String name, 
java.lang.Object value)

实例

如下脚本将一个属性保存到ServletRequest中:

1
2
3
4
5
<%
//product is a Java object
pageContext.setAttribute("product", product,
PageContext.REQUEST_SCOPE);
%>

同样效果的Java代码如下:

1
2
3
<%
request.setAttribute("product", product);
%>

out隐式对象

隐式对象out引用了一个javax.servlet.jsp.JspWriter对象,这类似于你在调用HttpServletResponsegetWriter方法时得到的java.io.PrintWriter对象。可以通过调用它的print方法将消息发送到浏览器。例如:

1
out.println("Welcome");

Demo

implicitObjects.jsp页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@page import="java.util.Enumeration"%>
<html>
<head>
<title>JSP Implicit Objects</title>
</head>
<body>
<b>Http headers:</b>
<br />
<%
for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();)
{
String header = e.nextElement();
out.println(header + ": " + request.getHeader(header) + "<br/>");
}
%>
<hr />
<%
out.println("Buffer size: " + response.getBufferSize() + "<br/>");
out.println("Session id: " + session.getId() + "<br/>");
out.println("Servlet name: " + config.getServletName() + "<br/>");
out.println("Server info: " + application.getServerInfo());
%>
</body>
</html>

浏览器显示效果如下:
这里有一张图片
在浏览器中具体看到的内容,取决于所使用的浏览器及其环境。
注意,在默认情况下,JSP编译器会将JSP页面的内容类型设为text/html。如果要使用不同的类型,则需要
通过调用response.setContentType()或者使用页面指令来设置内容类型。例如,下面就是将内容类型设置为text/json

1
response.setContentType("text/json");