ServletContext(重要)

目录
    1、ServletContext概述
    2、获取ServletContext
    3、域对象的功能
    4、获取项目初始化参数
    5、获取资源相关方法
    6 练习:访问量统计
=====================================        
1、ServletContext概述
    服务器会为每个项目创建一个ServletContext对象,一个项目只有一个ServletContext上下文对象!
    我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!
    与服务器同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会被销毁死去!
    作用: 在整个Web应用的动态资源之间共享数据!
    例如:在AServlet中向ServletContext对象中保存一个值,然后在BServlet中就可以获取这个值,这就是共享数据了。

2、获取ServletContext
    * ServletConfig 接口中 getServletContext()方法;
    * GenericServlet 类中 getServletContext()方法;

    在Servlet接口中获取ServletContext对象:
    * 在void init(ServletConfig config)中:
            ServletContext context = config.getServletContext();
            ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;
    在GenericeServlet或HttpServlet中获取ServletContext对象:
    * GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;
    public class MyServlet implements Servlet {
        public void init(ServletConfig config) {
            ServletContext context = config.getServletContext();
        }
        …
    }
    public class MyServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) {
            ServletContext context = this.getServletContext();
        }
    }

3、域对象的功能
    ServletContext是JavaWeb四大域对象之一:
        * PageContext;
        * ServletRequest;
        * HttpSession;
        * ServletContext;
    所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:
    * void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性。
    * Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行。
    * void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,
                那么本方法什么都不做;
    * Enumeration getAttributeNames():获取所有域属性的名称;

4、获取项目初始化参数
    * 一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备!
    * 可以配置公共的初始化参数,为所有Servlet而用!这需要使用ServletContext才能使用!
    还可以使用ServletContext来获取在项目web.xml文件中配置的应用初始化参数!
    注意,项目初始化参数与Servlet初始化参数不同:
    web.xml
    <web-app>
        ...
        <context-param>    [配置了两个应用初始化参数]
            <param-name>paramName1</param-name>
            <param-value>paramValue1</param-value>
        </context-param>

        <context-param>
            <param-name>paramName2</param-name>
            <param-value>paramValue2</param-value>
        </context-param>
    </web-app>
    ServletContext context = this.getServletContext();  [获取ServletContext对象]
    String value1 = context.getInitParameter("paramName1");
    String value2 = context.getInitParameter("paramName2");

    Enumeration names = context.getInitParameterNames();[获取所有应用初始化参数名称]
    while(names.hasMoreElements()) {
        System.out.println(names.nextElement());  //会得到 paramName1,paramName2
    }

5、获取资源相关方法
    5.1、获取真实路径(*****)
        还可以使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,
    现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。
        * 获取a.txt的真实路径:String realPath = servletContext.getRealPath(“/a.txt”),
                realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt;
        * 获取b.txt的真实路径:String realPath = servletContext.getRealPath(“/WEB-INF/b.txt”);

    5.2、获取资源流
        不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:
        * 获取a.txt资源流:InputStream in = servletContext.getResourceAsStream(“/a.txt”);
        * 获取b.txt资源流:InputStream in = servletContext.getResourceAsStream(“/WEB-INF/b.txt”);

    5.3、获取指定目录下所有资源路径
        还可以使用ServletContext获取指定目录下所有资源路径,例如获取/WEB-INF下所有资源的路径:
            Set set = context.getResourcePaths("/WEB-INF");
            System.out.println(set);
            [/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/b.txt, /WEB-INF/web.xml]
        注意,本方法必须以“/”开头!!!

6 练习:访问量统计
    一个项目中所有的资源被访问都要对访问量进行累加!
    创建一个int类型的变量,用来保存访问量,然后把它保存到ServletContext的域中,这样可以保存所有的Servlet都可以访问到!

    相信各位一定见过很多访问量统计的网站,即“本页面被访问过XXX次”。因为无论是哪个用户访问指定页面,
    都会累计访问量,所以这个访问量统计应该是整个项目共享的!很明显,这需要使用ServletContext来保存访问量。
    ServletContext application  = this.getServletContext();   [获取ServletContext对象]
    Integer count = (Integer)application.getAttribute("count")   [获取ServletContext对象中的count属性];
    if(count == null) {
        count = 1; [如果在ServletContext中不存在count属性,那么设置count的值为1,表示第一次被访问。]
    } else {
        count++; [如果在ServletContext中存在count属性,说明以前被访问过,那么让count在原来的基础上加1。];
    }
    response.setContentType("text/html;charset=utf-8");
    // response.setHeader("Content-Type","text/html;charset=utf-8"); 设置头信息(文本类型和编码),等同于上面
    response.getWriter().print("<h1>本页面一共被访问" + count + "次!</h1>")[向客户端响应本页面被访问的次数。];
    application.setAttribute("count", count);[覆盖保存count的值到ServletContext对象中。]

猜你喜欢

转载自blog.csdn.net/weixin_42472048/article/details/81607786