1. 程式人生 > >ServletConfig和ServletContext詳解

ServletConfig和ServletContext詳解

ServletConfig

  • ServeltConfig代表了Servlet的配置資訊的物件。
  • 在web.xml中配置Servelt的初始化引數

如:

<servlet>
        <servlet-name>Demo1</servlet-name>
        <servlet-class>com.demo.Demo1</servlet-class>
        <init-param>
            <param-name>data</param-name>
            <param-value
>
xxx</param-value> </init-param> </servlet>
  • 在Demo1中,我們可以直接獲取到配置資訊
ServletConfig config = this.getServletConfig();
String str = config.getParamater("data");
  • ServletConfig的生命週期
    他的宣告週期和Servlet是一樣的。
    在初始化Servlet時(init方法執行),web伺服器就把web.xml中Servlet的配置資訊封裝到Config傳遞給init(config)了。當Servlet物件摧毀時,ServletConfig也就沒有用了,隨著一起摧毀了。

ServletContext

ServletContext代表的是當前的web應用。
這個東西的作用可就大了去了。

  • 可以當做“域”來使用,即Context域
    這個域的作用範圍是整個web應用。也就是說,這個容器只有一個,且給web應用下的所有的Servlet用,且共享(A使用者將<”data”,”a”>存入域後,B使用者再將<”data”,”b”>存入域中,A使用者取出data來發現變成了b)

  • 可以獲取Web應用的初始化引數
    ( 這個要區別於上面的初始化引數。ServletConfig是針對某一個Servlet,而ServletContext是針對的這個web應用。)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <!-- 配置了Context的初始化引數 -->
    <context-param>
        <param-name>data1</param-name>
        <param-value>yyy</param-value>
    </context-param>

    <servlet>
        <servlet-name>Demo1</servlet-name>
        <servlet-class>com.demo.Demo1</servlet-class>
        <!-- 配置了ServletConfig的初始化引數 -->
        <init-param>
            <param-name>data</param-name>
            <param-value>xxx</param-value>
        </init-param>
    </servlet>
</web-app>
//在web應用的任一Servlet中均可以獲取ServletContext的配置資訊
ServletContext context = this.getServletContext();
String data1 = context.getInitParamater("data1");//yyy
  • 可以實現請求的轉發
ServletContext context=this.getServletContext();
context.getRequestDispatcher("/index.jsp").forward(request, response);
  • 讀取配置檔案

    • 首先我們使用傳統的方式來讀取配置檔案

          FileInputStream in = new FileInputStream("src/1.properties");//我們直接把配置檔案放在src下面
          Properties prop = new Properties();
          prop.load(in);  
          prop.getProperty("name");//隨便從配置檔案中獲取一個屬性

      這回丟擲了500,沒有找到相應的檔案。
      這是為什麼?因為new File(url)、new FileInputStream(url)……是使用的相對路徑,相對的是JVM目錄。在普通的Java工程中JVM的路徑就是Java工程所在的路徑。但是,在web工程中就不一樣了,JVM的路徑是tomcat的啟動目錄。

    • 讀取web應用中的資源可以使用ServletContext的getResourceAsStream()
    InputStream in = this.getServletContext().getResourceAsStream(url);//資源的路徑
    Properties prop = new Properties();
    prop.load(in);
    這裡的資源路徑是很重要的:
    1)在src目錄下面的資原始檔會對映到WEB-INF/classes下面,所以他的url是`/WEB-INF/classes/資原始檔名`
    2)在包中的資原始檔會隨著類一起對映,所以他的url是`/WEB-INF/classes/cn/demo/資原始檔名`(這裡的包是cn.demo)
    3)在WEB-ROOT下面的資原始檔,直接就是在web應用下面,他的url是`/WEB-INF/資原始檔名`
    
    • 讀取web應用中的配置檔案經常可以使用ServletContext的getResource來獲取資源的URL
        String path = this.getServletContext().getResource("/WEB-INF/classes/1.porperties"). getPath();//獲取URL的路徑
        FileInputStream in = new  FileInputStream(path);
        //String filename = path.subString(path.lastIndexOf("/")+1);
        Properties prop = new Properties();
        prop.load(in);
        String name = prop.getProperty("name");
        System.out.println(name);
    這回可以成功獲取,這種方法最常用的原因就是他能夠獲取檔案的名
    
    • 擴充套件:
      web工程中的普通java程式如何讀取資原始檔,使用類裝載器。
InputStream in  = this.getClass().getClassLoader().getResourceAsStream("1.properties");//配置檔案放在src下,和類載入器是同一個目錄
Properties prop = new Properties();
prop.load(in);
這種方法只適用於 只會讀不會改的檔案,而且我們只需要讀一次,做成靜態的程式碼跨即可。
但是,若是對資原始檔進行修改後,就不能讀取到最新的。因為類載入器載入過資源以後,就不會再次載入了,只加載一次。
String path =  this.getClass().getClassLoader().getResource("1.properties").getPath();//配置檔案放在src下,和類載入器是同一個目錄
FileInputStream in  = new FileInputStream("d1.properties");
Properties prop = new Properties();
prop.load(in);