ServletContext(重要)
為什么80%的碼農都做不了架構師?>>> ??
目錄
? ? 1、ServletContext概述
? ? 2、獲取ServletContext
? ? 3、域對象的功能
? ? 4、獲取項目初始化參數
? ? 5、獲取資源相關方法
? ? 6 練習:訪問量統計
===================================== ? ? ? ?
1、ServletContext概述
? ? 服務器會為每個項目創建一個ServletContext對象,一個項目只有一個ServletContext上下文對象!
? ? 我們可以在N多個Servlet中來獲取這個唯一的對象,使用它可以給多個Servlet傳遞數據!
? ? 與服務器同壽!!!這個對象在Tomcat啟動時就創建,在Tomcat關閉時才會被銷毀死去!
? ? 作用: 在整個Web應用的動態資源之間共享數據!
? ? 例如:在AServlet中向ServletContext對象中保存一個值,然后在BServlet中就可以獲取這個值,這就是共享數據了。
2、獲取ServletContext
? ? * ServletConfig 接口中 getServletContext()方法;
? ? * GenericServlet 類中 getServletContext()方法;
? ? 在Servlet接口中獲取ServletContext對象:
? ? * 在void init(ServletConfig config)中:
? ? ? ? ? ? ServletContext context = config.getServletContext();
? ? ? ? ? ? ServletConfig類的getServletContext()方法可以用來獲取ServletContext對象;
? ? 在GenericeServlet或HttpServlet中獲取ServletContext對象:
? ? * GenericServlet類有getServletContext()方法,所以可以直接使用this.getServletContext()來獲取;
? ? public class MyServlet implements Servlet {
? ? ? ? public void init(ServletConfig config) {
? ? ? ? ? ? ServletContext context = config.getServletContext();
? ? ? ? }
? ? ? ? …
? ? }
? ? public class MyServlet extends HttpServlet {
? ? ? ? public void doGet(HttpServletRequest request, HttpServletResponse response) {
? ? ? ? ? ? ServletContext context = this.getServletContext();
? ? ? ? }
? ? }
3、域對象的功能
? ? ServletContext是JavaWeb四大域對象之一:
? ? ? ? * PageContext;
? ? ? ? * ServletRequest;
? ? ? ? * HttpSession;
? ? ? ? * ServletContext;
? ? 所有域對象都有存取數據的功能,因為域對象內部有一個Map,用來存儲數據,下面是ServletContext對象用來操作數據的方法:
? ? * void setAttribute(String name, Object value):用來存儲一個對象,也可以稱之為存儲一個域屬性。
? ? * Object getAttribute(String name):用來獲取ServletContext中的數據,當前在獲取之前需要先去存儲才行。
? ? * void removeAttribute(String name):用來移除ServletContext中的域屬性,如果參數name指定的域屬性不存在,
? ? ? ? ? ? ? ? 那么本方法什么都不做;
? ? * Enumeration getAttributeNames():獲取所有域屬性的名稱;
4、獲取項目初始化參數
? ? * 一個Servlet只能獲取自己的初始化參數,不能獲取別人的,即初始化參數只為一個Servlet準備!
? ? * 可以配置公共的初始化參數,為所有Servlet而用!這需要使用ServletContext才能使用!
? ? 還可以使用ServletContext來獲取在項目web.xml文件中配置的應用初始化參數!
? ? 注意,項目初始化參數與Servlet初始化參數不同:
? ? web.xml
? ? <web-app>
? ? ? ? ...
? ? ? ? <context-param> ? ?[配置了兩個應用初始化參數]
? ? ? ? ? ? <param-name>paramName1</param-name>
? ? ? ? ? ? <param-value>paramValue1</param-value>
? ? ? ? </context-param>
? ? ? ? <context-param>
? ? ? ? ? ? <param-name>paramName2</param-name>
? ? ? ? ? ? <param-value>paramValue2</param-value>
? ? ? ? </context-param>
? ? </web-app>
? ? ServletContext context = this.getServletContext(); ?[獲取ServletContext對象]
? ? String value1 = context.getInitParameter("paramName1");
? ? String value2 = context.getInitParameter("paramName2");
? ? Enumeration names = context.getInitParameterNames();[獲取所有應用初始化參數名稱]
? ? while(names.hasMoreElements()) {
? ? ? ? System.out.println(names.nextElement()); ?//會得到 paramName1,paramName2
? ? }
5、獲取資源相關方法
? ? 5.1、獲取真實路徑(*****)
? ? ? ? 還可以使用ServletContext對象來獲取Web應用下的資源,例如在hello應用的根目錄下創建a.txt文件,
? ? 現在想在Servlet中獲取這個資源,就可以使用ServletContext來獲取。
? ? ? ? * 獲取a.txt的真實路徑:String realPath = servletContext.getRealPath(“/a.txt”),
? ? ? ? ? ? ? ? realPath的值為a.txt文件的絕對路徑:F:\tomcat6\webapps\hello\a.txt;
? ? ? ? * 獲取b.txt的真實路徑:String realPath = servletContext.getRealPath(“/WEB-INF/b.txt”);
? ? 5.2、獲取資源流
? ? ? ? 不只可以獲取資源的路徑,還可以通過ServletContext獲取資源流,即把資源以輸入流的方式獲取:
? ? ? ? * 獲取a.txt資源流:InputStream in = servletContext.getResourceAsStream(“/a.txt”);
? ? ? ? * 獲取b.txt資源流:InputStream in = servletContext.getResourceAsStream(“/WEB-INF/b.txt”);
? ? 5.3、獲取指定目錄下所有資源路徑
? ? ? ? 還可以使用ServletContext獲取指定目錄下所有資源路徑,例如獲取/WEB-INF下所有資源的路徑:
? ? ? ? ? ? Set set = context.getResourcePaths("/WEB-INF");
? ? ? ? ? ? System.out.println(set);
? ? ? ? ? ? [/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/b.txt, /WEB-INF/web.xml]
? ? ? ? 注意,本方法必須以“/”開頭!!!
6 練習:訪問量統計
? ? 一個項目中所有的資源被訪問都要對訪問量進行累加!
? ? 創建一個int類型的變量,用來保存訪問量,然后把它保存到ServletContext的域中,這樣可以保存所有的Servlet都可以訪問到!
? ? 相信各位一定見過很多訪問量統計的網站,即“本頁面被訪問過XXX次”。因為無論是哪個用戶訪問指定頁面,
? ? 都會累計訪問量,所以這個訪問量統計應該是整個項目共享的!很明顯,這需要使用ServletContext來保存訪問量。
? ? ServletContext application ?= this.getServletContext(); ? [獲取ServletContext對象]
? ? Integer count = (Integer)application.getAttribute("count") ? [獲取ServletContext對象中的count屬性];
? ? if(count == null) {
? ? ? ? count = 1; [如果在ServletContext中不存在count屬性,那么設置count的值為1,表示第一次被訪問。]
? ? } else {
? ? ? ? count++; [如果在ServletContext中存在count屬性,說明以前被訪問過,那么讓count在原來的基礎上加1。];
? ? }
? ? response.setContentType("text/html;charset=utf-8");
? ? // response.setHeader("Content-Type","text/html;charset=utf-8"); 設置頭信息(文本類型和編碼),等同于上面
? ? response.getWriter().print("<h1>本頁面一共被訪問" + count + "次!</h1>")[向客戶端響應本頁面被訪問的次數。];
? ? application.setAttribute("count", count);[覆蓋保存count的值到ServletContext對象中。]
---------------------?
?
轉載于:https://my.oschina.net/oszzq/blog/3021398
總結
以上是生活随笔為你收集整理的ServletContext(重要)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3与MySQL交互
- 下一篇: ANSI C and Microsoft