- Java EE 程序設計
- 郝玉龍編著
- 1360字
- 2019-07-01 10:16:06
3.8 Servlet上下文
服務器上的每個Web應用都會有一個背景環境對象,稱為上下文,Web應用中的所有資源包括Servlet、JSP、JavaBean和靜態HTML頁面等共享此上下文對象,因此上下文對象提供了一個同一Web應用內的不同資源間共享信息的場所。Javax.Servlet. ServletContext接口提供正在運行的Servlet所處的Web應用程序的上下文對象的視圖,可以通過getServletContext方法得到該Servlet運行的上下文對象。在創建Web應用程序時,通過Servlet上下文可以實現以下功能:
(1)訪問Web應用程序資源。ServletContext可以通過getResource和getResourceAsStream方法訪問Web應用程序內的靜態資源文件。
(2)在Servlet上下文屬性中保存Web應用程序信息。上下文對象可以用來存儲Java對象,通過字符串值的key來識別對象,這些屬性對整個Web應用程序都是全局的,Servlet可以通過getAttribute、getAttributeNames、removeAttribute和setAttribute方法進行操作。
(3)獲取應用初始化參數信息。可以調用ServletContext的getInitParameterNames方法返回一個初始化參數的枚舉對象(java.util.Enumeration),或直接指定一個參數名來得到特定的參數值,如ServletContext.getInitParameter(String name)。
注意:這里的初始化參數指的是整個Web應用的初始化參數,而不是針對哪個具體Web組件的。例如,開發人員可以將Web應用的運行模式設置為應用的初始化參數。在初始化參數修改后,必須重新啟動Web應用才會生效。
(4)提供日志支持。可以簡單地通過調用ServletContext.log(String msg)或ServletContext.log(String msg, Throwable throwable)方法向底層的Servlet日志記錄寫入日志信息;ServletContext.log(String msg, Throwable throwable)方法還可寫入異常信息和throwable的跟蹤棧。
ServletContext對此Web應用的任何客戶端請求在任何時間都有效。要訪問ServletContext對象,只要調用getServletContext()就可以了。
下面通過程序演示兩個Servlet組件間如何通過上下文進行協同工作。其中AdminTemperatureServlet用來更新當前溫度信息,ShowTemperatureServlet僅用來顯示當前溫度信息,兩個Servlet間通過上下文中的屬性來傳遞信息,實現溫度信息實時更新與發布。
首先創建更新溫度信息的AdminTemperatureServlet。它包含一個名為Temperature初始化參數,其值為8。代碼如程序3-27所示。
程序3-27:AdminTemperatureServlet.java
package com.servlet; … @WebServlet(name="AdminTemperatureServlet", urlPatterns={ "/adminTempera ture" } , initParams ={ @WebInitParam(name = "Temperature", value ="8")}) public class AdminTemperatureServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=gb2312"); PrintWriter out = response.getWriter(); String Temperature=(String)getServletContext().getAttribute ("Temperature"); if(Temperature==null){ //獲取初始化參數 Temperature=(String)getInitParameter("Temperature"); //放入應用上下文 getServletContext().setAttribute("Temperature", Temperature); } out.println("<HTML><HEAD><TITLE>氣溫更新 " + "</TITLE></HEAD>"); out.println("<BODY><TABLE border=\"0\" width=\"100%\"><tr>"); out.println("<td align=\"left\" valign=\"bottom\">"); out.println("<H1>當前氣溫</H1></td></tr></TABLE>"); out.print("<FORM ACTION=\""); out.println(response.encodeURL("adminTemperature")); out.println("\" METHOD=\"POST\">"); out.println("當前氣溫(攝氏度)"); out.println("<INPUT TYPE=\"text\" NAME=\"temperature\" " + "VALUE="+Temperature+">"); out.println("<INPUT TYPE=\"Submit\" NAME=\"btn_submit\" " + "VALUE=\"更新\">"); out.println("</FORM></BODY></HTML>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=gb2312"); PrintWriter out = response.getWriter(); String Temperature=request.getParameter("temperature"); //將更新后的氣溫信息放入上下文 getServletContext().setAttribute("Temperature", Temperature); out.println("<HTML><HEAD><TITLE>氣溫更新 " + "</TITLE></HEAD>"); out.println("<BODY>"); out.println("當前氣溫:"+Temperature+"攝氏度"); out.println("</BODY></HTML>"); } … }
下面生成顯示氣溫信息的ShowTemperatureServlet,代碼如程序3-28所示。
程序3-28:ShowTemperatureServlet.java
package com.servlet; … @WebServlet(name=" ShowTemperatureServlet ", urlPatterns={"/ showTemperature "}) public class ShowTemperatureServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=gb2312"); PrintWriter out = response.getWriter(); String Temperature=(String)getServletContext().getAttribute ("Temperature"); if(Temperature==null){Temperature=new String("0"); } String oldTemperature=(String)request.getSession().getAttribute ("OldTemperature"); out.println("<HTML><HEAD><TITLE>氣溫信息顯示 " + "</TITLE></HEAD>"); out.println("<BODY>"); out.println("當前最新氣溫:"+Temperature+"攝氏度"); if(oldTemperature! =null){ out.println("<BR>"); out.println("更新當前氣溫:"+oldTemperature+"攝氏度"); } out.println("</BODY></HTML>"); //更新會話中的氣溫信息 request.getSession().setAttribute("OldTemperature", Temperature); } … }
程序說明:AdminTemperatureServlet的doGet方法首先調用getServletContext方法獲取應用的上下文對象ServletContext,然后調用ServletContext對象的getAttribute方法獲取存儲在上下文中的Temperature屬性信息進行顯示。如果是第一次調用,ServletContext中尚不存在Temperature屬性對象,則調用getInitParameter方法獲取存儲在初始化參數中的氣溫信息并調用ServletContext的setAttribute方法將屬性添加到上下文對象的Temperature屬性對象中。ShowTemperatureServlet采用同樣的方法獲取上下文中的屬性信息進行顯示。
重新發布Web應用并啟動瀏覽器,在地址欄中輸入http://localhost:8080/Chapter3/adminTemperature,將得到如圖3-32所示的結果,此時顯示的為從Servlet初始化參數中獲取的氣溫信息。將文本框中的氣溫數據更改為8并單擊“更新”按鈕提交。打開一個新的瀏覽器對話框,在地址欄中輸入http://localhost:8080/Chapter3/showTemperature,將得到如圖3-33所示的結果,此時顯示的為從上下文對象獲取的氣溫信息,可以看到氣溫信息已經更新了。重新進入如圖3-32所示的頁面來不斷更新氣溫信息,然后重新刷新顯示如圖3-33所示的頁面,可以看到,通過上下文,兩個Servlet組件之間的信息交換變得很方便。

圖3-32 氣溫更新頁面

圖3-33 氣溫顯示頁面
- HTML5+CSS3王者歸來
- Mastering Kotlin
- 64位匯編語言的編程藝術
- Learning SciPy for Numerical and Scientific Computing(Second Edition)
- 單片機C語言程序設計實訓100例
- Web前端應用開發技術
- INSTANT Adobe Edge Inspect Starter
- Nagios Core Administration Cookbook(Second Edition)
- Mastering Adobe Captivate 7
- C語言程序設計與應用實驗指導書(第2版)
- Beginning C# 7 Hands-On:The Core Language
- Python Penetration Testing Essentials
- React.js實戰
- Laravel 5.x Cookbook
- Mastering React Test:Driven Development