Web服務啟動時自動載入Servlet,並執行service處理 監聽處理
自動載入servlet,非常棒的方式
- 這個有什麼作用呢?
自動載入我們的Servlet,之前我也是覺得這個東西,非常的簡單嘛。自動載入就自動載入啦。有什麼覺得可以理解的呢?
其實這裡面的東西非常的深入的哦,好好的瞭解哈,非常的有必要哦。為啥這麼說呢?我們先看哈我最近遇到的吧!
需求如下:
做一個Api介面,提供給別人使用,然後呢,我們的使用次數是有限制的,所以不能使用太多次。這個呢其實感覺很簡單的,啊。就是一個簡單的問題。每次請求的時候設定一個監聽器,然後操作資料庫相應的減少就好了。可是啊,每次操作資料庫這樣的請求方式真的好?這個問題很難考慮吧!我們可以考慮直接載入到記憶體中操作,也就是剛剛開始的時候,我們直接的就把所有的使用者的資料全部載入到記憶體中去處理,每次請求修改哈哈,我們的資料就好了。然後設定一個定時器獲取我們的資料,定期的修改資料。這裡處理的時候要注意,我們不可能每個使用者都去修改澀,要把修改過的資料和沒有修改過的資料分開啦處理。不然資料量大了,這個修改太恐怖啦!這個其實也是減少資料庫請求的次數!
第二個就是:我們使用JMS為設定監聽器,我看好多的例子都是使用直接配置的方式設定監聽器的,但是我實習的公司沒有這麼處理,直接使用函式操作,這個就是涉及到了一個問題,我們在整個web程式啟動的時候,必須註冊這個監聽器,不然我們沒辦法監聽訊息的建立者傳送的訊息。這個也是需要我們去處理的問題。
其實還有一種解決方案,就是spring啟動的時候會預設的初始化,單例模式的bean,我麼也是可以在夠造函式中初始化哦!其實這種方式也行,但是工程大了最後哈不清楚邏輯思路啦。
在web.xml這樣定義一個servlet:
<servlet>
<servlet-name>t1</servlet-name>
<servlet-class>com.base.test.T1</servlet-class>
<!-- 如果需要自動載入,加下面一句 -->
<load-on-startup>1</load-on-startup>
</servlet>
< load-on-startup>標記web容器是否在啟動的時候就載入這個servlet 當值為0或者大於0時,表示web容器在應用啟動時就載入這個servlet; 當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才載入; 正數的值越小,啟動該servlet的優先順序越高。
在寫這個Servlet裡,需要重寫init()方法:
package com.base.test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class T1 extends HttpServlet {
public T1() {
super();
}
public void init() throws ServletException {
System.out.println("init t1 ... " );
}
}
重啟web容器,在控制檯可以看到”init t1 … “這麼一行資訊。
所以啊,我們也是可以在這裡處理載入使用者的資料,在Spring啟動之後進行,吧載入的地位放低一點就好了澀!
應為這個servlet不是我們的請求呼叫的哦,會一直存在的,相當於全域性函式啦,所以我們可以設定個全域性的變數進行處理,每個請求都是可以得到這個靜態的變數的,哈哈。就可以通過監聽我們的請求修改這個變數的值,在使用定時器定時的載入到資料庫中去就好了。
好啦,怎麼監聽呢?
監聽器就是一個實現特定介面的普通java程式,這個程式專門用於監聽另一個java物件的方法呼叫或屬性改變,當被監聽物件發生上述事件後,監聽器某個方法將立即被執行。
servlet的監聽器,我們可以繼承他們完成各種各種的功能,對於那些框架中也是有各種可以使用的監聽器,實質是不變的,就是進行了封裝而已。
在Servlet規範中定義了多種型別的監聽器,它們用於監聽的事件源分別為 ServletContext, HttpSession 和 ServletRequest 這三個域物件。
Servlet規範針對這三個物件上的操作,又把這多種型別的監聽器劃分為三種類型。
• 監聽三個域物件建立和銷燬的事件監聽器
• 監聽域物件中屬性的增加和刪除的事件監聽器
• 監聽繫結到 HttpSession域中的某個物件的狀態的事件監聽器。(檢視API文件)
監聽servletContext域物件建立和銷燬
ServletContextListener 介面用於監聽 ServletContext物件的建立和銷燬事件。
當 ServletContext物件被建立時,激發contextInitialized (ServletContextEvent sce)方法
當ServletContext 物件被銷燬時,激發contextDestroyed(ServletContextEvent sce)方法。
監聽HttpSession域物件建立和銷燬
HttpSessionListener介面用於監聽HttpSession建立和銷燬
建立一個Session時,sessionCreated(HttpSessionEventse) 方法將會被呼叫。 銷燬一個Session時,sessionDestroyed(HttpSessionEvent se) 方法將會被呼叫。Session域物件建立和銷燬的時機建立:使用者每一次訪問時,伺服器建立session
銷燬:如果使用者的session30分鐘沒有使用,伺服器就會銷燬session,我們在web.xml裡面也可以配置session失效時間
監聽HttpRequest域物件建立和銷燬
ServletRequestListener 介面用於監聽ServletRequest 物件的建立和銷燬。
Request 物件被建立時,監聽器的requestInitialized方法將會被呼叫。
Request物件被銷燬時,監聽器的requestDestroyed方法將會被呼叫。
建立:使用者每一次訪問,都會建立一個reqeust
銷燬:當前訪問結束,request物件就會銷燬
監聽三個域物件屬性變化
Servlet規範定義了監聽ServletContext, HttpSession, HttpServletRequest 這三個物件中的屬性變更資訊事件的監聽器。
這三個監聽器介面分別是ServletContextAttributeListener,HttpSessionAttributeListener ServletRequestAttributeListener
這三個介面中都定義了三個方法來處理被監聽物件中的屬性的增加,刪除和替換的事件,同一個事件在這三個介面中對應的方法名稱完全相同,只是接受的引數型別不同
attributeAdded 方法當監聽器的域物件中的某個屬性被增加時,web容器呼叫事件監聽器的這個方法進行相應
attributeRemoved 方法當監聽器的域物件中的某個屬性被刪除時,web容器呼叫事件監聽器的這個方法進行相應
attributeReplaced 方法 當監聽器的域物件中的某個屬性被替換時,web容器呼叫事件監聽器的這個方法進行相應
public void attributeRmoved(ServletRequestAttributeEvent srae)
public void attributeRemoved (HttpSessionBindingEvent hsbe)
public void attributeRemoved(ServletContextAttributeEvent scae)