在Servlet技術模型中,咱們瞭解到了Web應用中,Servlet的基礎職能,和使用Servlet的一些注意事項。可是,這一切,都須要Web容器進行管理,Web容器在Servlet編程中起到以下做用:java
經過部署文件,初始化Servlet和ServletContext編程
控制Servlet的做用域,對Servlet屬性進行增刪查改安全
描述Web容器請求處理模型元素:過濾器、過濾器鏈、請求/響應的包裝服務器
監聽Web事件(監聽器的使用)url
描述RequestDispatcher,用Servlet轉發、包含目標資源spa
咱們先來說講容器部署應用時,對Servlet怎麼作初始化的:
DD(Deployment Descriptor)文件中線程
<servlet> <init-param> <param-name>paramName</param-name> <param-value>paramValue</param-value> <init-param> </servlet>
Java文件中code
// 在一個Servlet中 getServletConfig().getInitParameter("paramName");
若是咱們有以下需求:在整個項目中獲取某一個屬性,那麼,咱們是這樣初始化的:
DD文件中:xml
<context-param> <param-name>paramName</param-name> <param-value>paramValue</param-value> </context-param>
Java文件中:對象
getServletContext().getInitParameter("paramName");
若是,咱們須要在Web項目啓動時,構造一些對象,那麼,監聽器就粉墨登場。
要使用監聽器,咱們須要作以下幾件事:
實現一個監聽器接口
覆蓋接口裏的方法
配置DD文件或者註解
咱們監聽器的Java文件以下:
@WebListener class 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");