一.request:一次请求范围
- request保存作用域只在一次请求的范围内
- 举例: 当我们使用客户端重定向后,服务器响应和客户端重定向到另一个Servlet,客户端会再次发起一个请求,此时的第一次请求保存作用域中的数据失效。若是使用服务器内部转发则仍然有效,因为没有发起第二次请求
- 代码演示:
package demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author
* @create1. 保存作用域
* 原始情况下,保存作用域我们可以认为有四个: page(页面级别,现在几乎不用) , request(一次请求响应范围) , session(一次会话范围) , application(整个应用程序范围)
* 1) request:一次请求响应范围
* 2) session:一次会话范围有效
* 3) application: 一次应用程序范围有效
*/
@WebServlet("/Demo1")
//演示request保存作用域(demo01和demo02)
public class DemoServlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("uname","lili");//保存数据到request保存作用域
// resp.sendRedirect("Demo2");//客户端重定向给DemoServlet2
req.getRequestDispatcher("Demo2").forward(req,resp);//服务器内部转发给DemoServlet2 结果:成功获取到了“lili”
}
}
package demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author
* @create
*/
@WebServlet("/Demo2")
public class DemoServlet2 extends HttpServlet {
//1.获取request保存作用域保存的数据,key为uname
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object obj =req.getAttribute("uname");
System.out.println(obj);
}
}
结论:request保存作用域,只对当前请求有效,一旦客户端再次发起请求,立刻失效;
二. session:一次会话范围有效
- session保存作用域范围在session有效时间内,并且在同一客户端发起的请求内生效
- 举例: 当我们使用同一客户端发起多次请求时,在30分钟内(默认session有效时长)sesion保存作用域中的数据是一直有效的。超过30分钟或者切换客户端访问都会失效
- 代码演示:
package demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author
* @create
*/
@WebServlet("/Demo3")
//演示session保存作用域(demo03和demo04)
public class DemoServlet3 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session =req.getSession();
session.setAttribute("uname","lili");
//resp.sendRedirect("Demo4");//客户端重定向给DemoServlet4
req.getRequestDispatcher("Demo4").forward(req,resp);//两次都成功获取”lili“
}
}
package demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author
* @create
*/
@WebServlet("/Demo4")
//演示session保存作用域(demo03和demo04)
public class DemoServlet4 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object obj = req.getSession().getAttribute("uname");
System.out.println(obj);
}
}
application: 一次应用程序范围有效
- application保存作用域也叫程序作用域,在一次启动服务器运行的过程中一直保持有效
- 举例: 当我们启动Tomcat服务器后,向application保存作用域中保存了数据,只要是在这次服务器运行的期间,保存的数据一直有效,无论何种访问方式。只有当Tomcat关闭或者重启才会失效
- 代码演示:
package demo;
import javafx.application.Application;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author
* @create
*/
//演示application保存作用域(demo05和demo06)
@WebServlet("/Demo5")
public class DemoServlet5 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.向application保存作用域保存数据
//ServletContext : Servlet上下文
ServletContext application = req.getServletContext();
application.setAttribute("uname","lili");
//resp.sendRedirect("Demo6");//重定向给DemoServlet6
req.getRequestDispatcher("Demo6").forward(req,resp);//两次都可以获取到”lili“
}
}
package demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author
* @create
*/
@WebServlet("/Demo6")
public class DemoServlet6 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getServletContext().getAttribute("uname"));
}
}