天天看點

Servlet上下文、Servlet間協作——Servler【總結】

Servlet上下文

伺服器上的每個Web應用都有一個背景環境對象,稱為上下文,Web應用中的資源包括Servlet、JSP、JavaBean和靜态HTML頁面等共享此上下文對象,是以上下文對象提供了一個同一Web應用内的不同資源間共享資訊的場所,可通過getServletContext()方法得到該Servlet運作的上下文對象。通過上下文可實作功能:

(1)通路Web應用程式資源:ServletContext可以通過getResource()和getResourceAsStream()方法通路 Web應用程式内的靜态資源檔案 。

(2)在Servlet上下文屬性中儲存Web應用程式資訊:儲存Java對象,通過字元串值 的key來識别對象,這些屬性對整個 Web應用都是全局的,Servlet可通過getAtrribute()、getAttributeNames()、removeAttribute()和setAttribute()方法進行操作。

(3)擷取應用初始化參數資訊:可以調用ServletContext.getInitParameterNames()傳回一個初始化參數的枚舉對象,或直接指定一個參數名來得到特定的參數值。

(4)提供日志支援:可簡單的調用ServletContext.log(String msg)或ServletContext.log(String msg,Throwable throwable)方法向底層的Servlet日志記錄寫入日志資訊,後者還可以寫入異常資訊和throwable的跟蹤棧。

Servlet間協作

當Web容器接收到用戶端的請求後,它負責建立HttpRequest對象和HTTPRespond對象,然後将這兩個對象以參數的形式傳遞給與請求URL位址相關聯的Servlet的service()方法進行處理。但對于複雜的處理過程,僅僅通過一個Servlet來實作請求的處理往往比較困難,這是需要幾個Servlet間共同協作完成對于請求的處理。就是說,在Servlet處理過程中或處理完畢後,将用戶端的請求傳遞到另外一個Servlet來處理,這種過程稱為請求指派,Servlet定義一個接口來實作請求指派:javax.servlet.requestdispatcher,它封裝了到同一Web應用内的另外一個資源的應用。可通過Requestdispatcher的forward()方法将請求傳遞到其它資源,或者調用include()方法将其它資源對此請求的響應包含進來。

HttpServletRespond的sendRedirect可以實作請求重定向,其與RequestDispatcher.forward方法有什麼差別?

首先,後者是容器中控制權的轉向,在用戶端浏覽器的位址欄不會不會出現轉向後的位址,而前者則是完全的跳轉以至于浏覽器将會得到并顯示位址,并重新發送請求連接配接。其次,從性能上,後者仍舊是在同一請求處理過程中,而前者是結束第一次請求,然後浏覽器發起一次新的請求。是以,後者更高效,盡量使用其。

但是後者也有局限,它隻能轉向到Web應用内部的資源,如果需要跳轉到其他伺服器上的資源,必須使用HttpServletRequest.sendRedirect方法。

繼續閱讀