JavaWeb之Servlet: ServletConfig 與 ServletContext


ServletConfig對象

 

什么是ServletConfig對象

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

 

創建時機

  ServletConfig對象在servlet對象創建之后,調用init方法之前創建,該Config對象隨着init方法傳入到servlet中。

 

常用方法

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

    java.util.Enumeration getInitParameterNames()         得到所有參數

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

    ava.lang.String getServletName()                    得到servlet名稱

 

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

 

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

我們先在servlet的配置文件web.xml配置servlet的初始化參數,然后運用上面的方法得到這些數據! 

配置文件:  

 <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)--得到資源的的一個輸入流

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM