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"));
    }

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

 

posted @ 2015-10-11 20:20  好人难寻  阅读(264)  评论(0编辑  收藏  举报