zoukankan      html  css  js  c++  java
  • ServletContext对象

    一、ServletContext对象的引入

    ServletContext对象,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用只有一个Servlet对象。

    二、Servlet对象的创建和获得

    ServletContext的生命周期

      生:服务器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。销毁:服务器关闭或者当前应用删除。

    二、ServletContext对象的创建:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //得到ServletContext的方式1:通过ServletConfig对象的getServletContext()的方法
            ServletContext context=this.getServletConfig().getServletContext();
            //得到ServletContext的方式2
            context=this.getServletContext();
        
        } 

    三、ServletContext的作用

    1.多个Servlet通过ServletContext对象实现数据共享。

      由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

    2.获取WEB应用的初始化参数,类似于ServletConfig。

    <context-param>   
    
      <param-name>url</param-name>   
    
      <param-value>jdbc:mysql://localhost:3306/ordername</param-value>   
    
     </context-param>   

    3、实现Servlet的转发:

    //Servlet的转发
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String date="ServletContext";
            //不能通过context,要通过request域
            this.getServletContext().setAttribute("date", date);
            RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/demo.jsp");
            rd.forward(request, response);    
        }

    转发给 demo.jsp

      <body>
      <h1>
          <font color="red">
        <%
            String date=(String)application.getAttribute("date");
            out.write(date);
         %>
         </font>
         </h1>
      </body>

    4.利用ServletContext对象读取资源文件。

    db.properties

    url = "jdbc:mysql://localhost:3306/test"
    username="root"
    name="root"

     在实际开发中,用作资源文件的文件类型,通常是:xml、properties.读取XML文件需要对文件进行解析。今天我们学习对properties文件进行读取的方法。在web工程中,我们一般来说,是不能采用传统方式读取配置文件的,因为读取写文件的地址相对的是jvm的启动目录(tomcat的bin目录),所以我们要使用web绝对目录来获取配置文件的地址。 

    第一种:使用ServletContext的getResourceAsStream方法:返回资源文件的读取字节流

      public  void test1() throws IOException{
            InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
            Properties props=new Properties();
            props.load(in);
            String url=props.getProperty("url");
            String username=props.getProperty("username");
            String password=props.getProperty("password");
            
            System.out.println(url);
            System.out.println(username);
            System.out.println(password);
        }

    第二种:使用ServletContext的getRealPath方法,获得文件的完整绝对路径path,再使用字节流读取path下的文件

        public void test2() throws IOException{
            String path =this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
            FileInputStream in=new FileInputStream(path);
         ////相比第一种方法的好处是:除了可以获取数据,还可以获取资源文件的名称 String filename
    =path.substring(path.lastIndexOf("\")+1); System.out.println(filename); Properties props=new Properties(); props.load(in); String url=props.getProperty("url"); String username=props.getProperty("username"); String password=props.getProperty("password"); System.out.println(url); System.out.println(username); System.out.println(password); }

     Web工程中,不同的资源文件的读取方式:

    A.当资源文件在包下面时,即在src下边建立的包下边:src/cn.lyjs.context/db.properties

    InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/cn/lyjs/context/db.properties");

    B.资源文件在web-inf下

     in = this.getServletContext().getResourceAsStream("/WEB-INF/db.properties");

    C.资源文件在web工程中

    in = this.getServletContext().getResourceAsStream("/db.properties");

     5、在非servlet程序中如何读取配置文件:用类装载器

    public class Userdao {
        //如果读取资源文件的程序不是Servlet的话,我们只能通过加载器来读
        public void update() throws IOException{
            InputStream in=Userdao.class.getClassLoader().getResourceAsStream("db.properties");
            Properties prop=new Properties();
            prop.load(in);
            System.out.println(prop.getProperty("url"));
        }
    }

     缺点:在线程休眠过程中,即使改动了资源文件,获取到的还是原始内容,类加载器只加载一次

    解决方法:使用绝对地址来访问

        public void update2() throws IOException{
            String path=Userdao.class.getClassLoader().getResource("db.properties").getPath();
            FileInputStream in=new FileInputStream(path);
            Properties prop=new Properties();
            prop.load(in);
            System.out.println(prop.getProperty("url"));
        }

    注意:用类装载器读取资源文件时,千万要注意,资源文件绝对不能太大,否则极易导致内存溢出

  • 相关阅读:
    net core 使用 rabbitmq
    asp.net core WebApi 返回 HttpResponseMessage
    asp.net core 2.1 WebApi 快速入门
    JQuery EasyUI combobox动态添加option
    php截取字符去掉最后一个字符
    JQuery EasyUI Combobox的onChange事件
    对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成
    Access2007 操作或事件已被禁用模式阻止解决办法
    Easyui 中 Tabsr的常用方法
    Win 7 IE11不能下载文件,右键另存为也不行
  • 原文地址:https://www.cnblogs.com/lyjs/p/4869930.html
Copyright © 2011-2022 走看看