ServletContext接口的学习

ServletContext接口的学习

  1. ServletContext是什么?

    ServletContext是接口,是Servlet规范中的一员。

  2. ServletContext是谁实现的?

    Tomcat服务器(WEB服务器)实现了ServletContext接口。

    public class org.apache.catalina.core.ApplicationContextFacade implements ServletContext {}
    
  3. ServletContext对象是谁创建的?在什么时候创建的?

    ServletContext对象在WEB服务器启动的时候创建。ServletContext对象是WEB服务器创建的。对于一个webapp来说,ServletContext对象只有一个。ServletContext对象在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。

    ServletContext对象是应用级对象。

  4. ServletContext怎么理解?

    Servlet对象的环境对象。(Servlet对象的上下文对象。)

    ServletContext对象其实对应的就是整个web.xml文件。

    50个学生,每个学生都是一个Servlet,这50个学生都在同一个教室当中。那么这个教室就相当于ServletContext对象。

    放在ServletContext对象当中的数据,所有Servlet一定是共享的。

    比如:一个教室中的空调是所有学生共享的,一个教室中的语文老师是所有学生共享的。

    Tomcat是一个容器,一个容器当中可以放多个webapp,一个webapp对应一个ServletContext对象。

    只要在同一个webapp当中,只要在同一个应用当中,所有的Servlet对象都是共享同一个ServletContext对象的。

    Tomcat服务器中有一个webapps文件夹,这个webapps下可以存放webapp,可以存放多个webapp,假设有100个webapp,那么就有100个ServletContext对象。但是,一个应用,一个webapp肯定是只有一个ServletContext对象。

  5. ServletContext接口中有哪些常用的方法?

    public String getInitParameter(String name); // 通过初始化参数的name获取value
    public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
    public String getRealPath(String path);// 获取文件的绝对路径(文件的真实路径)参数是从当前webapp路径开始的
    
    <!--以上两个方法是ServletContext对象的方法,这个方法获取的是什么信息?是以下的配置信息-->
    <context-param>
        <param-name>pageSize</param-name>
        <param-value>10</param-value>
    </context-param>
    <context-param>
        <param-name>startIndex</param-name>
        <param-value>0</param-value>
    </context-param>
    <!--注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配置信息会放到以上的标签当中。-->
    <!--如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用ServletConfig对象来获取。-->
    <!--这是ServletContext对象的配置信息,全局的配置信息-->
    
    public void log(String message);// 这是ServletContext对象记录日志的方法,日志记录到CATALINA_HOME/logs目录下。
    public void log(String message, Throwable t);
    // Tomcat服务器的logs目录下都有哪些日志文件?
    // catalina.日期.log --->服务器端的java程序运行的控制台信息。
    // localhost.日期.log --->ServletContext对象的log方法记录的日志信息存储到这个文件中。
    // localhost_access_log.日期.txt --->访问日志
    
    public String getContextPath(); // 获取webapp的根路径
    // 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径
    // 在java源码当中,不要将应用的根路径写死,因为你永远都不知道这个应用在最终部署的时候,起一个什么名字。
    
  6. ServletContext对象还有另一个名字:应用域(后面还有其他域,例如:请求域、会话域)

    如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,可以将这些数据放到ServletContext这个应用域中

    • 为什么是所有用户共享的数据?

      不是共享的没有意义。因为ServletContext这个对象只有一个。只有共享的数据放进去才有意义。

    • 为什么数据量要小?

      因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据量会影响服务器的性能。占用内存较小的数据量可以考虑放进去。

    • 为什么这些共享数据很少的修改,或者说几乎不修改?

      所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。

    数据量小、所有用户共享、又不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。因为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升执行效率。

    // 存(怎么向ServletContext应用域中存数据)
    public void setAttribute(String name, Object value); // map.put(k, v)
    // 取(怎么从ServletContext应用域中取数据)
    public Object getAttribute(String name); // Object v = map.get(k)
    // 删(怎么删除ServletContext应用域中的数据)
    public void removeAttribute(String name); // map.remove(k)
    
import jakarta.servlet.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class AServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        // 获取ServletContext对象
        ServletContext application = this.getServletContext();
        out.print(application + "<br>"); // org.apache.catalina.core.ApplicationContextFacade@a27c552

        // 获取上下文的初始化参数
        Enumeration<String> initParameterNames = application.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            String contextName = initParameterNames.nextElement();
            String contextValue = application.getInitParameter(contextName);
            out.print(contextName + "=" + contextValue + "<br>");
        }

        // 获取webapp的根路径
        String contextPath = application.getContextPath();
        out.print("webapp的根路径是:" + contextPath + "<br>");

        // 获取文件的绝对路径,这个绝对路径就是当前webapp的根
        String realPath = application.getRealPath("./web.xml");
        out.print(realPath + "<br>");

        // ServletContext对象的记录日志的方法
        application.log("这是ServletContext记录的日志,保存在CATALINA_HOME/logs目录下");
        application.log("这是另一个log方法,这个方法可以new出异常将异常保存在日志文件中",new RuntimeException("这是new的RuntimeException异常对象"));

        // 向ServletContext应用域当中存储数据
        application.setAttribute("message","这是向ServletContext应用域中存储数据的方法,存的是一个对象");
        // 取出来
        Object userObj = application.getAttribute("message");
        // 输出到浏览器
        out.print(userObj+"<br>");
        // 删除ServletContext应用域中的数据
        application.removeAttribute("message");
        out.print(application.getAttribute("message"));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值