JavaWeb复习-003-ServletConfig和ServletContext

30 阅读3分钟

ServletConfig是什么?

ServletConfig是Servlet规范中的一员,ServletConfig是个接口,打印一下ServletConfig对象。 Pasted image 20240616144046.png org.apache.catalina.core.StandardWrapperFacade实现了Servlet接口,仅限Tomcat是这个名,别的服务器叫别的名字,但都遵守了Servlet规范。 Pasted image 20240616143417.png 再创建一个Servlet,测试,一个Servlet对象有一个对应的ServletConfig Pasted image 20240616145038.png Pasted image 20240616144106.png Pasted image 20240616144046.png ServletConfig对象都包含了的web.xml的配置信息,ServletConfig对象是Servlet对象的配置对象,可以获取比如name信息 Pasted image 20240616145334.png Pasted image 20240616145443.png 打印结果 Pasted image 20240616145517.png ServletConfig接口就这4个方法,其中初始化参数指的是web.xml的标签信息 Pasted image 20240616150556.png Pasted image 20240616150747.png 测试一下 Pasted image 20240616150909.png Pasted image 20240616150934.png 可以看到,拿到了初始化参数的信息 Pasted image 20240616151020.png

ServletContext

ServletContext是什么?
ServletContext是接口,是Servlet规范中的一员
获取ServletContext,注意:所有继承GenericServlet的类都可以,直接使用this调用相关的Servlet方法,因为内部都重载了 Pasted image 20240623142415.png Pasted image 20240623142641.png 打印结果 Pasted image 20240623142746.png ServletContext是谁实现的?
Web服务器实现了ServletContext接口
对于一个Webapp只有一个ServletContext对象
ServletContext是Servlet环境(上下文)对象 Pasted image 20240623150420.png Pasted image 20240623150505.png Pasted image 20240623150518.png 一个ServletContext对象通常对应的是一个web.xml文件
ServletContext接口常用方法
获取Context初始化参数
Context初始化参数是这个
Pasted image 20240628145851.png getInitParameter(String name):通过传入name获取对应初始化参数的值
getInitParameterNames():返回字符串类型的枚举,获取所有初始化参数的name
使用方法和之前差不多 Pasted image 20240628150726.png

public class ContextServletText extends GenericServlet {  
    @Override  
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {  
        res.setContentType("text/html");  
        PrintWriter writer = res.getWriter();  
  
        ServletContext servletContext = this.getServletContext();  
        //获取Context初始化参数  
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();  
        while (initParameterNames.hasMoreElements()) {  
            String name = initParameterNames.nextElement();  
            String value = servletContext.getInitParameter(name);  
            writer.print("<br>初始化参数名"+name);  
            writer.print("<br>初始化参数值"+value);  
        }  
    }  
}

Pasted image 20240628150805.png Context是全局信息,每一个Servlet都可以使用,Config是局部信息,只对指定的Servlet有用
获取应用的根--重要,项目在部署时,根路径是不确定的,就比如在Mac和Windows部署jar包中遇到的问题,所以需要动态获取根路径
在Servlet中动态获取路径使用这个方法:
getContextPath();
就如同文档说的,返回的是整个webapp的路径 Pasted image 20240628152634.png Pasted image 20240628152653.png

public class ContextServletText extends GenericServlet {  
    @Override  
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {  
        res.setContentType("text/html");  
        PrintWriter writer = res.getWriter();  
  
        ServletContext servletContext = this.getServletContext();  
        //获取Context初始化参数  
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();  
        while (initParameterNames.hasMoreElements()) {  
            String name = initParameterNames.nextElement();  
            String value = servletContext.getInitParameter(name);  
            writer.print("<br>初始化参数名"+name);  
            writer.print("<br>初始化参数值"+value);  
        }  
  
        // 获取Context path (获取上下文的根)  
        String contextPath = servletContext.getContextPath();  
        writer.print("<br>context的根:"+contextPath);  
    }  
}

打印结果

Pasted image 20240628152745.png 动态获取文件的绝对路径:getRealPath(String path);
使用方法 Pasted image 20240628155341.png 默认从web目录查找 Pasted image 20240628155412.png 日志记录 Pasted image 20240628160309.png ServletContext常用方法的基本使用

public class ContextServletText extends GenericServlet {  
    @Override  
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {  
        res.setContentType("text/html");  
        PrintWriter writer = res.getWriter();  

        ServletContext servletContext = this.getServletContext();  
        //获取Context初始化参数  
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();  
        while (initParameterNames.hasMoreElements()) {  
            String name = initParameterNames.nextElement();  
            String value = servletContext.getInitParameter(name);  
            writer.print("<br>初始化参数名"+name);  
            writer.print("<br>初始化参数值"+value);  
        }  
  
        // 获取Context path (获取上下文的根)  
        String contextPath = servletContext.getContextPath();  
        writer.print("<br>context的根:"+contextPath);  
  
        // 动态获取文件绝对路径  
        String realPath = servletContext.getRealPath("/index.txt");  
        writer.print("<br>绝对路径:"+realPath);  
  
        //记录日志  
        servletContext.log("这是一段运行正常的日志记录");  
    }  
}

idea创建的Tomcat会在这个路径,我是Mac的,idea是这个路径 Pasted image 20240630143134.png 查看日志文件 Pasted image 20240630143307.png ServletContext对象也可以叫做应用域,如果所有用户共享一份数据,并且这个数据很少被修改,量还很小,可以放在ServletContext应用域中
如果数据量大会非常占堆内存,ServletContext生命周期比较长
修改,必然存在线程并发所带来的安全问题
ServletContext对数据的存、取、删

// servletContext存  
servletContext.setAttribute("age", 17);  
// servletContext取  
Object age = servletContext.getAttribute("age");  
writer.print("<br>数据:"+age);  
// servletContext删  
servletContext.removeAttribute("age");  
Object age1 = servletContext.getAttribute("age");  
writer.print("<br>数据:"+age1);

Pasted image 20240630145828.png 删除之后取的就是null了。