三.保存作用域

334 阅读3分钟

一.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"));
    }
}