全局域对象ServletContext

本文详细介绍了Servlet上下文(ServletContext)的使用,包括如何获取ServletContext对象、获取MIME类型以及共享数据和获取资源路径的功能。通过示例代码展示了ServletContext在获取服务器路径和设置/获取属性上的应用。
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;

@WebServlet("/ServletContextDemo")
public class TestServletContextOServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取web应用的全局域对象
        ServletContext servletContext = req.getServletContext();
        ServletContext servletContext1 = this.getServletContext();
        System.out.println(servletContext+"/"+servletContext1);
        //org.apache.catalina.core.ApplicationContextFacade@7b4a2189/
        //org.apache.catalina.core.ApplicationContextFacade@7b4a2189

        /*
        * 以上就是获取ServletContext对象的两种方法
        * 说明该对象可以在req中获取也可以在资源本身获取
        * */

        System.out.println("-------------------------------------------------------------------------------------------------");


        //context-type: 服务器告诉浏览器本次响应消息的响应体的数据格式以及编码格式
        /*
        * 通过对resp的学习可知
        * 服务器能在响应信息的响应头中
        * 设置响应体消息的数据格式以及编码格式
        * 那么响应体的数据格式是什么呢
        * 默认情况下是
        * text/html
        *
        * 这里要了解一个概念
        * 什么是Mime类型
        * 格式就是
        * 大类型/小类型
        * 例如text/html image/jpg
        * 可见mime类型就是泛指所有的响应体的数据格式
        *
        * ServletContext对象的功能之一就是能够获取mime类型
        * */
        String filename = "a.jpg";
        String mimeType = servletContext.getMimeType(filename);
        System.out.println(mimeType);


        /*以上就是Servletcontext的第一个功能: 获取mime类型*/
        System.out.println("-------------------------------------------------------------------------------------------------");

        /*void setAtribute(String name, Object object);   存储数据
          Object getAttribute(String name);   通过键获取值
          void removeAttribute(String name);  移除一个键值对
          作为范围最大的域对象
          自然少不了共享数据的功能

          这个域对象共享的是所有用户的所有请求的数据
          这个对象要谨慎使用
         */
        System.out.println("-------------------------------------------------------------------------------------------------");

        /*ServletContext对象最后一个功能就是
        * 可以很方便的获取web应用中的资源的地址
        *
        * 说到地址
        * 首先要了解一些概念
        * 什么是绝对地址
        * 什么是相对地址
        * 什么是本地项目文件的地址
        * 什么是服务器资源地址
        *
        *
        * Servletcontext对象正好可以十分方便的获取到资源的服务器路径
        * 使用getRealPath(String 本地项目文件路径)
        *
        * 以获取一个配置文件为例
        * 在一个EE项目中
        * 文件存放的位置有一下三个位置
        * 一个是src下
        * 一个是web目录下
        * 一个是web的WEB-INF目录下
        *
        *
        **/
        String a = servletContext.getRealPath("/WEB-INF/classes/a.xml");    //D:\IdeaProjects\88\out\artifacts\816_ServletContext_war_exploded\WEB-INF\classes\a.xml
        String b = servletContext.getRealPath("/b.xml");    //D:\IdeaProjects\88\out\artifacts\816_ServletContext_war_exploded\b.xml
        String c = servletContext.getRealPath("/WEB-INF/c.xml");    //D:\IdeaProjects\88\out\artifacts\816_ServletContext_war_exploded\WEB-INF\c.xml

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);


    }
}

### 定义 共享对象指在特定的应用程序内,多个组件、模块或进程能够共同访问和使用的对象。它可以是数据对象、服务对象等,在应用程序运行过程中起到数据共享和交互的作用。例如在 Java Web 应用中,ServletContext 官方叫 Servlet 上下文,服务器会为每一个工程创建一个 ServletContext 对象,这个对象全局唯一,工程内所有的 Servlet 都共享这个对象,所以它是一种全局应用程序共享对象,可看作共享对象的一种具体形式 [^3]。 ### 用途 - **数据共享**:多个组件之间可以通过共享对象来交换数据。比如在一个 Web 应用中,不同的 Servlet 可能需要共享一些配置信息,这些信息可以存储在共享对象中,各个 Servlet 都能访问到这些数据。 - **状态管理**:用于维护应用程序的状态。例如在一个多页面的 Web 应用中,用户的登录状态可以存储在共享对象中,这样在不同的页面中都能判断用户是否已经登录。 - **服务提供**:共享对象可以封装一些公共的服务,供多个组件调用。比如一个共享的数据库连接池对象,多个数据访问模块可以通过这个对象获取数据库连接。 ### 实现方式 #### Java Web 中的实现 在 Java Web 应用中,常见的共享对象ServletContext、HttpSession 和 ServletRequest。 - **ServletContext**: ```java // 获取 ServletContext 对象 ServletContext context = getServletContext(); // 设置共享属性 context.setAttribute("sharedData", "This is shared data"); // 获取共享属性 String data = (String) context.getAttribute("sharedData"); ``` - **HttpSession**: ```java // 获取 HttpSession 对象 HttpSession session = request.getSession(); // 设置会话属性 session.setAttribute("userName", "John"); // 获取会话属性 String userName = (String) session.getAttribute("userName"); ``` - **ServletRequest**: ```java // 设置请求属性 request.setAttribute("message", "Hello, World!"); // 获取请求属性 String message = (String) request.getAttribute("message"); ``` #### Windows 系统中的实现 在 Windows 系统中,可以通过跨越进程边界共享内核对象来实现某种程度的共享。例如创建一个可继承的互斥对象: ```c #include <windows.h> int main() { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; HANDLE hMutex = CreateMutex(&sa, FALSE, NULL); // 使用互斥对象 // ... CloseHandle(hMutex); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值