【Servlet】03-Web容器模型

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項目啓動時,構造一些對象,那麼,監聽器就粉墨登場。

要使用監聽器,咱們須要作以下幾件事:

  1. 實現一個監聽器接口

  2. 覆蓋接口裏的方法

  3. 配置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");
相關文章
相關標籤/搜索