3.3 隐式对象
3.3 隐式对象
概述
Servlet
容器会传递几个对象给它运行的Servlet
。例如,可以通过Servlet
的service
方法拿到HttpServletRequest
和HttpServletResponse
对象,以及可以通过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 | <% |
pageContext隐式对象
获取Servlet相关对象
pageContext
提供了有用的上下文信息,并且通过其方法可以访问各种Servlet
相关对象,如getRequest
、getResponse
、getServletContext
、getServletConfig
和getSession
。当然,这些方法在脚本中不是非常有用的,因为可以更直接地通过隐式对象request
、response
、session
和application
等来直接访问。
获取和设置属性
PageContext
中提供了另一组有趣的方法:用于获取和设置属性的方法,也就是getAttribute
方法和setAttribute
方法。属性值可被存储在4个范围之一:页面
、请求
、会话
和应用程序
。
- 页面范围是最小范围,这里存储的属性只在同一个
JSP
页面之中可用。 - 请求范围是指属性存储在当前的
ServletRequest
里面。 - 会话范围指属性存储在当前的
HttpSession
里面。 - 应用程序范围指属性存储在应用的
ServletContext
里面。
setAttribute方法
PageContext
的setAttribute
方法签名如下:
1 | public abstract void setAttribute(java.lang.String name, |
其中,scope
的取值范围为PageContext
对象的中存储静态int
值:PAGE_SCOPE
、REQUEST_ SCOPE
、SESSION_SCOPE
和APPLICATION_SCOPE
。
把属性存储到页面范围
若要保存一个属性到页面范围,可以直接使用setAttribute
重载方法:
1 | public abstract void setAttribute(java.lang.String name, |
实例
如下脚本将一个属性保存到ServletRequest
中:
1 | <% |
同样效果的Java代码如下:
1 | <% |
out隐式对象
隐式对象out
引用了一个javax.servlet.jsp.JspWriter
对象,这类似于你在调用HttpServletResponse
的getWriter
方法时得到的java.io.PrintWriter
对象。可以通过调用它的print
方法将消息发送到浏览器。例如:
1 | out.println("Welcome"); |
Demo
implicitObjects.jsp
页面:
1 | <%import="java.util.Enumeration"%> |
浏览器显示效果如下:
在浏览器中具体看到的内容,取决于所使用的浏览器及其环境。
注意,在默认情况下,JSP
编译器会将JSP
页面的内容类型设为text/html
。如果要使用不同的类型,则需要
通过调用response.setContentType()
或者使用页面指令来设置内容类型。例如,下面就是将内容类型设置为text/json
:
1 | response.setContentType("text/json"); |