Servlet学习笔记(五)ServletContext接口

1 ServletContext接口

ServletContext是Servlet与Servlet容器之间进行通信的接口。Servlet容器在启动一个Web应用的时候,会为它创建一个ServletContext对象。每个Web应用都有且只有一个ServletContext对象。我们可以把ServletContext对象形象的理解为Web应用的总管家。所有的Servlet都共享这一个总管家。Servlet要访问容器中的各种资源,都是通过这个总管家来访问的。
ServletContext提供的方法非常的多。我们将分类来概括

1,用于在Web应用范围内存取共享数据的方法

  • setAttribute(String name, Object
    obj):把一个Java对象和一个属性名绑定,并且存入到ServletContext中。name代表参数名字,obj代表共享数据的值
  • getAttribute(String
    name):根据参数给定的属性名,返回一个Object类型的对象,它表示ServletContext中与属性名匹配的属性值
  • getAttributeNames():
    返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。
  • removeAttribute(String name):根据参数指定的属性名,从ServletContext中删除匹配的属性

上面的这些属性,是针对于整个Web应用的属性。和我们request的attribute不一样,request的attribute只是针对当前这一次请求来得,相当于这个请求结束了之后,对应的request对象也会被销毁。并别不同的请求由不同的request对象。我们整个Web应用都共享一个ServletContext,所以不同的请求也可以访问到对应的属性。
1,首先我们再一个Servlet里面设置ServletContext的属性:

//获取对应的ServletContext对象
ServletContext context = getServletContext();
context.setAttribute("nvshen", "liyitong");

2,我们在另外一个ServletContext里面获取:

package com.vgxit.helloworld.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ContextTestServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        try (PrintWriter pw = response.getWriter()) {
            ServletContext context = getServletContext();
            Object nvshen = context.getAttribute("nvshen");
            if (nvshen == null) {
                pw.println("<h2>您还没有设置您的女神</h2>");
            } else {
                pw.println("<h2>您的女神是:" + nvshen + "</h2>");
            }
        }
    }
}

2 访问当前Web应用的资源

  • getContextPath():返回当前Web应用的URL入口
  • getInitParameter(String
    name):根据给定的参数名,返回Web应用范围内的匹配的初始化参数。这些参数都是在web.xml中,直接在<web-app>根元素下通过<context-param>元素定义的
  • getInitParameterNames():返回一个Enumeration对象,它包含了Web应用范围内所有的初始化参数名
  • getServletContextName():范围web应用的名字,就是web.xml中<display-name>元素的值。
  • getRequestDispatcher(String
    path):返回一个用于其他Web组件转发请求的RequestDispatcher对象。
package com.vgxit.helloworld.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ContextTestServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        try (PrintWriter pw = response.getWriter()) {
            ServletContext context = getServletContext();
            Object nvshen = context.getAttribute("nvshen");
            if (nvshen == null) {
                pw.println("<h2>您还没有设置您的女神</h2>");
            } else {
                pw.println("<h2>您的女神是:" + nvshen + "</h2>");
            }
            pw.println("<h2>" + context.getContextPath() + "</h2>");
            pw.println("<h2>" + context.getInitParameter("teacher") + "</h2>");
            pw.println("<h2>" + context.getInitParameter("course") + "</h2>");
            pw.println("<h2>" + context.getServletContextName() + "</h2>");
        }
    }
}

3 访问Servlet容器中其他Web应用

getContext(String uripath):根据参数指定的URI,返回当前Servlet容器中其他应用的ServletContext对象。

4 访问Servlet容器的相关信息

  • getMajorVersion():返回Servlet容器支持的Java Servlet Api的主版本号
  • getMinorVersion():返回Servlet容器支持的Java Servlet Api的次版本号
  • getServerInfo():返回Servlet容器的名字和版本

5 访问服务器端的文件系统资源

  • getRealPath(String path):根据参数指定的虚拟路径,返回文件系统中的一个真实路径
  • getResource(String path):返回一个映射到参数指定路径的URL
  • getResourceAsStream(String path):返回一个用于读取参数指定的文件的输入流
  • getMimeType(String file): 返回参数指定文件的MIME类型

6 输出日志

  • log(String msg):向Servlet的日志文件中写日志
  • log(String message, Throwable throwable):向Servlet日志文件中写入之日,以及异常的对战信息
  • log写入日志是写入到<CALINA_HOME>/logs目录下面的。但是我们在这个目录下面看不到,因为idea集成tomcat之后,我们改变了工作目录。如果我们要看到,我们可以通过如下目录查看:

在这里插入图片描述

2,ServletContext接口具体实例:

package com.vgxit.helloworld.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ContextTestServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        try (PrintWriter pw = response.getWriter()) {
            ServletContext context = getServletContext();
            Object nvshen = context.getAttribute("nvshen");
            if (nvshen == null) {
                pw.println("<h2>您还没有设置您的女神</h2>");
            } else {
                pw.println("<h2>您的女神是:" + nvshen + "</h2>");
            }
            pw.println("<h2>" + context.getContextPath() + "</h2>");
            pw.println("<h2>" + context.getInitParameter("teacher") + "</h2>");
            pw.println("<h2>" + context.getInitParameter("course") + "</h2>");
            pw.println("<h2>" + context.getServletContextName() + "</h2>");
            pw.println("<h2>" + context.getMajorVersion() + "</h2>");
            pw.println("<h2>" + context.getMinorVersion() + "</h2>");
            pw.println("<h2>" + context.getServerInfo() + "</h2>");
            pw.println("<h2>" + context.getRealPath("login.jsp") + "</h2>");
            pw.println("<h2>" + context.getMimeType("login.jsp") + "</h2>");

            context.log("当前的时间戳是:" + System.currentTimeMillis());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值