JavaWeb 之 17.JDBC分頁和監聽器
## 分頁(重點)和 監聽器 ##
**分頁的簡介**
1.為什麼使用分頁。
2.好處:使用者體檢的非常好。查詢的速度非常快。缺點資料庫的互動比較多。
3.分頁的技術
4.MySQL的關鍵字 limit MySQL資料庫方言 (使用它就行分頁)
* mySQL 直接使用limit操作
* 使用關鍵字top,巢狀的查詢
* Oracle 巢狀查詢
5.limit關鍵字
* select * from t_customer limit a,b;
* a引數:從哪條記錄開始
* b引數:查詢多少條記錄
例: select * from t_customer limit 0,10;
-- 一共顯示10條記錄 1-10 11-20 21-30
-- 查詢第三頁的資料 0-10 10-10 20-10 (當前頁-1)*每頁顯示的資料10
**分頁的分析的過程**
1.pageCode 當前頁 -- 從頁面獲取
2.totalPage 總頁數 -- 計算出來
3.totalCount 總記錄數 -- 查詢資料庫
4.pageSize 每頁顯示的記錄數 -- 使用者規定的(10)
5.beanList 顯示的資料 -- 查詢資料庫的
6.把上述這些變數封裝到JavaBean中,PageBean。在各層之間傳遞PageBean
**分頁遇到問題**
**頁面列表**
1.頁碼列表顯示10個 -- 一共10個。
2.當前頁在第6個位置,發生變化。 -- 當前頁是pageCode
[5][6][7][8][9][10][11][12][13][14]
* 能知道開始是位置是1 ,結束的位置10.
* 定義變數開始位置begin 結束位置end
* 通過pageCode來計算begin和end
* 如果totalPage <= 10 begin =1 end = totalPage [1][2][3][4][5][6][7][8][9][10]
* 如果totalPage > 10 begin = pageCode - 5 end = pageCode + 4
* 頭溢位 當begin < 1 begin = 1 end = 10
* 尾溢位 當end > totalPage end = totalPage begin = end - 9
**帶條件的分頁查詢**
## WEB監聽器 ##
**監聽器的概述**
1.概述:監聽器是一個Java的類,作用是用來監聽另一個Java類的狀態的改變。
2.概念:(場景:電動車上安裝了一個報警器)
* 事件源:被監聽的物件 (電動車)
* 監聽器:監聽的物件 (報警器)
* 繫結事件源:在事件源上繫結監聽器。(在電動車上安裝報警器)
* 事件:一旦事件源的狀態發生了變化,建立一個事件物件,把事件物件傳遞給監聽器,監聽器中一個方法就會執行了。(我的電動車被人踢了一腳,報警器就說話了:主人,我被人給踢了!!)
* 事件物件:產生的,在監聽器中可以使用事件物件獲取事件源物件。
3.模擬的一個例子
**開發步驟**
1.編寫一個Java的類,實現監聽器的介面,重寫方法。
2.在web.xml中進行配置。
<listener>
<listener-class>cn.itcast.listener1.MyServletContextListener</listener-class>
</listener>
**第一類:域物件的建立和銷燬的監聽器**
1.ServletContextListener -- 監聽ServletContext物件的建立和銷燬。
* 方法:
* contextInitialized(ServletContextEvent sce) -- ServletContext一被建立就執行
* contextDestroyed(ServletContextEvent sce) -- ServletContext一被銷燬就執行
* ServletContext什麼建立和什麼時候銷燬?與天地同壽
* 伺服器一啟動的時候,ServletContext建立了,一次。
* ServletContext伺服器關閉的時候,或者專案移除了。銷燬了。
2.HttpSessionListener -- 監聽HttpSeesion物件的建立和銷燬
* 方法
* sessionCreated(HttpSessionEvent se) -- session一建立該方法就執行
* sessionDestroyed(HttpSessionEvent se) -- session一銷燬該方法就執行
* session什麼時候建立呢?啥時候銷燬呀?
* 第一次呼叫該request.getSession()方法,
* session什麼時候銷燬
* 預設的銷燬時間 30分鐘
* 非正常原因關閉伺服器
* 呼叫invalidate()方法銷燬
* 訪問JSP會建立session嗎 (會)? 訪問Servlet會建立呢(不一定)?訪問HTML會不會(不會)?
3.ServletRequestListener -- 監聽ServlertRequest物件的建立和銷燬
* 方法:
* requestInitialized(ServletRequestEvent sre)
* requestDestroyed(ServletRequestEvent sre)
* request什麼是建立和銷燬?
* 有一次請求就建立request物件,做出響應,就銷燬了。
* 訪問JSP會建立session嗎 (會)? 訪問Servlet會建立呢(會)?訪問HTML會不會(會)?
**統計現在線上的人數**
1.第一步:編寫一個ServeltContext的監聽器,在ServletContext物件中初始化一個變數(count 0)
2.第二步:編寫一個HttpSession的監聽器(countListener),你只要一訪問demo1.jsp,為你建立一個session,countListener中sessionCreated方法就會執行一次。 從ServletContext中獲取count值。count++,再儲存到ServletContext.
3.如果session銷燬了,sessionDestroyed預設執行,ServletContext獲取count,這回count--。
**第二類:域物件屬性的狀態改變的監聽器**
1.ServletContextAttributeListener -- 監聽ServletContext域物件中的屬性的狀態改變(增強、替換、刪除)
* attributeAdded(ServletContextAttributeEvent scab) -- 新增屬性
* attributeRemoved(ServletContextAttributeEvent scab) -- 刪除屬性
* attributeReplaced(ServletContextAttributeEvent scab) -- 替換
2.HttpSessionAttributeListener -- 監聽HttpSession域物件的屬性的狀態改變
* attributeAdded(HttpSessionBindingEvent se)
* attributeRemoved(HttpSessionBindingEvent se)
* attributeReplaced(HttpSessionBindingEvent se)
3.ServletRequestAttributeListener -- 監聽ServletRequest域物件的屬性的狀態改變
* attributeAdded(ServletRequestAttributeEvent srae)
* attributeRemoved(ServletRequestAttributeEvent srae)
* attributeReplaced(ServletRequestAttributeEvent srae)
**第三類:session域物件中的JavaBean的監聽器**
1.HttpSessionBindingListener -- 監聽Session中的JavaBean物件的繫結(存入session中)和解除繫結(從session中移除)
* 方法:
* valueBound(HttpSessionBindingEvent event) -- 繫結
* valueUnbound(HttpSessionBindingEvent event) -- 解除繫結
2.HttpSessionActivationListener -- 監聽session的中JavaBean鈍化(和session一起序列化磁碟上)和活化(從磁碟上反序列化)
* 方法:
* sessionDidActivate(HttpSessionEvent se) -- 活化
* sessionWillPassivate(HttpSessionEvent se) -- 鈍化
* 總結:對session機制的優化。通過鈍化的操作,如果一段時間沒有操作,可以把session鈍化(序列化磁碟上)。你要操作的時候,活化過來,session中東西還有。