自学内容网 自学内容网

Javaweb开发核心之应用上下文知识(笔记)

 什么是应用上下⽂ServletContext

简介:讲解Javaweb作⽤用域对象介绍和ServletContext讲解

1.理解应用上下文

  • 定义: 应用上下文是一个ServletContext对象,表示整个Web应用的全局信息和状态。它在Web应用启动时创建,在应用停止时销毁。
  • 作用:
    • 全局信息共享: 可存储应用范围内的共享数据。
    • 配置管理: 提供访问全局初始化参数的接口。
    • 资源管理: 用于获取Web应用中的资源(如文件、数据库连接等)。

2.什么是作用域对象:

就是对象的生命周期,在javaweb开发里⾯有多个不同⽣命周期的对象
⽐比如:PageContext,ServletRequest,HttpSession,ServletContext;
对象里面包含属性和对应的数据,所以不同作用域对象使⽤场景会不同

PageContext

  • 生命周期:
    • 存在于JSP页面的处理过程中。当前JSP页面处理结束后,PageContext对象即被销毁。
  • 作用域: 仅限于当前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
    • 跨页面或组件共享的数据,使用ServletRequestHttpSession
    • 全局范围的数据使用ServletContext
  • 并发性和安全性:

    • HttpSessionServletContext需要考虑多用户访问的线程安全问题。
    • ServletRequestPageContext是线程私有的,无需担心并发。
  •  加载应⽤用默认参数
  • 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");

原文地址:https://blog.csdn.net/weixin_67996964/article/details/143840263

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!