----------------------------- ServletContext的揭祕------------------------------
ServletContext
- WEB容器在啓動時,它會爲每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
- 由於一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之爲context域對象。
- 查看ServletContext API文檔,瞭解ServletContext對象的功能。
應用:
獲取WEB應用的全局初始化參數
通過ServletContext對象實現數據共享
-
- 案例--- 統計站點訪問次數
利用ServletContext對象讀取資源文件
getAttribute |
|
getContextPath |
|
getInitParameter |
|
getRealPath |
|
|
setAttribute |
getResourceAsStream |
全局參數獲取代碼示例:
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(); }
} } |