一. 常用方法
在介绍下面的几个作用域之前,我们先来介绍三个常用的方法:
保存:setAttribute(String,Object) 读取:getAttribute(String) 删除:removeAttribute(String)
二. pageContext
index.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <% pageContext.setAttribute("name", "zhangjia"); // request.getRequestDispatcher("b.jsp").forward(request,response); // response.sendRedirect("b.jsp"); %> <a href="b.jsp">链接</a> <p><%=pageContext.getAttribute("name")%></p> </body> </html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <p><%=pageContext.getAttribute("name")%></p> </body> </html>
我们可以从以下几个方面分析pageContext的作用域:
-
直接访问index.jsp,可以输出zhangjia
-
直接访问b.jsp(无论是否访问过index.jsp),输出null
-
通过index.jsp的a标签跳转到b.jsp,输出null
-
通过index.jsp转发到b.jsp,输出null
-
通过index.jsp重定向到b.jsp,输出null
通过上面结果可以看出,pageContext只有在当前页才能获取到数据,所以一句话总结PageContext的作用域:pageContext的作用域仅限当前页面。
三. request
index.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <% request.setAttribute("name", "zhangjia"); request.getRequestDispatcher("b.jsp").forward(request,response); // response.sendRedirect("b.jsp"); %> <a href="b.jsp">链接</a> <p><%=request.getAttribute("name")%></p> </body> </html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <p><%=request.getAttribute("name")%></p> </body> </html>
我们从以下几个方面分析request的作用域:
-
直接访问index.jsp,可以输出zhangjia
-
直接访问b.jsp(无论是否访问过index.jsp),输出null
-
通过index.jsp的a标签跳转到b.jsp,输出null
-
通过index.jsp转发到b.jsp,输出zhangjia
-
因为转发只产生一次请求
-
通过index.jsp重定向到b.jsp,输出 null
-
因为重定向产生两次请求,所以有两个request对象,分别是index.jsp的request对象和b.jsp的request对象
通过上面结果可以看出,request的作用域在连续的服务器端跳转中有效。
四. session
index.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <% session.setAttribute("name", "zhangjia"); // request.getRequestDispatcher("b.jsp").forward(request,response); // response.sendRedirect("b.jsp"); %> <a href="b.jsp">链接</a> <p><%=session.getAttribute("name")%></p> </body> </html>
b.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <p><%=session.getAttribute("name")%></p> </body> </html>
我们从以下几个方面分析session的作用域:
-
直接访问index.jsp,可以输出zhangjia
-
访问过index.jsp后再直接访问b.jsp,输出zhangjia
-
通过index.jsp的a标签跳转到b.jsp,输出zhangjia
-
通过index.jsp转发到b.jsp,输出zhangjia
-
通过index.jsp重定向到b.jsp,输出zhangjia
-
但是如果更换一个浏览器,直接访问b.jsp,输出null,但是在该浏览中访问一次index.jsp后,再访问b.jsp,就能正常输出了
通过上面结果可以看出,session的作用域在一次会话。如果关闭浏览器,session中的数据便会丢失。
五. application
index.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <% session.setAttribute("name", "zhangjia"); // request.getRequestDispatcher("b.jsp").forward(request,response); // response.sendRedirect("b.jsp"); %> <a href="b.jsp">链接</a> <p><%=session.getAttribute("name")%></p> </body> </html>
b.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>Title</title> </head> <body> <p><%=application.getAttribute("name")%></p> </body> </html>
我们从以下几个方面分析application的作用域:
-
直接访问index.jsp,可以输出zhangjia
-
访问过index.jsp后再直接访问b.jsp,输出zhangjia
-
通过index.jsp的a标签跳转到b.jsp,输出zhangjia
-
通过index.jsp转发到b.jsp,输出zhangjia
-
通过index.jsp重定向到b.jsp,输出zhangjia
-
重启服务后,直接访问b.jsp,才会显示null
-
除了重启,还可以使用removeAttribut方法来删除该数据。
application的作用域在整个应用程序,服务器不重启,作用域就一直有效。
请登录之后再进行评论