servlet保存作用域-爱代码爱编程
一、request
request保存作用域只在一次请求的范围内。
例如:当我们使用客户端重定向后,服务器响应和客户端重定向到另一个Servlet,客户端会再次发起一个请求,此时的第一次请求保存作用域中的数据失效。若是使用服务器内部转发则仍然有效,因为没有发起第二次请求。
@WebServlet("/Demo1")
public class Demo1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、保存数据到request保存作用域
req.setAttribute("uname","Tom");
// 2、客户端重定向给Demo2(重定向不属于同一次请求,uname为null)
//req.getRequestDispatcher("Demo2").forward(req,resp);
//3、服务器内部转发给Demo2(成功获取Tom值)
resp.sendRedirect("Demo2");
}
}
@WebServlet("/Demo2")
public class Demo2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object obj = req.getAttribute("uname");
System.out.println("Demo2"+obj);
}
}
二、session
session保存的作用域范围在session有效期内,并且在同一客户端的请求内生效。
例如:当我们使用同一客户端发起多次请求时,在30分钟内(默认session有效时长)sesion保存作用域中的数据是一直有效的。超过30分钟或者切换客户端访问都会失效。
@WebServlet("/Demo3")
public class Demo3 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、向session保存作用域保存数据
HttpSession session = req.getSession();
session.setAttribute("uname","Tom");
//2、客户端重定向给Demo4(成功获取uname)
//resp.sendRedirect("Demo4");
//3、服务器端转发(成功获取uname)
req.getRequestDispatcher("Demo4").forward(req,resp);
}
}
@WebServlet("/Demo4")
public class Demo4 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object obj = req.getSession().getAttribute("uname");
System.out.println("Demo4"+obj);
}
}
三、application
application保存作用域在一次启动服务其运行的过程中一直保持有效。
例如:当我们启动Tomcat服务器后,向application保存作用域中保存了数据,只要是在这次服务器运行的期间,保存的数据一直有效,无论何种访问方式。只有当Tomcat关闭或者重启才会失效。
@WebServlet("/Demo5")
public class Demo5 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、向application保存作用域保存数据
ServletContext application = req.getServletContext();
application.setAttribute("uname","Tom");
//2、客户端重定向(可获取uname值)
//resp.sendRedirect("Demo6");
//3、服务器内部转发给(可获取uname值)
req.getRequestDispatcher("Demo6").forward(req,resp);
}
}
@WebServlet("/Demo6")
public class Demo6 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getServletContext().getAttribute("uname"));
}
}
总结:
1) request:一次请求响应范围
2) session:一次会话范围有效
3) application: 一次应用程序范围有效