jsp四种常用范围对象以及作用域

本文详细解析了JavaWeb中pageContext、request、session及application四种作用域的特点与应用场景,包括不同场景下的数据传递方式。

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

pageContext:数据只在当前自身的页面有效;

request:数据在一次请求中有效;

session:数据在一次会话中有效;若是新开浏览器,则无效;

application:数据在当前Wed项目有效,可供所有用户共享。

以上的四种防卫对象都存在以下方法:

public void setAttribute(String name,Object o) , 设置属性名和属性值;

public Object getAttribute(String name) ,根据属性名,获取对应的属性值;

public void removeAttribute(String name) , 根据属性名,删除对应的属性值。

(1)pageContect作用域

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here <% pageContext.setAttribute("bookName", "Oracle数据库"); pageContext.setAttribute("author", "小太阳"); %> 书名:<%=pageContext.getAttribute("bookName") %>
作者:<%=pageContext.getAttribute("author") %>

在这里插入图片描述

因为pageContext对象中的属性的作用域是“在当前自身的页面内有效”,而以上均在同一个页面中增加或输出,所以能够正常显示。但将上面的页面做修改,将属性添加放在one.jsp中执行,再通过请求转发跳转到two.jsp页面,并在two.jsp中显示属性的值。

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here <% pageContext.setAttribute("bookName", "Oracle数据库"); pageContext.setAttribute("author", "小太阳"); request.getRequestDispatcher("two.jsp").forward(request, response); %>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here 书名:<%=pageContext.getAttribute("bookName") %>
作者:<%=pageContext.getAttribute("author") %>

再次执行one.jsp,运行结果如下所示:

在这里插入图片描述

因为页面从one.jsp,通过请求转发跳转到two.jsp后,就已经不再是同一个页面了,所以无法再通过pageContext对象获取到数据。

(2)request作用域

要想请求转发后two.jsp页面获取到属性值,可以使用request的作用域。request的作用域是“在客户端向服务器端,发送的一次请求中有效”。可将上面的例子进行修改:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here <% request.setAttribute("bookName", "Oracle数据库"); request.setAttribute("author", "小太阳"); request.getRequestDispatcher("two.jsp").forward(request, response); %>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here 书名:<%=request.getAttribute("bookName") %>
作者:<%=request.getAttribute("author") %>

在这里插入图片描述

因为从one.jsp到two.jsp的跳转是“请求转发”,即仍然是同一次请求,而request的作用域范围就是“在一次请求中有效”。

但要注意,如果将上例的“请求转发”改为"重定向"或超链接形式的跳转,则不会再获取到数据,如下:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here <% request.setAttribute("bookName", "Oracle数据库"); request.setAttribute("author", "小太阳"); %> 点我跳转

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here 书名:<%=request.getAttribute("bookName") %>
作者:<%=request.getAttribute("author") %>

在这里插入图片描述

点击跳转:

在这里插入图片描述

因为request的作用范围是“一次请求中有效”,而“重定向”或超链接形式的跳转,都是在跳转时重新发送了一次新的请求(重新去请求two.jsp),因此是获取不到数据的。

(3)session作用域

如果希望在增加属性之后,能够在跳转后的任何页面(无论是请求转发、重定向或超链接跳转),甚至是项目中任何一个页面都能获取到该属性值,就可以使用session的作用域来实现:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here <% session.setAttribute("bookName", "Oracle数据库"); session.setAttribute("author", "小太阳"); response.sendRedirect("two.jsp"); %>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here 书名:<%=session.getAttribute("bookName") %>
作者:<%=session.getAttribute("author") %>

在这里插入图片描述

虽然“重定向”或超链接形式的跳转,会重新向服务器发送一次请求(重新去请求two.jsp),但仍然可以从session的作用域中获取到属性值。当然,如果通过请求转发实现的跳转,也能通过session获取到属性值。

此外,可重新打开同一个浏览器(相同浏览器),然后在新标签里直接输入并执行http://localhost:8080/pratical/two.jsp(执行了http://localhost:8080/pratical/one.jsp后),也能获取到数据:

在这里插入图片描述

但如果换了一个浏览器(不同的浏览器),在直接输入http://localhost:8080/pratical/two.jsp并执行(在另一个浏览器执行了http://localhost:8080/pratical/one.jsp后),结果:

在这里插入图片描述

也就是说,只要one.jsp中将属性添加到session后,凡是同一个浏览器都可以取到session中的该属性值;但如果换成其他浏览器,则就不能再在session中获取到该属性值了。

(4)application作用域

继续上面的讨论,如果向实现这样一个功能“只要在一个页面中增加了属性,那么即使重新换一个浏览器,也要能访问到该属性值”,该如何实现?答案就是application的作用域。将上例修改:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here <% application.setAttribute("bookName", "Oracle数据库"); application.setAttribute("author", "小太阳"); request.getRequestDispatcher("two.jsp").forward(request, response); %>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here 书名:<%=application.getAttribute("bookName") %>
作者:<%=application.getAttribute("author") %>

在这里插入图片描述

换一个浏览器输入http://localhost:8080/pratical/two.jsp(在另一个浏览器执行了http://localhost:8080/pratical/one.jsp后)并执行,也能获取到数据:

在这里插入图片描述

只要运行过一次one.jsp后,无论是一个浏览器标签,或者是更换新的浏览器,直接再运行two.jsp都能获取到数据。即只要是通过application.setAttribute()设置的属性,那么任何浏览器的任何页面都可以获取到该属性值,但是如果将tomcat服务器关闭,则application中的属性值就全部消失了。

可以利用application作用域的这一特性,来实现一个网页计数器功能,任何的浏览器都能访问,并统计次数:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

计数器 <% //第一次访问网页时,count没有值,所以是null Integer count = (Integer)application.getAttribute("count"); if(count==null){ //如果是第一次访问,将count赋值为1 count = 1; }else{ //如果不是第一次访问,则累加一次访问次数 count = count+1; } //将访问次数的变量count保存在applition的属性count中,供下次访问时获取并累加 application.setAttribute("count", count); out.print("你是第"+application.getAttribute("count")+"个人访问本网站的用户"); %>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之后,无论是刷新当前页,还是打开一个浏览器标签,或者打开一个其他浏览器再次访问,没访问一次,访问次数就会累加一次。

需要说明的是,虽然四种作用域的大小依次是pageContext<request<session<application,但不能为了方便就随随便便使用范围大的范围对象,因为范围大造成的性能损耗就越大。因此,如果多个作用域都能完成相同的功能,一般会使用小的那个对象。

作者:大海知天空
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_42044486/article/details/84322911
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>好的,我现在需要回答用户关于JSP九大内置对象和四大作用域的问题。首先,我得回忆一下JSP的相关知识,确保信息准确。 首先,九大内置对象。我记得JSP在转换为Servlet时,容器会自动生成这些对象。逐个列举的话,首先是request,response,还有session,这三个比较常见。然后应该有application,对应ServletContext。还有pageContext,这个是PageContext类的实例。还有out,用于输出内容。剩下的可能包括config,对应ServletConfig;exception,处理错误;还有page,代表当前页面实例。需要确认这些是否正确,比如exception是否只在错误页面中可用,而page对象是否真的常用。 接下来是四大作用域作用域指的是对象的生命周期和可访问范围。page作用域对应pageContext,只在当前页面有效。request作用域是通过request对象设置的属性,在一次请求中有效,包括转发的情况。session作用域对应用户的会话,多次请求间有效。application作用域则是全局的,对应整个Web应用。需要确认这些作用域与内置对象的关联是否正确,比如pageContext可以处理page作用域,而application对应ServletContext的作用域。 然后要组织语言,用中文清晰解释每个对象作用域,可能需要举例说明。例如,request对象用于获取客户端提交的数据,response用于响应,session保存用户会话信息等。作用域部分要强调每个范围的有效期和应用场景,比如session常用于用户登录状态,application用于全局配置参数。 最后,检查是否符合用户的要求,确保使用正确的LaTeX格式,但问题中可能不涉及数学公式,所以这部分可能不需要处理。但需要留意是否有行内或独立公式,这里可能没有。结构要分点说明,九大对象和四大作用域分开,每个部分详细但简洁,避免冗长。 可能遇到的疑问点:是否正确列举了所有内置对象,特别是exception是否在内置对象中。是的,exception对象只有在isErrorPage设置为true的页面中才可用。另外,page对象实际开发中使用较少,但确实存在。作用域方面,确认每个作用域对应的对象,比如pageContext作用于page,request作用于请求,session作用于会话,application作用于应用。 现在需要将这些整理成结构清晰的回答,分点说明每个内置对象作用和四大作用域范围及使用场景,确保用户容易理解。同时,注意用词准确,避免技术错误。</think>### JSP 九大内置对象 JSP 内置对象是容器自动创建的变量,可直接在 JSP 页面中使用: 1. **`request`** - **类型**:`javax.servlet.http.HttpServletRequest` - **作用**:封装客户端请求信息(如表单数据、请求头等)。 - **示例**:`request.getParameter("name")` 获取表单参数。 2. **`response`** - **类型**:`javax.servlet.http.HttpServletResponse` - **作用**:控制服务器响应(如重定向、设置Cookie)。 - **示例**:`response.sendRedirect("newPage.jsp")` 重定向页面。 3. **`session`** - **类型**:`javax.servlet.http.HttpSession` - **作用**:跟踪用户会话状态(如保存登录信息)。 - **示例**:`session.setAttribute("user", userObj)` 保存用户对象。 4. **`application`** - **类型**:`javax.servlet.ServletContext` - **作用**:全局作用域,存储整个应用的共享数据(如全局配置)。 - **示例**:`application.setAttribute("appConfig", config)` 保存配置。 5. **`pageContext`** - **类型**:`javax.servlet.jsp.PageContext` - **作用**:管理当前页面的属性和访问其他内置对象。 - **示例**:`pageContext.setAttribute("tempData", data)` 保存当前页数据。 6. **`out`** - **类型**:`javax.servlet.jsp.JspWriter` - **作用**:向客户端输出内容(类似`System.out`)。 - **示例**:`out.print("Hello, World!")` 输出文本。 7. **`config`** - **类型**:`javax.servlet.ServletConfig` - **作用**:获取当前页面的配置信息(如初始化参数)。 - **示例**:`config.getInitParameter("param")` 读取配置参数。 8. **`page`** - **类型**:`java.lang.Object` - **作用**:指向当前 JSP 页面的实例(类似`this`)。 - **注意**:实际开发中极少使用。 9. **`exception`** - **类型**:`java.lang.Throwable` - **作用**:捕获页面异常(仅在设置了 `isErrorPage="true"` 的页面可用)。 - **示例**:`exception.getMessage()` 获取异常信息。 --- ### JSP 四大作用域 作用域决定了数据的生命周期和可访问范围: 1. **`page` 作用域** - **范围**:仅在当前页面内有效。 - **操作对象**:`pageContext` - **使用场景**:临时存储当前页面的数据(如页面渲染时的中间变量)。 - **示例**: ```jsp <% pageContext.setAttribute("count", 100); %> <%= pageContext.getAttribute("count") %> ``` 2. **`request` 作用域** - **范围**:一次请求内有效(包括通过 `forward` 转发的页面)。 - **操作对象**:`request` - **使用场景**:跨页面传递数据(如表单提交后转发到结果页)。 - **示例**: ```jsp <% request.setAttribute("message", "操作成功!"); %> <jsp:forward page="result.jsp" /> ``` 3. **`session` 作用域** - **范围**:同一用户的整个会话期间有效(浏览器未关闭且会话未超时)。 - **操作对象**:`session` - **使用场景**:保存用户登录状态或个性化设置。 - **示例**: ```jsp <% session.setAttribute("user", "Alice"); %> <%= session.getAttribute("user") %> ``` 4. **`application` 作用域** - **范围**:整个 Web 应用内有效(所有用户共享)。 - **操作对象**:`application` - **使用场景**:存储全局配置或共享资源(如数据库连接池)。 - **示例**: ```jsp <% application.setAttribute("visitorCount", 0); %> <% application.setAttribute("visitorCount", (Integer)application.getAttribute("visitorCount") + 1); %> ``` --- ### 总结 - **内置对象**:简化开发,直接操作请求、响应、会话等核心功能。 - **作用域**:根据数据共享需求选择合适的作用域,避免滥用 `session` 或 `application` 导致性能问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值