在Servlet技術模型中,我們了解到了Web應用中,Servlet的基礎職能,和使用Servlet的一些注意事項。但是,這一切,都需要Web容器進行管理,Web容器在Servlet編程中起到如下作用:
通過部署文件,初始化Servlet和ServletContext控制Servlet的作用域,對Servlet屬性進行增刪查改描述Web容器請求處理模型元素:過濾器、過濾器鏈、請求/響應的包裝監聽Web事件(監聽器的使用)描述RequestDispatcher,用Servlet轉發、包含目標資源我們先來講講容器部署應用時,對Servlet怎么做初始化的: DD(Deployment Descriptor)文件中
<servlet> <init-param> <param-name>paramName</param-name> <param-value>paramValue</param-value> <init-param></servlet>java文件中
// 在一個Servlet中getServletConfig().getInitParameter("paramName");如果我們有如下需求:在整個項目中獲取某一個屬性,那么,我們是這樣初始化的: DD文件中:
<context-param> <param-name>paramName</param-name> <param-value>paramValue</param-value></context-param>Java文件中:
getServletContext().getInitParameter("paramName");如果,我們需要在Web項目啟動時,構造一些對象,那么,監聽器就粉墨登場。
要使用監聽器,我們需要做如下幾件事: 1. 實現一個監聽器接口 2. 覆蓋接口里的方法 3. 配置DD文件或者注解
我們監聽器的Java文件如下:
@WebListenerclass SomeListener implements ServletContextListener{ public void contextInitialzed(ServletContextEvent sce){ // 獲取Context的引用 ServletContext context = sce.getServletContext(); }}我們的DD文件(沒有使用@WebListener的時候有用):
<listener> <listener-class></listener-class></listener>我們還有更多的Listener可以選擇:
| 類 | 作用 |
|---|---|
| ServletContextAttributeListener | 監聽Web應用的屬性 |
| HttpsessionListener | 監聽Web中的Session |
| HttpSessionBindingListener | 監聽對象綁定到會話 |
| HttpSessionActivationListener | 對Session遷移事件監聽 |
| ServletRequestListener | 監聽Web中的請求 |
對于屬性而言,我們還需要知道屬性的作用域,我們需要知道的作用域有:
上下文(Context)請求(Request)會話(HtttpSession)我們有一個參照表,用來描述各種作用域:
| 名稱 | 意義 | 作用域 |
|---|---|---|
| PageContext | 頁面上下文,可以獲取所有頁面對象 | 頁面 |
| HttpServletRequest | 客戶端請求 | 請求域 |
| HttpServletResponse | 服務器響應 | |
| ServletContext | 表示一個應用程序 | 整個服務器端 |
我們需要知道,ServletContext屬性不是線程安全的,因為,它可能被其它用戶更改。
這里有一個對上下文屬性加鎖的示例:
public void doGet(HttpServletRequest request, // 下面的代碼對ServletContext同步HttpServletResponse response){ synchronized(getServletContext()){ getServletContext().setAttribute("attributeName","attributeValue"); }}同樣,我們的HttpSession屬性也不是線程安全的,對HttpSession進行同步處理,可以避免線程不安全的修改。
對于和線程有關的問題,我們應做到:
聲明局部變量,而不是實例變量在合適的作用域里使用屬性我們認識了屬性的一些知識后,我們可以把屬性請求/分派出去:
request.setAttribute("beer","BEER");request.getRequestDispatcher("someurl");// 使用如下方法,必須以/打頭getServletContext().getRequestDispatcher("/someurl");新聞熱點
疑難解答