servlet中的ServletContext对象

ServletContext官方叫Servlet上下文。服务器会为每一个Web应用创建一个ServletContext对象。这个对象全局唯一,而且Web应用 中的所有Servlet都共享这个对象(在整个web应用中只有一个ServletContext对象)。所以叫全局应用程序共享对象

 

 

 ServletContext对象的作用

  相对路径转绝对路径

  相对路径的相对点是以web项目的根作为相对点

  • context.getRealPath("path")

    将一个相对路径转换为绝对路径,在文件上传与下载时需要用到该方法做路径的转换。

        //获取ServletContext对象,继承自GenericServlet类
        ServletContext servletContext=this.getServletContext();
        //将相对路径转换为绝对路径
        String realpath=servletContext.getRealPath("image/樱花.jpg");

 

 

  获取容器的附加信息

    获取当前Tomcat不同的基本信息

  • servletContext.getServerInfo()

    返回Servlet容器的名称和版本号

  • servletContext.getMajorVersion() 

    返回Servlet容器所支持Servlet的主版本号。

  • servletContext.getMinorVersion()

    返回Servlet容器所支持Servlet的副版本号。

 

复制代码
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.IOException;
import java.io.PrintWriter;

@WebServlet("/getbaseinfo")
public class GetBaseInfo 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 {
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");
        //获取响应输出流
        PrintWriter pw=resp.getWriter();
        //获取servletContext对象
        ServletContext servletContext=this.getServletContext();

        //获取servlet容器名称和版本号
        String serverinfo=servletContext.getServerInfo();
        //获取Servlet容器所支持Servlet的主版本号
         int major=servletContext.getMajorVersion();
        //获取Servlet容器所支持Servlet的副版本号
        int minor=servletContext.getEffectiveMinorVersion();

        //输出到客户端浏览器
        pw.println("容器名称及版本号:"+serverinfo);
        pw.println("主版本号:"+major);
        pw.println("副版本号:"+minor);

        pw.flush();
        pw.close();

    }
}
复制代码

 

 

 

  读取配置信息

 

    读取web.xml特定节点所给定的内容

复制代码
 <!--param-name的名称不能重复-->
 <context-param>
        <param-name>key1</param-name>
        <param-value>value1</param-value>
    </context-param>
    <context-param>
        <param-name>key2</param-name>
        <param-value>value2</param-value>
    </context-param>
    <context-param>
        <param-name>key3</param-name>
        <param-value>value3</param-value>
    </context-param>
    <context-param>
        <param-name>key4</param-name>
        <param-value>value4</param-value>
    </context-param>
复制代码

 

  • servletContext.getInitParameter("key")

    读取web.xml文件中标签中的配置信息。

  • servletContext.getInitParameterNames()

    读取web.xml文件中所有param-name标签中的值。

 

复制代码
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取servletContext对象
        ServletContext servletContext=this.getServletContext();
        //获取所有<param-name>的值,返回枚举类型
        Enumeration<String > en=servletContext.getInitParameterNames();
        //遍历所有<param-name>
        while (en.hasMoreElements()){
            //获取每一个name
            String name=en.nextElement();
            //根据key获取value
            String value=servletContext.getInitParameter(name);
            //输出到控制台
            System.out.println(name+":"+value);
        }

    }
复制代码

 

 

 

 

  全局容器

    当Tomcat启动后,会为当前web应用创建一个ServletContext对象。在一个web应用中,所有的servlet对应同一个ServletContext对象

  •   servletContext.setAttribute("key",ObjectValue)

      向全局容器中存放数据。

  •  servletContext.getAttribute("key")

      从全局容器中获取数据。

  •  servletContext.removeAttribute("key")

      根据key删除全局容器中的value。

 

复制代码
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.IOException;
import java.io.PrintWriter;

@WebServlet("/global")
public class GlobalContarner 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 {
        resp.setContentType("text/html;charset=utf-8");
        //获取ServletContext对象
        ServletContext servletContext=this.getServletContext();
        //获取全局容器的数据
        String name=(String) servletContext.getAttribute("name");
        String id=(String) servletContext.getAttribute("id");

        //获取响应输出流
        PrintWriter pw=resp.getWriter();
        //向客户端浏览器响应数据
        pw.println("name:"+name);
        pw.println("id"+id);

        //刷新流
        pw.flush();
        //输出流
        pw.close();
    }

    /**
     * 向ServletContext对象中初始化数据
     * @throws ServletException
     */
    //当Servlet被实例化后,Tomcat会立即调用init()方法,可用该方法向全局容器中添加数据
    @Override
    public void init() throws ServletException {
        ServletContext servletContext=this.getServletContext();
        servletContext.setAttribute("name","张三");
        servletContext.setAttribute("id","123456");
    }
}
复制代码

 

 

 ServletContext对象生命周期

1)当容器启动时会创建ServletContext对象并一直缓存该对象

2)容器关闭后该对象生命周期结束

3)由于ServletContext对象的生命周期非常长,所以在使用全局容器时不建议存放业务数据。如果在ServletContext对象中存放了业务数据,同时也在database中存放了相同的数据,当database做了修改而ServletContext对象中的数据没有及时同步的话便会出现“张冠李戴”的风险

 

posted @   chaplu  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示