ServletContext的揭祕

----------------------------- ServletContext的揭祕------------------------------

ServletContext

  1. WEB容器在啓動時,它會爲每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
  2. 由於一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之爲context域對象
  3. 查看ServletContext API文檔,瞭解ServletContext對象的功能。

       應用:

獲取WEB應用的全局初始化參數

通過ServletContext對象實現數據共享

    • 案例--- 統計站點訪問次數

利用ServletContext對象讀取資源文件

 Object

getAttribute(String name)
          Returns the servlet container attribute with the given name, or null if there is no attribute by that name.

 String

getContextPath()
          Returns the context path of the web application.

 String

getInitParameter(String name)
          Returns a String containing the value of the named context-wide initialization parameter, or null if the parameter does not exist.

 String

getRealPath(String path)
          Returns a String containing the real path for a given virtual path

 void

setAttribute(String name, Object object)
          Binds an object to a given attribute name in this servlet context.

 InputStream

getResourceAsStream(String path)
          Returns the resource located at the named path as an InputStream object.

 

 

全局參數獲取代碼示例:

package com.rl.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class ServletDemo1 extends HttpServlet {

 

       @Override

       public void init(ServletConfig config) throws ServletException {

              //獲得ServletContext對象

              ServletContext sc = config.getServletContext();

              //獲得ServletContext級別的全局參數

              String contextValue = sc.getInitParameter("context_key");

              System.out.println(contextValue);

             

       }     

}

 

<?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">

  <!-- 全局的容器參數ServletContext -->

  <context-param>

      <param-name>context_key</param-name>

      <param-value>context_value</param-value>

  </context-param>

 

  <servlet>

    <servlet-name>ServletDemo1</servlet-name>

    <servlet-class>com.rl.servlet.ServletDemo1</servlet-class>

    <load-on-startup>1</load-on-startup>

  </servlet>

 

  <servlet-mapping>

    <servlet-name>ServletDemo1</servlet-name>

    <url-pattern>/servletDemo1</url-pattern>

  </servlet-mapping>

 

</web-app>

 

 

全局屬性設置代碼示例:

package com.rl.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class ServletDemo1 extends HttpServlet {

      

       @Override

       public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              //獲得Servlet容器對象

              ServletContext sc = getServletContext();

              //獲得全局屬性

              Integer pvcount = (Integer)sc.getAttribute("pvcount");

              if(pvcount == null){

                     sc.setAttribute("pvcount", 1);

                     pvcount = (Integer)sc.getAttribute("pvcount");

              }else{

                     sc.setAttribute("pvcount", ++pvcount);

              }

             

              response.getOutputStream().write(("<font color='red' size='20'> 當前站點被點擊了" + pvcount +"次</font>").getBytes());

       }

      

}

 

 

通過ServletContext獲得項目根目錄下的文件:

 

package com.rl.servlet;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

 

public class ServletDemo3 extends HttpServlet {

 

       @Override

       public void init(ServletConfig config) throws ServletException {

              //獲得ServletContext對象

              ServletContext sc = config.getServletContext();

              //獲得工程目錄webroot下文件的路徑

              //D:\tomcat-test\apache-tomcat-7.0.62\webapps\servlet_demo4\test.properties

              //getRealPath的參數內容不會被校驗,只有真正要用這個路徑的時候才知道路徑對不對

              String path = sc.getRealPath("test.properties");

              System.out.println(path);

             

              //獲得工程目錄webroot下文件的輸入流對象

              //第一個/代表項目的根目錄

              InputStream in = sc.getResourceAsStream("/WEB-INF/test.properties");

              Properties prop = new Properties();

              try {

                     prop.load(in);

                     System.out.println(prop.get("key"));

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

      

}

 

讀取類路徑下文件的兩種方式:

package com.rl.servlet;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

 

public class ServletDemo4 extends HttpServlet {

 

       @Override

       public void init(ServletConfig config) throws ServletException {

              //獲得ServletContext對象

              ServletContext sc = config.getServletContext();

              //獲得classpath下的資源的文件的流

              //由於classpath下的文件發佈之後是在web項目/WEB-INF/classes下

              //所以去指定/WEB-INF/classes/test1.properties

              //InputStream in = sc.getResourceAsStream("/WEB-INF/classes/test1.properties");

             

              //另一種方法獲取類文件

              //通過當前類獲取類對象

              //通過類對象獲得類加載器

              //通過類加載器獲得資源流,資源流指定的根目錄是classpath,也就是java項目的src文件夾

              //使用類加載器的方式來讀取classpath下的資源文件

              //好處不依賴於ServletContext,任何類都可以獲得classpath下的文件

              //不需要再自己指定/WEB-INF/classes

              InputStream in = this.getClass().getClassLoader().getResourceAsStream("test1.properties");

             

              //讀取test1.properties中的值

              Properties prop = new Properties();

              try {

                     prop.load(in);

                     System.out.println(prop.get("key1"));

              } catch (IOException e) {

                     e.printStackTrace();

              }

             

       }

}

 

發佈了205 篇原創文章 · 獲贊 125 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章