作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。对page对象的引用通常存储在pageContext对象中。
scope1.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
scope.jsp 页面
<%
// 往四个域中都分别保存了数据
pageContext.setAttribute("key", "pageContext");
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
%>
pageContext 域是否有值:<%=pageContext.getAttribute("key")%>
request 域是否有值:<%=request.getAttribute("key")%>
session 域是否有值:<%=session.getAttribute("key")%>
application 域是否有值:<%=application.getAttribute("key")%>
<%--<%--%>
<%-- request.getRequestDispatcher("/scope2.jsp").forward(request,response);--%>
<%--%>--%>
通过运行scope1.jsp,可以看到4大域的值都在浏览器上显示了出来。
作用范围是在当前请求中有效;生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的。
void setAttribute(String name, Object value):将对象value以name为名称保存到request作用域中。
ObjectgetAttribute(String name):从request作用域中取得指定名字的信息。
scope1.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
scope.jsp 页面
<%
// 往四个域中都分别保存了数据
pageContext.setAttribute("key", "pageContext");
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
%>
pageContext 域是否有值:<%=pageContext.getAttribute("key")%>
request 域是否有值:<%=request.getAttribute("key")%>
session 域是否有值:<%=session.getAttribute("key")%>
application 域是否有值:<%=application.getAttribute("key")%>
<%
request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
通过运行scope1.jsp,加上了跳转后,可以看到4大域的值除了pageContext都在浏览器上显示了出来,这就说明了pageContext只在当前 jsp 页面范围内有效,一旦跳转到了别的页面后就没有值了。
作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate(),可以立即销毁session。session是通过HttpSession接口实现的,它提供的主要方法如下:
ObjectHttpSession.getAttribute(String name):从session中获取信息。
voidHttpSession.setAttribute(String name, Object value):向session中保存信息。
HttpSessionHttpServletRequest.getSession():获取当前请求所在的session的对象。
scope1.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
scope.jsp 页面
<%
// 往四个域中都分别保存了数据
pageContext.setAttribute("key", "pageContext");
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
%>
pageContext 域是否有值:<%=pageContext.getAttribute("key")%>
request 域是否有值:<%=request.getAttribute("key")%>
session 域是否有值:<%=session.getAttribute("key")%>
application 域是否有值:<%=application.getAttribute("key")%>
<%
response.sendRedirect("/web06/scope2.jsp");
%>
通过运行scope1.jsp,使用重定向跳转后,可以看到4大域的值只有session和application的值在浏览器上显示了出来,这就说明了request只在一次请求内有效。
作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。application作用域就是服务器启动到关闭的整段时间,在这个作用域内设置的信息可以被所有应用程序使用。application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下:
ObjectgetAttribute(String name):从application中获取信息。
void setAttribute(String name, Object value):向application作用域中设置信息。
当我关闭浏览器后,再次进入发现只有application的值还存在。
最后我们再次启动web工程,4大域的值都消失了。