Java學習之ServletContext

1、ServletContext的特色web

Web工程中只有一個ServletContext對象(全部的Servlet獲取ServletContext對象都是同一個)apache

2、ServletContext的用法瀏覽器

  ①、獲取全局配置參數tomcat

  ②、獲取Web工程中的資源服務器

  ③、根據其特色,servlet間共享數據app

3、驗證用法webapp

①、獲取全局配置參數this

Ⅰ、配置參數spa

Ⅱ、獲取配置的參數code

ServletContext context = getServletContext(); String address=context.getInitParameter("address"); System.out.println(address);

Ⅲ、結果

 

注意: getInitParameter獲取值爲NULL,可能有如下幾個緣由

一、xml文件中<context-param>節點有誤

二、xml文件的正確路徑(WEB-INF/Web.xml)

②、獲取工程資源

資源文件內容

Ⅰ、根據路徑先獲取絕對路徑,再轉成流對象

一、經過ServletContext對象獲取絕對路徑

ServletContext context = getServletContext(); // Web項目在tomcat裏面的根目錄
    System.out.println(context.getRealPath("/"));//結果: D:\workspace\apache-tomcat-9.0.30\webapps\p03_HelloHttpServlet\ // Web項目在tomcat的根目錄中file/config.properties資源路徑
    System.out.println(context.getRealPath("file/config.properties"));//結果: D:\workspace\apache-tomcat-9.0.30\webapps\p03_HelloHttpServlet\file\config.properties

 

二、經過this.getClass().getClassLoader()對象獲取路徑

// 當前類文件(HellowHttpServlet)的字節碼文件(HellowHttpServlet.class)所在tomcat中的根目錄(/WEB-INF/classes/)URL對象
    System.out.println(this.getClass().getClassLoader().getResource("/"));//結果:file:/D:/workspace/apache-tomcat-9.0.30/webapps/p03_HelloHttpServlet/WEB-INF/classes/ // 根據當前類文件(HellowHttpServlet)的字節碼文件(HellowHttpServlet.class)所在tomcat中的根目錄(/WEB-INF/classes/)URL對象的getPath()方法獲取路徑
    System.out.println(this.getClass().getClassLoader().getResource("../../file/config.properties").getPath());//結果:/D:/workspace/apache-tomcat-9.0.30/webapps/p03_HelloHttpServlet/file/config.properties

實例:打印文件內容

ServletContext context = getServletContext(); //InputStream is = new FileInputStream(this.getClass().getClassLoader().getResource("../../file/config.properties").getPath());//這樣作也是能夠的
    InputStream is = new FileInputStream(context.getRealPath("file/config.properties")); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String s; while ((s = br.readLine()) != null) { System.out.println(s); }

結果:

Ⅱ、根據路徑獲取流對象

一、經過ServletContext對象獲取流對象

ServletContext context = getServletContext(); BufferedReader br = new BufferedReader(new InputStreamReader(context.getResourceAsStream("file/config.properties"))); String s; while ((s = br.readLine()) != null) { System.out.println(s); }

二、經過this.getClass().getClassLoader()對象獲取流對象

InputStream is=this.getClass().getClassLoader().getResourceAsStream("../../file/config.properties"); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String s; while ((s = br.readLine()) != null) { System.out.println(s); }

③、servlet間共享數據

這裏就作兩個servlet共享數據,一個servlet設置servletcontext,一個servlet獲取servletcontext

一、設置ServletContext

ServletContext context = getServletContext(); context.setAttribute("Key", "value"); /*重定向 resp.setStatus(302); resp.setHeader("Location", "GetServletContextValue");*/
    
    /*重定向寫法: 從新定位方向 參數即跳轉的位置 resp.sendRedirect("GetServletContextValue");*/
    
    /*請求轉發的寫法: 參數即跳轉的位置*/ req.getRequestDispatcher("GetServletContextValue").forward(req, resp);

二、獲取ServletContext

System.out.println(getServletContext().getAttribute("Key"));

ServletContext大概就這樣了。

補充:頁面跳轉

經過上面代碼發現頁面跳轉有兩種形式:1、重定向 2、請求轉發

***重定向

resp.sendRedirect("GetServletContextValue");

就至關於

resp.setStatus(302); resp.setHeader("Location", "GetServletContextValue");

其特色: 

   一、 地址上顯示的是最後的那個資源的路徑地址
  1.一、請求頁面地址
    
  點擊登陸按鈕後地址
        
  二、 請求次數最少有兩次, 服務器在第一次請求後,會返回302 以及一個地址, 瀏覽器在根據這個地址,執行第二次訪問。
  三、 能夠跳轉到任意路徑。 不是本身的工程也能夠跳。
  四、 效率稍微低一點, 執行兩次請求。
  五、 後續的請求,無法使用上一次的request存儲的數據,或者 無法使用上一次的request對象,由於這是兩次不一樣的請求。

***請求轉發

req.getRequestDispatcher("GetServletContextValue").forward(req, resp);

其特色:

   一、地址上顯示的是請求servlet的地址。  返回200 ok
  1.一、請求頁面地址
    
  點擊 登陸按鈕後地址
       
 
  二、請求次數只有一次, 由於是服務器內部幫客戶端執行了後續的工做。
  三、只能跳轉本身項目的資源路徑 。 
  四、效率上稍微高一點,由於只執行一次請求。
  五、能夠使用上一次的request對象。
相關文章
相關標籤/搜索