Javaweb开发核心之应用上下文知识(笔记)
什么是应用上下⽂ServletContext
简介:讲解Javaweb作⽤用域对象介绍和ServletContext讲解
1.理解应用上下文
- 定义: 应用上下文是一个
ServletContext
对象,表示整个Web应用的全局信息和状态。它在Web应用启动时创建,在应用停止时销毁。- 作用:
- 全局信息共享: 可存储应用范围内的共享数据。
- 配置管理: 提供访问全局初始化参数的接口。
- 资源管理: 用于获取Web应用中的资源(如文件、数据库连接等)。
2.什么是作用域对象:
就是对象的生命周期,在javaweb开发里⾯有多个不同⽣命周期的对象
⽐比如:PageContext,ServletRequest,HttpSession,ServletContext;
对象里面包含属性和对应的数据,所以不同作用域对象使⽤场景会不同
PageContext
- 生命周期:
- 存在于JSP页面的处理过程中。当前JSP页面处理结束后,
PageContext
对象即被销毁。
- 存在于JSP页面的处理过程中。当前JSP页面处理结束后,
- 作用域: 仅限于当前JSP页面(不可跨页面传递)。
- 使用场景:
- 用于存储仅在当前页面内需要的临时数据。
- 管理JSP页面中的各种资源,比如
out
对象、request
对象。
- 示例:
<%
pageContext.setAttribute("tempData", "Hello, Page!");
%>
<p>${pageScope.tempData}</p>
2. ServletRequest
- 生命周期:
- 每次客户端请求到达服务器时创建,服务器处理请求并返回响应后销毁。
- 作用域: 限于一次请求内(包括请求转发的多个页面)。
- 使用场景:
- 用于传递数据给同一次请求中的其他页面(如请求转发)。
- 适合短期数据存储,比如表单输入、查询参数。
- 示例:
request.setAttribute("message", "Welcome to JavaWeb!"); RequestDispatcher dispatcher = request.getRequestDispatcher("nextPage.jsp"); dispatcher.forward(request, response);
3. HttpSession
- 生命周期:
- 从用户第一次访问服务器时创建,直到会话超时或被手动销毁。
- 默认会话超时时间通常为30分钟(可在
web.xml
中配置)。
- 作用域: 跨多个请求(同一用户会话内)。
- 使用场景:
- 存储与特定用户会话相关的数据,如用户登录信息、购物车数据。
- 适合需要在多个请求间共享的用户数据
4. ServletContext
- 生命周期:
- 随Web应用启动时创建,随着Web应用停止而销毁。
- 作用域: 整个Web应用范围内共享(所有用户、所有请求)。
- 使用场景:
- 用于存储全局配置或共享数据,如应用名称、资源路径。
- 适合需要在整个应用中使用的静态或全局信息。
- 示例:
ServletContext context = getServletContext(); context.setAttribute("appName", "JavaWebApp");
-
总结:不同作用域对象的对比
对象 生命周期 作用范围 使用场景 PageContext 当前JSP页面执行期间 当前页面 临时数据存储,用于当前页面中的局部变量 ServletRequest 请求开始 -> 响应返回 一次请求内 短期数据存储,如表单数据、查询参数 HttpSession 会话开始 -> 会话超时或手动销毁 用户会话内 存储用户特定的数据,如登录信息、购物车数据 ServletContext 应用启动 -> 应用停止 整个Web应用 全局共享数据,如应用配置、统计信息
-
为什么不同作用域对象有不同的使用场景?
-
生命周期不同:
- 短生命周期对象(如
ServletRequest
)适合短期任务,长生命周期对象(如ServletContext
)适合全局任务。
- 短生命周期对象(如
-
作用范围不同:
- 仅在当前页面需要的数据,适合用
PageContext
。 - 跨页面或组件共享的数据,使用
ServletRequest
或HttpSession
。 - 全局范围的数据使用
ServletContext
。
- 仅在当前页面需要的数据,适合用
-
并发性和安全性:
HttpSession
和ServletContext
需要考虑多用户访问的线程安全问题。ServletRequest
和PageContext
是线程私有的,无需担心并发。
- 加载应⽤用默认参数
- Web.xml
<context-param>
<param-name>url</param-name>
<param-value>www.cnblogs.com/gaze</param-value>
</context-param>
<context-param>
<param-name>username</param-name>
<param-value>gaze</param-value>
</context-param>
获取api
servletContext.setAttribute("csdn", "https://www.csdn.net/")
:
- 作用: 将一个属性存储到
ServletContext
对象中。这个属性在整个 Web 应用范围内都可以访问。- 键值对: 键为
"csdn"
,值为"https://www.csdn.net/"
。- 存储的数据可以被同一 Web 应用的其他 Servlet 或 JSP 页面共享。
servletContext.getAttribute("csdn")
:
- 作用: 根据属性名(这里是
"
csdn
"
)从ServletContext
中获取对应的值。- 如果
"
csdn
"
尚未存储,则返回null
。- 我想说:
如果userServlet设置属性,在TestServlet也可以访问,因为存在ServletContext存储数据可以被其他servlet或jsp页面共享
ServletContext servletContext = req.getServletContext();
servletContext.setAttribute("csdn","https://www.csdn.net/");
ServletContext servletContext = req.getServletContext();
String csdn= (String)servletContext.getAttribute("csdn");