servlet 保存作用域

本文详细介绍了Servlet中request、session和application三种作用域的区别,重点讲解了如何在请求间保存数据,以及它们的有效范围。通过实例演示了在不同场景下如何操作这些作用域,并强调了session的会话持久性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        保存作用域我们可以认为有四个:
               1. page(页面级别,现在几乎不用) 
               2. request(一次请求响应范围) 
               3. session(一次会话范围) 
               4. application(整个应用程序范围)

        1) request:一次请求响应范围

                             如果第二次请求的就不能访问,(重定向就不行,而服务器端内部转发就可以)

@WebServlet("/Demo01")
public class Demo01Request extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向request保存作用域保存数据
        request.setAttribute("uname","lili");

        //客户端重定向
     //    response.sendRedirect("demo02");

     //服务器端内部转发
        request.getRequestDispatcher("Demo02").forward(request,response);
    }
}

 

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

   2) session:一次会话范围有效

              一次会话范围,用的哪种跳转方式,只要session会话没有过期失效。

        3) application: 一次应用程序范围有效

                    

//演示Application保存作用域
@WebServlet("/Demo05")
public class Demo01Application extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向Application保存作用域保存数据
        // ServletContext:servlet上下文
        ServletContext application=request.getServletContext();
        application.setAttribute("uname","lili");
        //客户端重定向
//        response.sendRedirect("demo02");
        request.getRequestDispatcher("Demo06").forward(request,response);

    }
}

 

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

<think>嗯,我现在需要详细了解JSP中的对象作用域。根据用户提供的引用内容,JSP有四个作用域:application、session、request和page。让我先理清楚每个作用域的定义和区别。 首先,引用[1]提到,作用域是信息共享的范围,四个内置对象的作用域分别是application、session、request和page。这四个作用域范围应该是从大到小排列的吧?比如application是最大的,范围是整个应用,而page是最小的,只在当前页面有效。对吗? 然后看引用[3],里面详细说明了page作用域。它说page是默认的作用域,只能在当前页面使用,每次请求页面时会创建,响应后或转发到其他资源后被删除。比如在代码示例中,使用pageContext.setAttribute()设置的属性只能在当前页面访问,再次访问时会被重新初始化,所以输出null。这说明page作用域的生命周期确实很短,仅限于当前页面的一次请求。 接下来是request作用域。引用[1]和[4]提到request的作用域一次请求的范围。当用户发送一个请求,可能经过多个资源(比如Servlet或JSP页面转发),但request作用域内的数据在整个请求过程中有效。比如,如果使用forward跳转,数据还能保留,但如果是redirect的话,因为是两次请求,数据可能丢失。这点需要注意区分转发和重定向的区别。 然后是session作用域,应该和用户会话相关。引用[3]可能没有直接提到session,但通常session的作用域是用户会话期间有效,比如用户登录后的整个会话过程。当用户关闭浏览器或者会话超时,session数据才会被清除。这在购物车等需要跨页面保持用户状态的场景中很有用。 最大的作用域是application,也就是ServletContext。引用[4]指出application域用于整个应用的数据共享,所有用户都可以访问。比如网站的访问计数器,需要所有用户共享同一个数值,这时候用application作用域合适。不过需要考虑线程安全问题,因为多个用户可能同时修改这个数据。 还有,每个作用域对应的内置对象是什么?比如page作用域对应的是pageContext对象,request对应request对象,session对应session对象,application对应application对象(ServletContext)。这些对象提供了setAttribute和getAttribute方法来操作属性。 再想一下实际应用中的例子。比如用户登录信息应该存在session里,因为需要跨多个页面保持登录状态。而页面内的临时提示信息可能用request作用域,特别是转发时传递数据。而application作用域可能存储全局配置参数,比如数据库连接信息,不过通常这些信息会用其他方式管理,比如配置文件。 另外,引用[2]提到pageContext对象在JSP页面整个生命周期中存在,但page作用域的数据只在当前页面有效。这说明pageContext对象本身的生命周期和它管理的作用域属性不同。pageContext对象可以访问其他作用域,比如通过getAttribute方法指定作用域参数。 还需要注意不同作用域的生命周期。page作用域随着响应返回或转发而结束,request在请求结束后,session在会话结束时,application在应用关闭时销毁。这些生命周期的差异决定了数据共享的范围和时间。 总结起来,JSP的四个作用域由小到大依次是page、request、session、application,各自对应不同的数据共享需求和生命周期。正确选择作用域可以避免数据泄漏或不必要的资源占用。例如,误将大量数据放在application作用域可能导致内存问题,而该用session的作用域用了request会导致数据无法跨请求保持。</think>### JSP对象作用域详解 JSP的四大作用域决定了对象属性的生命周期和共享范围,由小到大依次为:**page**、**request**、session、application。以下是具体说明: --- #### 1. **page(页面作用域)** - **范围**:仅限当前页面。 - **生命周期**:从页面被请求开始,到响应返回或请求被转发时结束。 - **操作方式**:通过`pageContext`对象操作属性。 ```jsp <% pageContext.setAttribute("key", "value"); // 设置属性 String value = (String) pageContext.getAttribute("key"); // 获取属性 %> ``` - **特点**:每次访问页面时属性重新初始化,无法跨页面共享[^3]。 --- #### 2. **request(请求作用域)** - **范围**:一次完整的HTTP请求(可能包含多个资源,如Servlet或JSP转发)。 - **生命周期**:从请求开始到响应完成。 - **操作方式**:通过`request`对象操作属性。 ```jsp <% request.setAttribute("key", "value"); String value = (String) request.getAttribute("key"); %> ``` - **应用场景**:适用于`forward`跳转时传递数据(如从Servlet传值到JSP),但无法通过`redirect`共享[^4]。 --- #### 3. **session(会话作用域)** - **范围**:同一用户的所有请求,从登录到会话结束(如关闭浏览器或超时)。 - **生命周期**:会话创建到超时(默认30分钟)或手动销毁。 - **操作方式**:通过`session`对象操作属性。 ```jsp <% session.setAttribute("user", "Alice"); String user = (String) session.getAttribute("user"); %> ``` - **典型应用**:保存用户登录状态、购物车信息等需跨请求的数据[^1]。 --- #### 4. **application(应用作用域)** - **范围**:整个Web应用,所有用户共享。 - **生命周期**:应用启动到停止(如服务器关闭)。 - **操作方式**:通过`application`对象(即`ServletContext`)操作属性。 ```jsp <% application.setAttribute("visitCount", 100); Integer count = (Integer) application.getAttribute("visitCount"); %> ``` - **注意事项**:需处理线程安全问题(如使用`synchronized`或原子类)[^4]。 --- #### 作用域对比表 | 作用域 | 对应对象 | 共享范围 | 生命周期 | 典型场景 | |------------|----------------|-----------------------|---------------------------|--------------------------| | **page** | pageContext | 当前页面 | 页面请求开始到响应结束 | 页面内临时变量 | | **request**| request | 一次完整请求 | 请求开始到响应完成 | 转发时传递数据 | | **session**| session | 同一用户的所有请求 | 会话创建到超时/销毁 | 用户登录状态、购物车 | | **application** | application | 所有用户 | 应用启动到停止 | 全局配置、访问计数器 | --- #### 选择作用域的原则 1. **最小化原则**:优先选择最小作用域(如page),避免不必要的内存占用。 2. **数据敏感性**:敏感数据(如用户信息)避免使用application作用域。 3. **线程安全**:application作用域需考虑并发访问问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值