【Servlet】浅谈 Servlet 之 保存作用域

简介: 了解一下 Servlet 之 保存作用域。

Servlet保存作用域

一、保存作用域类型

二、 `request` 保存作用域

三、 `session` 保存作用域

四、 `ServletContext` 保存作用域


一、保存作用域类型

在原始情况下,Servlet的保存作用域分为四种,分别是:

保存作用域类型 有效范围
page 保存作用域 一个页面范围有效
request 保存作用域 一次请求响应范围有效
session 保存作用域 一次会话范围有效
ServletContext 保存作用域 一次应用程序范围有效

在四种保存作用域的类型中,可以告诉大家的是,page保存作用域现在已经几乎不会用到了,我们也就不用深入了解。这篇文章,我们将主要讲解后面三种保存作用域。


二、 request 保存作用域


request保存作用域,是在一次请求响应范围有效的。也就是说,当我们创建了保存作用域,同时完成一次请求响应后,下一次请求就没办法获取到保存作用域的值了。


接下来,我们用一个小案例来验证一下。


首先使用request的方式创建保存作用域:

request.setAttribute("uname","haha");

我们在demo01中使用setAttribute()方法设置保存作用域。


保存作用域实质上就是一个map集合,主键值key表示作用域的名字,Value值就代表保存在保存作用域中的信息。


我们让客户端进行重定向,发起第二次请求。

response.sendRedirect("demo02");


第一次请求响应完成后,客户端会立刻进行重定向,向demo02发送第二次请求。


在demo02中尝试获取保存作用域的值并打印出来。

Object uname = request.getAttribute("uname");
System.out.println("uname = "+uname);


在demo02,我们使用getAttribute()方法获取保存作用域的值。


demo01代码:

/**
 * @author .29.
 * @create 2022-10-08 9:53
 * 演示 request 保存作用域范围 --- demo01 和 demo02
 */
@WebServlet("/demo01")
public class Demo01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.向request保存作用域保存数据
        request.setAttribute("uname","haha");
        //2.客户端重定向
        response.sendRedirect("demo02");
    }
}

demo02代码:

/**
 * @author .29.
 * @create 2022-10-08 9:56
 */
@WebServlet("/demo02")
public class Demo02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object uname = request.getAttribute("uname");
        System.out.println("uname = "+uname);
    }
}

接下来,我们尝试运行demo01:

微信图片_20221030204536.png

微信图片_20221030204542.png


按回车键进入网页后,我们就能发现网页的地址改变了,也就说明在完成一次请求响应后,客户端进行了重定向,向demo02发起第二次请求。

之后我们在来查看一下控制台对保存作用域值得输出情况:

微信图片_20221030204548.png

无法获取到保存作用域中的值,这就说明在第二次请求响应,我们得保存作用域就失效了。


为了确定request保存作用域在第一次请求响应范围内有效,我们需要改变一下代码。


不进行客户端重定向,而是在客户端发起请求后,在服务器的内部进行转发,将demo01中的保存作用域信息传给demo02,在demo02中获取保存作用域的值,再响应给客户端。


这样就保证了所有操作都在一次请求响应范围类,这时候我们再输出获取到的保存作用域的值。


修改后的demo01代码:

/**
 * @author .29.
 * @create 2022-10-08 9:53
 * 演示 request 保存作用域范围 --- demo01 和 demo02
 */
@WebServlet("/demo01")
public class Demo01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向request保存作用域保存数据
        request.setAttribute("uname","haha");
        //服务器端转发
        request.getRequestDispatcher("demo02").forward(request,response);
    }
}

再次运行demo01,这次网址没有发生改变,且控制台成功打印出了保存作用域中的值。

微信图片_20221102132802.png

微信图片_20221030204554.png


三、 session 保存作用域


创建 session 保存作用域的方式:

就是通过service()方法中的的HttpServletRequest对象request来调用getSession()方法来创建保存作用域。

@WebServlet("/demo03")
public class Demo03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.向request保存作用域保存数据
        request.getSession().setAttribute("uname","haha");
      //2.客户端重定向
//        response.sendRedirect("demo04");
        //3.服务器端转发
        request.getRequestDispatcher("demo04").forward(request,response);
    }
}



获取 session 保存作用域的值:

我们获取保存作用域的值时,依旧需要使用getSession()方法获取session,再调用getAttribute()方法得到。

@WebServlet("/demo04")
public class Demo04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session保存作用域保存的数据
        Object uname = request.getSession().getAttribute("uname");
        System.out.println("uname = "+uname);
    }
}ribute("uname");

session 保存作用域的有效范围是在一次会话范围内,也就是说,在我们上文提到的案例中,若是使用session的方式来创建保存作用域,获取保存作用域的值,就不会出现在第二次请求响应时无法获取值的情况了。


因为只在一次会话中有效,所以当我们使用新的客户端发起请求时,或者是关闭原有客户端界面,使用新客户端重新发起请求响应时,就会产生无法获取保存作用域值的情况。


四、 ServletContext 保存作用域


ServletContext 保存作用域,也可以叫application方式的保存作用域,使用这种方式创建的保存作用域,将会在一次应用程序范围内有效。


使用ServletContext方式创建保存作用域

@WebServlet("/demo05")
public class Demo05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //servletContext:servlet上下文
        ServletContext servletContext = request.getServletContext();
        //向servletContext保存作用域保存数据 ,也叫application保存作用域
       servletContext.setAttribute("uname","haha");
        //2.客户端重定向
//        response.sendRedirect("demo06");
       //3.服务器端转发
        request.getRequestDispatcher("demo06").forward(request,response);
    }
}


获取 ServletContext 保存作用域的值

@WebServlet("/demo06")
public class Demo06 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取application保存作用域保存的数据
        Object uname = request.getServletContext().getAttribute("uname");
        System.out.println("uname = "+uname);
    }
}

微信图片_20221030204603.png




目录
相关文章
|
Java 程序员 容器
jsp与servlet的区别以及jsp的四个作用域
jsp与servlet的区别以及jsp的四个作用域
87 0
|
Java 应用服务中间件
Servlet三大作用域:Request、Session、Application
Servlet三大作用域:Request、Session、Application
219 0
|
存储 资源调度 Java
Java Web——Servlet的数据共享方案:HttpSession接口(会话作用域对象)
Java Web——Servlet的数据共享方案:HttpSession接口(会话作用域对象)
Java Web——Servlet的数据共享方案:HttpSession接口(会话作用域对象)
|
Java
servlet中的三大作用域以及 jsp el jstl
servlet中的三大作用域以及 jsp el jstl
161 0
|
存储 Java
Java Web——Servlet的数据共享方案:HttpServletRequest接口(请求作用域对象)
Java Web——Servlet的数据共享方案:HttpServletRequest接口(请求作用域对象)
Java Web——Servlet的数据共享方案:HttpServletRequest接口(请求作用域对象)
|
Java 应用服务中间件
Java Web——Servlet的数据共享方案:ServletContext接口(全局作用域对象)
Java Web——Servlet的数据共享方案:ServletContext接口(全局作用域对象)
Java Web——Servlet的数据共享方案:ServletContext接口(全局作用域对象)
|
应用服务中间件
javaWeb第四天~请求转发和重定和Servlet的三大作用域对象
javaWeb第四天~请求转发和重定和Servlet的三大作用域对象
159 0
javaWeb第四天~请求转发和重定和Servlet的三大作用域对象
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
33 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
33 1
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
48 0