ServletContext对象

ServletContext对象-三大域对象之一

  • Servlet三大域对象的应用 request,session,application(ServletContext)

简介

  • 作用:解决了不同用户的数据共享问题
  • 作用域:由服务器创建,所有用户共享,在整个项目内
  • 生命周期:服务器一启动时被创建,服务器关闭时被销毁
  • request:一个用户可以有多个;session:一个用户一个;ServletContext:所有用户共有一个。为了节省空间,提高效率,ServletContext中只放了必须的,重要的,所有用户需要共享的,又是安全的信息。

使用

 //获取ServletContext对象,有三种方式,都是同一个对象
        //1.从this获取
        ServletContext sc = this.getServletContext();
        //2. 从ServletConfig中虎丘
        sc = this.getServletConfig().getServletContext();
        //3. 从Session中获取
        sc = req.getSession().getServletContext();

        //数据操作,不同的用户也能对ServletContext对象进行数据存取,存取的数据不存在返回null
        //存储
        sc.setAttribute("name","老四");
        //获取
        String name = (String) sc.getAttribute("name");

        //获取网站根路径
        String contextPath = sc.getContextPath(); //http://localhost:8088/test/context 的 /test
        //获取版本信息
        String info = sc.getServerInfo(); //Apache Tomcat/8.0.21

        //获取应用名称,返回 web.xml 里的display-name 如<display-name>Archetype Created Web Application</display-name>
        String servletContextName = sc.getServletContextName(); //Archetype Created Web Application
        //获取文件真实路径
        String fileRealPath = sc.getRealPath("/WEB-INF/web.xml"); //D:\tomcat\apache-tomcat-8.0.21\webapps\test\WEB-INF\web.xml

getMimeType 获取MIME类型

        //获取MIME类型
        String MIMEType = sc.getMimeType("/WEB-INF/web.xml"); //application/xml

  • mime类型是容器内置的,可以在web.xml中配置
<!-- 设置类型,识别成功浏览器就会根据配置的类型自动调用相应的程序打开-->
  <mime-mapping>
    <extension>jsp</extension>
    <mime-type>text/plain</mime-type>
  </mime-mapping>

log() 输出日志

        //打印日志
        sc.log("好好吃");
        sc.log("没有异常",new RuntimeException("真的没有异常"));
  • 两个重载方法都是记录日志,如果已经放到tomcat下,则会输出到 /logs/localhost.yyyy-MM-dd.log,如果在idea下,可能会在C:\Users\用户名.IntelliJIdea2019.2\system\tomcat\war包名\logs下面

getResource和getResourceAsStream

  • getResource将指定路径的资源封装成URL实例并返回,getResourceAsStream获取指定路径资源的输入流InputStream并返回。

getRequestDispatcher和getNamedDispatcher
-将指定的资源包装成RequestDispatcher实例并返回。区别是前者根据资源路径(该路径相对于当前应用上下文根),后者根据资源的名称(通过服务器控制台或者web.xml里面配置的,比如web.xml里面配置servlet的名称)

 //获取分发器
        //根据路径获取 , localhost:8088/test/b
        RequestDispatcher dispatcher = sc.getRequestDispatcher("/b");
        //根据servletName获取
        RequestDispatcher dispatcher1 = sc.getNamedDispatcher("bServlet");
        dispatcher1.forward(req,resp);

获取WEB.xml的配置文件的配置数据

  • getInitParameter()和setInitParameter()和getInteParameterNames
  • 配置web.xml
<!--  可以设置多个-->
  <context-param>
    <param-name>eat</param-name>
    <param-value>pear</param-value>
  </context-param>
  <context-param>
    <param-name>lao</param-name>
    <param-value>难吃</param-value>
  </context-param>
        //获取
        //键值对获取
        String init = sc.getInitParameter("lao");
        //获取键名
        Enumeration<String> initNames = sc.getInitParameterNames();

编程式创建Servlet

  • 我们会使用到 ServletContainerInitializer 这个接口
    1. 用的是maven,要在resources目录下创建 MATE-INF目录,然后在MATE-INF目录下创建services目录和javax.servlet.ServletContainerInitializer文件,文件里面配置我们自己写的 ServletContainerInitializer 实现类的 全限定类名
    1. 编写实现类
@HandlesTypes(value = {HttpServlet.class}) //引入这个类型的实现类和子类
public class MyWebApplicationInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        //就是@HandlesTypes引入的实现类的类型
        for (Class clazz:set){
            System.out.println(clazz.getName());
        }
        //添加Servlet addServlet、createServlet、getServletRegistration、getServletRegistrations
        ServletRegistration.Dynamic  servlet= servletContext.addServlet("cServlet","cn.lzm.servlet.CServlet");
        //servlet.setInitParameter()//设置初始化参数
        //servlet.setLoadOnStartup(); //设置加载顺序
        servlet.addMapping("/c"); //设置路径

        //添加过滤器 addFilter、createFilter、getFilterRegistration、getFilterRegistrations

        //添加监听器 addListener、createListener

    }
}
posted @ 2021-02-07 18:16  阿肆啊  阅读(90)  评论(0编辑  收藏  举报