内置对象的概述
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0 规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在JSP页面中使用。
JSP隐式对象:
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息 |
reponse | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
1. out对象
在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。out对象是javax.servlet.jsp.JspWriter类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型是JspWriter,它相当于一种带缓存共嗯那个的PrintWriter。
下图描述了JSP页面的out对象与Servlet引擎提供的缓冲区之间的工作关系:
从图中可以看出,在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。
例子:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
out.println("first line<br>");
response.getWriter().println("second line<br>");
%>
</body>
</html>
页面显示:
尽管out.println语句位于response.getWriter().println语句之前,但它的输出内容却在后面。由此可以说明:out对象通过print语句写入数据后,直到整个JSP页面结束,out对象中输入缓冲区的数据(即:first line)才真正写入到Servlet引擎提供的缓冲区中,而response.getWriter().println语句则是直接把内容(即:second line)写入Servlet引擎提供的缓冲区中,Servlet引擎按照缓冲区中的数据存放顺序输出内容。
2. request对象
request 对象是javax.servlet.http.HttpServletRequest类型的对象,代表客户端的请求信息,主要用于获取客户端的参数和流。
主要方法:
- String getMethod() //获得提交方式
- String getRequestURI() //获得请求的URL地址
- String getProtocol() // 得到协议名称
- String getServletPath() //获得客户端请求服务器文件的路径
- String getQueryString() //获得URL的查询部分,post方法获得不到信息
- String getServerName() //得到服务器的名称
- String getServerPort() //获得服务器口号
- String getRemoteAddr() //得到客户端的IP地址
- String fetParameter(String name) //获得客户端传给服务器的name参数的值
3. response对象
response 对象和request是一对相应的内置对象,代表对客户端的响应。
主要方法:
- response.sendRedirect(目标页面路径); //重定向
- response.setHeader(String,String); //设置HTTP头
4. config对象
config 对象是javax.servlet.ServletConfig类的实例对象。主要作用是取得服务器的配置信息。
通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
主要方法:
- config.getServletName();//它返回包含在元素中的servlet名字,注意,元素在 WEB-INF\web.xml 文件中定义。
5. session对象
session 对象是由服务器自动创建的与请求相关的对象,服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session内部使用Map来保存数据,即key-value。
主要方法:
- session.setAttribute(String,Object); //给Object命名String,加入session
- session.getAttribute(String); //取名为String的session的值
- session.removeAttribute(String); //将名为String的内容从session中移除
6. application对象
application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。
这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
7. page对象
这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。
page 对象就是this对象的同义词
8. pageContext对象
pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。
在JSP页面中,使用pageContext对象可以获取JSP的其它8个隐式对象。
PageContext类定义了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。
pageContext对象获取隐式对象的方法:
方法名 | 功能描述 |
---|---|
JspWriter getOut() | 用于获取out隐式对象 |
Object getPage() | 用于获取page隐式对象 |
ServletRequest getRequest() | 用于获取request隐式对象 |
ServletResponse getResponse() | 用于获取response隐式对象 |
HttpSession getSession() | 用于获取session隐式对象 |
Exception getExceprion() | 用于获取exception隐式对象 |
ServletConfig getServletConfig() | 用于获取config隐式对象 |
ServletContext getServletContext() | 用于获取application隐式对象 |
pageContext对象不仅提供了获取隐式对象的方法,还提供了存储数据的功能。pageContext对象存储数据是通过操作属性来实现的,具体如下:
方法名称 | 功能描述 |
---|---|
void setAttribute(String name, Object value, int scope) | 用于设置pageContext对象的属性 |
Object getAttribute(String name, int scope) | 用于获取pageContext对象的属性 |
void removeAttribute(String name, int scope) | 删除指定范围内名称为name的属性 |
void removeAttribute(String name) | 删除所有范围内名称为name的属性 |
Object findAttribute(String name) | 从4个域对象中查找名称为name的属性 |
JSP的4个作用域
pageContext对象的作用范围有4个值,具体如下:
- PageContext.PAGE_SCOPE:表示页面范围
- PageContext.REQUEST_SCOPE:表示请求范围
- PageContext.SESSION_SCOPE:表示会话范围
- PageContext.APPLICATION_SCOPE:表示Web应用程序范围
需要注意的是,当使用findAttribute()方法查找名称为name的属性时,会按照page、request、session和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回null。
PageContext常量名 | 描述 | 作用域名称 | 域对象类型 |
---|---|---|---|
PageScope | 当前页面中有效 | pageContext | PageContext |
RequestScope | 一次请求范围 | request | HttpServletRequest |
SessionScope | 一次会话范围 | session | HttpSession |
ApplicationScope | Web应用范围 | application | ServletContext |
例子:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//使用pageContext域存数据
pageContext.setAttribute("name", "page", PageContext.PAGE_SCOPE);//等价于:request.setAttribute("name", "request");
pageContext.setAttribute("name", "request", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "session", PageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "application", PageContext.APPLICATION_SCOPE);
%>
<!-- 下面两行代码等价,都是从request域获取数据 -->
<%=request.getAttribute("name") %>
<%=pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%>
<!-- findAttribute会从小到大搜索域的范围中的name -->
<!-- page域<request域<session域<application域 -->
<%=pageContext.findAttribute("name") %>
</body>
</html>
页面显示: