JavaWeb之Servlet: ServletConfig 與 ServletContext

ServletConfig對象

 

什麼是ServletConfig對象

  ServletConfig對象,Servlet配置對象。主要用於加載配置文件的初始化參數。java

 

建立時機

  ServletConfig對象在servlet對象建立以後,調用init方法以前建立,該Config對象隨着init方法傳入到servlet中。web

 

經常使用方法

    java.lang.String getInitParameter(java.lang.String name)  根據名稱獲取參數值tomcat

    java.util.Enumeration getInitParameterNames()         獲得全部參數服務器

    ServletContext getServletContext()                   獲取servlet上下文對象app

    ava.lang.String getServletName()                    獲得servlet名稱工具

 

問題:SevletConfig中的初始化參數不能被其餘Servlet共享!!this

 

下面來演示一下這些方法的使用:spa

咱們先在servlet的配置文件web.xml配置servlet的初始化參數,而後運用上面的方法獲得這些數據! code

配置文件:  視頻

 <servlet>
            <servlet-name>testpath</servlet-name>
            <servlet-class>com.vmaxtam.dotest.testpath</servlet-class>
      <init-param>                --這個標籤寫在要設置的servlet內
               <param-name>color</param-name>  -屬性名
             <param-value>red</param-value>    -屬性值
      </init-param>
  </servlet>    

下面咱們就在相應的servlet內獲得配置好的數據吧!

ServletConfig servletConfig = getServletConfig();
String color = servletConfig.getInitParameter("color");

這樣就能獲得配置好的數據了!還有更簡單的方法:

先說明一下:首先HttpServlet繼承自GenericServlet類,而GenericServlet類又繼承自Servlet接口,Servlet接口有方法getServletConfig() ,因此HttpServlet確定有方法getServletConfig()。而GenericServlet類又實現了ServletConfig 接口,也就是他確定實現了ServletConfig接口中的全部方法,因此以上代碼咱們還能夠這樣寫:

String color = getInitParameter("color");

其它方法也差很少,這裏不作示範~~~

 

ServletContext對象

什麼是ServletContext對象

咱們知道一個Web應用裏面能夠有多個servlet,若是如今有一份數據須要傳給全部的servlet使用,那麼咱們就可使用ServletContext對象了。

ServletContext對象叫servlet上下文對象。該對象在一個web應用中只會建立一個對象,表明當前web應用的環境。在當前的web應用中全部servlet都共享一個ServletContext對象

ServletContext對象建立的時機

由ServletContext對象的特性咱們能夠推斷出它被建立的時機:每當一個web應用被加載,那麼一個ServletContext對象就被建立了,而後web應用裏的servlet就能夠同使用它了!

那麼,咱們如何在servlet裏獲得這個已經建立的對象呢?

獲得ServletContext對象

開發者十分巧妙的將ServletContext對象放入在了該web應用裏的每個servlet中的ServletConfig對象裏!

在一個servlet被建立時,會調用它的構造方法,隨後就會調用init()方法對它初始化,而在初始化的過程當中,就把ServletContext對象放入到ServletConfig對象中了!那麼這個servlet獲得ServletContext對象對象就十分方便了,只須要用一句代碼!

ServletContext servletContext = this.getServletContext();

 

ServletContext對象的經常使用方法

獲得了ServletContext對象,咱們就要想:這個對象有什麼用呢!?如下介紹一下它的經常使用的方法。

主要有五種用法:

一)獲得web應用的上下文路徑

    java.lang.String getContextPath()     

 

二)獲取web應用的全局參數 :         

     java.lang.String getInitParameter(java.lang.String name)  

    java.util.Enumeration getInitParameterNames()  

 

三)域對象相關的方法:

    java.lang.Object getAttribute(java.lang.String name)     

    void setAttribute(java.lang.String name, java.lang.Object object)

    void removeAttribute(java.lang.String name)

 

四)用於轉發:

    RequestDispatcher getRequestDispatcher(java.lang.String path)  

 

五)web應用加載資源文件方法

    java.lang.String getRealPath(java.lang.String path)   

    java.io.InputStream getResourceAsStream(java.lang.String path)

 

下面示範一下使用這些方法:

 

一)獲得web應用的上下文路徑

經過request來調用該方法

String path = request.getContextPath();
System.out.println(path);

輸出結果:

/TestArea

web應用的路徑 是 tomcat服務器中web應用的名稱,而不是ecplise中的項目名稱。

request.getContextPath();  爲了方便獲取上下文路徑。推薦使用該方法。

 

 

二)獲取web應用的全局參數

 

先在web應用對應的web.xml中設置全局參數:  全局參數的標籤寫咋<web-app>標籤內

<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

        <!-- 全局參數 -->
    <context-param>
        <param-name>AAA</param-name>
        <param-value>AAA's value</param-value>
    </context-param>
    <context-param>
        <param-name>BBB</param-name>
        <param-value>BBB's value</param-value>
    </context-param>

而後在servlet內獲得這個參數:

//1.獲得ServletContext對象
        ServletContext context = this.getServletContext();
        
        //2.獲取全局參數
        System.out.println(context.getInitParameter("AAA"));
        
        Enumeration<String> enums = context.getInitParameterNames();
        while(enums.hasMoreElements()){
            String paramName = enums.nextElement();
            String paramValue = context.getInitParameter(paramName);
            System.out.println(paramName+"="+paramValue);
        }

注意: 全部的servlet均可以獲取全局參數!!!

 

 

三)域對象相關的方法

 什麼是域對象?

    域對象:保存數據 和 獲取數據,用於在不一樣資源之間共享數據。

那麼咱們如今嘗試把第一個servlet的數據傳到 另外一個servlet裏吧!

 

方法一:利用跳轉,從servlet1跳轉到servlet2時,把數據寫在跳轉uri裏

response.sendRedirect("/servlet2?id=867");

 

方法二:利用域對象方法

    setAttribute(name,Object):  保存數據方法.name名稱,object數據

    getAttribute(name)  獲取數據。name是保存數據時的名稱

    removeAtrributename): 清除數據。

servlet1寫上:

 

ServletContext context = this.getServletContext();
context.setAttribute("id", 123);

 

而後servlet2得到它吧!

ServletContext context = this.getServletContext();
String id = context.getAttribute("id");

   

四)用於轉發

RequestDispatcher getRequestDispatcher(java.lang.String path)  

 

servlet中跳轉資源:重定向  /  轉發

 

重定向:

    1)地址欄會發送改變,變成重定向到的地址

    2)重定向能夠跳轉到web應該內,其餘web應用,甚至站外的應用。

    3)調用者和被調用者處於兩次不一樣的請求。不能經過request域對象來共享數據。

 

轉發:

    1)地址欄不會發送改變。

    2)轉發不能轉發到應用外的資源,不能轉發到站外資源;只能轉發到當前web應用下的資源。

    3)調用者和被調用者處於同一次請求,能夠經過request域對象共享數據。

 

資源: 

    1)內部資源:web應用內的資源   

    2)應用外的資源: 其餘web應用下的資源 

    3)其餘站點的資源   

 

 

web應用加載資源文件方法

先了解一下web應用運行時的目錄:

 

     相對路徑是指java命令的運行目錄。

 

     java項目:ecplise工具把java命令運行的目錄設置到web應用的根目錄。

 

     web項目: java命令運行的目錄在tomcat/bin目錄下。

 有時候咱們須要web應用加載一些圖片,音樂,視頻等,就須要得到他們的路徑而後使用,能夠用如下方法得到:

 

    java.lang.String getRealPath(java.lang.String path)   --獲得資源的絕對路徑

 

    java.io.InputStream getResourceAsStream(java.lang.String path)--獲得資源的的一個輸入流

相關文章
相關標籤/搜索