servlet里面的三大作用域

作用域:存放数据,获取数据(传递数据)

servlet里面的三大作用域

  1. a:生命周期
  2. b:作用范围
  3. c:提到作用域要想到三个方式 get,set,remove
<h3>HttpServletRequest作用域</h3>
	<ol>
		<li>生命周期:一次请求之间</li>
		<li>作用范围:所有被请求转发过的servlet都可以获取到</li>
	</ol>
 	<a href="HelloRequest">HttpServletRequest作用域</a>

<h3>HttpSession作用域</h3>
	<ol>
		<li>生命周期:一次会话之间</li>
		<li>作用范围:只要设置一次session,所有的servlet都能获取到</li>
	</ol>
	<a href="HelloSession">HttpSession作用域</a>
	
<h3>ServletContext作用域</h3>	
	<ol>
		<li>生命周期:从服务器启动到服务器停止</li>
		<li>作用范围:只要设置一次servletContext作用域,所有的servlet都能获取到</li>
	</ol>
	<a href="HelloServeletContext">ServletContext作用域</a>

    如何选用?
    	HttpServletRequest作用域:和本次请求有关的数据
    	HttpSession作用域:和当前用户有关的数据
    	ServletContext作用域:经常被访问到,不易修改的数据(地址)

作用域设置方式
//reuqest设置作用域
req.setAttribute(“requestScope”, “request-Scope”);
//在session作用域存储数据
req.getSession().setAttribute(“httpsessionScope”, “HttpSession-Scope”);
//设置servletContext作用域
this.getServletContext().setAttribute(“servletContextScope”, “servletContext-Scope”);
作用域取值方式
//获取request作用域里面的值
String requestscope = (String) req.getAttribute(“requestScope”);
System.out.println(“HelloTestScope.service(HttpServletRequest作用域):”+requestscope);

//获取session作用域里面的值
String sessionScope = (String) req.getSession().getAttribute(“httpsessionScope”);
System.out.println(“HelloTestScope.service(HttpSession作用域):”+sessionScope);

//获取ServletContext作用域里面的值
String servletContextScope = (String) this.getServletContext().getAttribute(“servletContextScope”);
System.out.println(“HelloTestScope.service(ServletContext作用域):”+servletContextScope);

<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、付费专栏及课程。

余额充值