官术网_书友最值得收藏!

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 氣溫顯示頁面

主站蜘蛛池模板: 赞皇县| 舞阳县| 随州市| 鄢陵县| 桃园市| 鹰潭市| 盐源县| 庐江县| 毕节市| 昌平区| 常山县| 井研县| 微博| 巴彦淖尔市| 金昌市| 林甸县| 兰溪市| 黄浦区| 安新县| 海阳市| 丰镇市| 大化| 泽普县| 于田县| 临夏市| 平乡县| 托里县| 武定县| 德庆县| 汝州市| 凤台县| 河津市| 青河县| 邮箱| 舞钢市| 阿图什市| 南雄市| 沛县| 关岭| 防城港市| 胶州市|