java基礎學習:JavaWeb之ServletConfig與ServletContext

Hiway發表於2018-12-16

其他更多java基礎文章: java基礎學習(目錄)


Servlet規範核心類圖

  

image

接下來我們要說的是Servlet的四個類:

  ServletConfig物件,ServletContext物件、下一節講request物件,response物件

從圖中我們可以知道這幾個物件之間的聯絡!

ServletConfig物件

獲取ServletConfig物件
  1. 通過繼承父類(HttpServlet或GenericServlet)的方法得到一個ServletConfig物件
ServletConfig config = this.getServletConfig();
複製程式碼
ServletConfig物件的作用

image.png

  1. getServletName() :獲取servlet的名稱,也就是我們在web.xml中配置的servlet-name
  2. getServletContext():獲取ServletContext物件,該物件的作用看下面講解
  3. getInitParameter(String):獲取在servlet中初始化引數的值。這裡注意與全域性初始化引數的區分。這個獲取的只是在該servlet下的初始化引數
 <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.hiway.servlet.Myservlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/Myservlet</url-pattern>
    </servlet-mapping>
複製程式碼
  1. getInitParameterNames():獲取在Servlet中所有初始化引數的名字,也就是key值,可以通過key值,來找到各個初始化引數的value值。注意返回的是列舉型別
Enumeration<String> initParameterNames = this.getInitParameterNames();
while(initParameterNames.hasMoreElements()){
   String name = initParameterNames.nextElement();
   String value = this.getInitParameter(name);
}
複製程式碼

ServletContext物件

獲取ServletContext物件
  1. 通過ServletConfig獲取,如果繼承父類(HttpServlet或GenericServlet),則可直接呼叫方法獲取
getServletContext();
//或
getServletConfig().getServletContext();
複製程式碼
  1. 還有一種在web應用中,通過HttpServletRequest獲取
request.getSession().getServletContext()
複製程式碼
ServletContext物件的作用

tomcat為每個web專案都建立一個ServletContext例項,tomcat在啟動時建立,伺服器關閉時銷燬,在一個web專案中共享資料,管理web專案資源,為整個web配置公共資訊等,通俗點講,就是一個web專案,就存在一個ServletContext例項,每個Servlet讀可以訪問到它。
1. web專案中共享資料 在一定範圍內(當前應用),使多個Servlet共享資料getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)

    

image

1.1 setAttribute(String name, Object obj) 在web專案範圍記憶體放內容,以便讓在web專案中所有的servlet讀能訪問到
1.2 getAttribute(String name) 通過指定名稱獲得內容
1.3 removeAttribute(String name) 通過指定名稱移除內容

2. 獲取全域性配置資訊
整個web專案初始化引數 (這個就是全域性初始化引數,每個Servlet中都能獲取到該初始化值)
2.1)getInitPatameter(String name)  //通過指定名稱獲取初始化值 2.2)getInitParameterNames()  //獲得列舉型別

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </context-param>
複製程式碼

3. 獲取web專案資源
3.1)獲取web專案下指定資源的路徑 :
String getRealPath(String path);//根據資源名稱得到資源的絕對路徑

        ServletContext servletContext = this.getServletContext();
        String path = servletContext.getRealPath("/WEB-INF/web.xml");
        System.out.println(path);

F:\myworkspace\ServletTest\out\artifacts\ServletTest_war_exploded\WEB-INF\web.xml
複製程式碼

3.2)獲取web專案下指定資源的內容,返回的是位元組輸入流。InputStream getResourceAsStream(java.lang.String path)

InputStream in  = servletContext.getResourceAsStream("/WEB-INF/web.xml");
        InputStreamReader isr = new InputStreamReader(in,"UTF-8");
        BufferedReader br = new BufferedReader(isr);
        String s = null;
        while((s =br.readLine())!=null){
            System.out.println(s);
        }
複製程式碼

image.png

3.3)getResourcePaths(java.lang.String path) 指定路徑下的所有內容。

        Set set = servletContext.getResourcePaths("/WEB-INF");
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
複製程式碼

image.png

3.4)實現servlet的轉發
RequestDispatcher getRequestDispatcher(String path) ;//參數列示要跳轉到哪去

        RequestDispatcher rd = servletContext.getRequestDispatcher("/Servlet1");
        rd.forward(req,resp);
複製程式碼

相關文章