JavaWeb笔记-09-ServletContext域对象及操作、访问量统计案例

1、域对象了解(四种)


PageContext(jsp页面) :当前页面与标签 之间共享数据。
ServletRequest(一次请求)
HttpSession(一次会话)
ServletContext(整个web应用)

其中后三个又称Servlet三大域

域对象功能:存数据,取数据,删数据等
功能原理:域对象内部有一个 map 用来存储数据
域对象都有的三个方法:
    1void setAttribute(String name ,Object value): 存数据
            用来存储一个域属性,name为属性名 value为属性值

    2Object getAttribute(String name):取数据
            eg: 获取名为xxx的域属性  需要将Object类型强转为String类型
               String value = (String)servletContext.getAttribute("xxx");

    3void removeAttribute(String name): 删除数据

2、ServletContext域对象概述


是JavaWeb四大域对象之一

作用:在整个web应用的动态资源之间共享数据
    --使用ServletContext对象给N多个servlet传递数据。

特性:  
唯一性:一个项目只有一个ServletContext对象
生命周期:ServletContext对象在服务器启动时创建,服务器关闭时销毁。


获取ServletContext对象的方法:

1)Servlet类中
    在init(ServletConfig config)中,
    ServletContext context = config.getServletContext();

2)GenericeServlet或HttpServlet类中
    this.getServletContext();

3)HttpSession类  .getServletContext();
4)ServletContextEvent类   .getServletContext();

3、ServletContext对象操作数据的方法:


1)void setAttribute(String name ,Object value): 存数据
        用来存储一个域属性,name为属性名 value为属性值

2)Object getAttribute(String name):取数据
        eg: 获取名为xxx的域属性  需要将Object类型强转为String类型
           String value = (String)servletContext.getAttribute("xxx");

3)void removeAttribute(String name): 删除数据

4)Enumeration getAttribute(): 获取所有域属性的名称、

演示一: 在ServletContext中保存数据

    步骤:
        1. 获取ServletContext对象
        2. 调用setAttribute()方法完成保存数据

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //1. 获取ServletContext对象
        ServletContext application = this.getServletContext();

        //2. 调用setAttribute()方法完成保存数据
        application.setAttribute("name", "张三"); 
    }

演示二: 在ServletContext中获取数据


    步骤:
        1. 获取ServletContext对象
        2. 调用getAttribute()方法完成获取数据

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //1. 获取ServletContext对象
        ServletContext application = this.getServletContext();

        //2. 调用getAttribute()方法完成获取数据,并输出
        String name = (String)application.getAttribute("name");
        System.out.println(name);   
    }   

4、ServletContext获取应用初始化参数。


背景:每个Servlet只能获取自己的初始化参数

        --配置的公共初始化参数,需要通过ServletContext使用

配置:在web.xml文件中使用<context-param>标签
    配置示例: <context-param>
            <param-name> name1 </param-name>   //参数名
            <param-value> value1 </param-value>   //参数值
           </context-param>

    调用步骤:
        1)继承HttpServlet
        2)得到ServletContext对象
        3)调用getInitParameter(String name)   //传参为参数名

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        //2. 获取ServletContext对象
        ServletContext application = this.getServletContext();

        //3. 调用setAttribute()方法完成保存数据
        String value1 = application.getInitParameter("name1");  
    }

5、ServletContext获取真实路径(重点


    背景介绍:当项目发布后,地址被改动时。则需要动态得到真实路径
    演示:
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    获取真实路径:

    方式1//用this获取ServletContext对象 并调用.getRealPath("");方法
        String path = this.getServletContext().getRealPath("index.jsp");

        //得到的是盘符路径。
        //E:\apache-tomcat-7.0.88\webapps\day09_2\index.jsp
        System.out.println(path);

        //得到资源流
        InputStream input = new FileInputStream(path);


    方式二:以上三条语句合并

        //获取路径后,直接创建输入流对象
        InputStream input2 = this.getServletContext().getResourceAsStream(path);


    获取所有文件路径:

        //使用context.getResourcePaths("/文件路径");    路径前必须有"/"
        Set<String> paths = this.getServletContext().getResourcePaths("/WEB-INF");  

        //输出内容:[/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/web.xml]
        System.out.println(paths);

    }

6、案例: 访问量统计


原理:使统计值被所有Servlet共享。

思路:最初时,ServletContext中没有保存访问量相关的属性
      当本站第一次被访问时,创建一个保存访问数的变量,初值为一;保存到ServletContext中
      以后访问时,从ServletContext中获取变量,对变量+1

步骤:
    1)获取ServletContext对象
    2)查看获取是否存在count属性
        不存在:存数据,设初值为一   .setAttribute("count",1);
        存在:设置原有数值加一  .setAttribute("count",count+1);
    //1)获取ServletContext对象
        ServletContext app = this.getServletContext();

        //2)获取是否存在count属性 方法返回值为Object 则强转为count
        Integer count = (Integer) app.getAttribute("count");
        if(count == null){
            app.setAttribute("count", 1);   //bug--初值为null
        }else{
            app.setAttribute("count", count+1);
        }
        //3)向浏览器输出   需要使用响应对象
        PrintWriter out = response.getWriter();
        out.print("<h1>"+ count +"</h1>");

7、获取类路径下的资源


类路径: 对于javaweb项目而言;
    是/WEB-INF/classes 和/WEB-INF/lib/*.jar (lib下每一个jar包)

理解:
src下内容会在/WEB-INF/classes中出现,,同时.java会编译成.class

class
Classloader:类加载器 从的WEB-INF\class文件夹下找.class文件来加载类
    步骤:
        //相对于/classes目录 
        1)得到class 再得到ClassLoader   
        ClassLoader cl = this.getClass().getclassLoader();

        2)调用getResourceAsStream()  得到InputStream
        InputStream input = cl.getResourceAsStream("a.text");

        3)导入jar包 
        commons-io-1.4.jar

        //读取输入流内容,转成字符串输出
        4String s = IOUtils.toString(input);


        //相对于.class文件所在目录(包内) 
        1)步骤替换为
        ClassLoader cl = this.getClass()

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/81277219
今日推荐