Fork me on GitHub

ServletContext

1. ServletContet 概述

  • 一个项目只有一个 ServletContext 对象;
  • ServletContext 对象在服务器启动时创建;
  • ServletContext 对象在服务器关闭时销毁;
  • ServletContext 的生命周期: 与天地同寿!!!

ServletContext 对象的作用: 在整个 Web 应用的动态资源之间共享数据!例如在 AServlet 中向
ServletContext 对象中保存一个值,然后在 BServlet 中就可以获取这个值.

2. 获取 ServletContext

  • ServletConfig 类中有 getServletContext() 方法
// 1. 在 Servlet 接口中获取 ServletContext 对象

public class MyServlet implements Servlet{

    public void init(ServletConfig config){
        ServletContext context = config.getServletContext();
    }
}

// 2. 在 GenericServlet 或 HttpServlet 中获取 ServletContext 对象

public class Myservlet extends HttpServlet{

    public void doGet(HttpServletRequest req, HttpServletResponse resp){
        ServletContext context = this.getServletContext();
    }
}

// 3. HttpSession 中也有 getServletContext() 方法

// 4. ServletContextEvent 中也有 getServletContext() 方法

3. 域对象的功能

  1. JavaWeb 四大域对象:
    • PageContext;
    • ServletRequest;
    • HttpSession;
    • application(ServletContext);
  2. 所有域对象都有存储数据的功能, 因为域对象内部有一个 Map, 用来存储数据.
  3. ServletContext 对象用来操作数据的方法
    // 存储一个对象, 也称为存储一个域属性.
    // 多次使用相同 name 调用该方法, 会覆盖上一次的值
    void setAttribute(String name, Object value);

    // 获取 ServletContext 中的数据
    Object getAttribute(String name);

    // 移除 ServletContext 中的域属性
    void removeAttribute(String name);

    // 获取所有域属性的名称
    Enumeration getAttributeNames();

4. 获取应用初始化参数

  1. 可以使用 ServletContext 来获取 web.xml 文件中配置的应用初始化参数!
    注意, 应用初始化参数与 Servlet 初始化参数不同
<web-app>
    // 应用初始化参数
    <context-param>  
        <param-name>paramName2</param-name>
        <param-value>paramValue2</param-value>
    </context-param>
    <context-param>
        <param-name>paramName3</param-name>
        <param-value>paramValue3</param-value>
    </context-param>
</web-app>

5. 获取资源相关方法

// 1. 获取真实路径
// 获取 a.jsp 的真实路径, 返回值为: F:\tomcat6\webapps\hello\a.jsp
    String realPath = servletContext.getRealPath("/a.jsp");

// 获取 b.jsp 的真实路径
    String realPath = servletContext.getRealPath("/WEB-INF/b.jsp");

// 2. 获取资源流
// 获取 a.jsp 资源流
    InputStream in = servletContext.getResourceAsStream("/a.jsp");

// 获取 b.jsp 资源流
    InputStream in = servletContext.getResourceAsStream("WEB-INF/b.jsp");

// 3. 获取指定目录下所有资源路径
// 获取 /WEB-INF 下所有资源的路径
    Set set = servletContext.getResourcePaths("/WEB-INF");

6. 练习: 访问量统计

ServletContext application = this.getServletContext();
Integer count = (Integer)application.getAttribute("count");

if(count == null){
    count = 1;
} else {
    count++;
}

response.setContextType("text/html;charset=utr-8");

// 向浏览器输出 count 值
response.getWriter().print("<h1>本页面一共被访问" + count + "次! </h1>");
application.setAttribute("count",  count); // 将 count 值保存回 servletContext 中

7. 获取类路径下的资源

  1. 类路径对一个 JavaWeb 项目而言, 就是 "/WEB-INF/classes" 下的文件, 以及 "/WEB-INF/lib"下的 jar 包;
  2. 有两种方式:
    • Class (了解)
    • ClassLoader
  3. 步骤:
    • 得到 Class;
    • 得到 ClassLoader;
    • 调用其 getResourceAsStream() 方法, 得到一个 InputStream
// 1. 使用 ClassLoader 获取类路径下的资源
// 获取 src 目录下的 a.txt
    // 获取 ClassLoader
    ClassLoader c2 = this.getClass().getClassLoader();

    // 得到 InputStream
    InputStream in = c2.getResourceAsStream("a.txt");   // 该路径相对于 classes 路径, 即 src 目录下

    // 将输入流转换成字符串, 使用 commons-io-2.5 的 jar 包中的 IOUtils 工具
    String s = IOUtils.toString(in);


// 2. 使用 Class 获取类路径下的资源
    Class c = this.getClass();

    // 相对当前 .class 文件所在目录!
    // 即相对于 cn/itcast/servlet  文件夹内的 a.txt
    InputStream input = c.getResourceAsStream("a.txt");

    // 如果 a.txt 在 src 目录下
    // 相对 classes 目录下, 注意, 路径中带有 "/"
    InputStream input = c.getResourceAsStream("/a.txt");

**参考资料:** - [JavaWeb 视频教程](https://www.bilibili.com/video/av12760389/index_2.html#page=13) - [JavaEE 6.0 文档](http://tool.oschina.net/apidocs/apidoc?api=javaEE6)
posted @ 2017-09-22 22:27  小a的软件思考  阅读(286)  评论(0编辑  收藏  举报