1. 程式人生 > >day16-(listener&filter)

day16-(listener&filter)

回顧:
ajax:
    非同步請求
原生的ajax(瞭解)
    1.建立一個核心物件 XMLHttpRequest
    2.編寫回調函式
        xmlhttp.onreadystatechange=function(){
            if(xmlhttp.readyState==4 && xmlhttp.status==200){
                alert(xmlhttp.responseText);
            }
        }
    3.open操作
        xmlhttp.open("請求方式","請求路徑");
    
4.send操作 xmlhttp.send([引數]); post請求的引數放在send裡面 注意:若請求方式為post且有引數 必須設定一個頭 jquery中ajax 掌握: $.get(url,params,function(data){},type); type:以後常用的是json $.post(url,params,function(data){},type); 瞭解: jquery物件.load(...) 理解: $.ajax(選項) 選項: url type data success:fn error:fn dataType:
"json" ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// listener(瞭解) 監聽器 filter(★) 過濾器 ////////////////////////// listener: 監聽器 作用: 監聽web中中的域物件 ServletContext ServletRequest HttpSession 監聽內容: 監聽三個物件的建立和銷燬 監聽三個物件屬性的變化 監聽session中javabean的狀態 注意:listener全部是介面 監聽三個物件的建立和銷燬 ServletContextListener ServletRequestListener HttpSessionListener 監聽三個物件屬性的變化 ServletContextAttributeListener ServletRequestAttributeListener HttpSessionAttributeListener 監聽session中javabean的狀態 HttpSessionActivationListener(鈍化和活化) HttpSessionBindingListener(繫結和解綁) 使用步驟:
1.編寫一個類 實現介面 2.重寫方法 3.編寫配置檔案(大部分都是) 演示各個監聽器 監聽三個物件的建立和銷燬 ServletContextListener 建立:伺服器啟動的時候,會為每一個專案都建立一個servletContext 銷燬:伺服器關閉的時候,或者專案被移除的時候 以後用來載入配置檔案 ServletRequestListener 建立:請求來的時候 銷燬:響應生成的時候 HttpSessionListener 建立: java中第一次呼叫request.getSession的時候 jsp訪問的時候建立 銷燬: 三種情況: session超時 手動銷燬session 伺服器非正常關閉 監聽三個物件屬性的變化(新增 替換 刪除) ServletContextAttributeListener ServletRequestAttributeListener HttpSessionAttributeListener 監聽session中javabean的狀態 注意:這兩個介面需要javabean實現.是讓javabean感知到自己的狀態 HttpSessionBindingListener(繫結和解綁) 檢測java是否新增到session或者從session中移除 HttpSessionActivationListener(鈍化和活化) 鈍化:javabean從session中序列化到磁碟上 活化:javabean從磁碟上載入到了session中 可以通過配置檔案修改javabean什麼時候鈍化 修改一個專案 只需要在專案下/meta-info建立一個context.xml 內容如下: <Context> <!-- maxIdleSwap :1分鐘 如果session不使用就會序列化到硬碟. directory :itheima 序列化到硬碟的檔案存放的位置. --> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="itheima"/> </Manager> </Context> ////////////////////////////////////////////////// 案例1-自動登入 需求: 登入的時候,勾選自動登入,登入成功之後,關閉瀏覽器,下一次訪問網站的時候完成登入操作(自動登入). 技術分析: filter cookie ////////////////////////////////// filter:過濾器 過濾請求和響應 作用: 自動登入. 統一編碼. 過濾關鍵字 .... Filter是一個介面 編寫filter步驟: 1.編寫一個類 a.實現filter介面 b.重寫方法 2.編寫配置檔案 a.註冊filter b.繫結路徑 3.測試 Filter介面的方法: init(FilterConfig config):初始化操作 doFilter(ServletRequest request, ServletResponse response, FilterChain chain):處理業務邏輯 destroy() :銷燬操作 filter的生命週期(瞭解) filter單例項多執行緒 filter在伺服器啟動的時候 伺服器建立filter 呼叫init方法 實現初始化操作 請求來的時候,建立一個執行緒 根據路徑呼叫dofilter 執行業務邏輯 當filter被移除的時候或者伺服器正常關閉的時候 呼叫destory方法 執行銷燬操作. FilterChain:過濾鏈 通過chain的dofilter方法,可以將請求放行到下一個過濾器,直到最後一個過濾器放行才可以訪問到servlet|jsp doFilter()放行方法 ★url-pattern配置 3種 完全匹配 必須以"/" 開始 例如: /a/b 目錄匹配 必須以"/" 開始 以"*"結束 例如:/a/b/* 字尾名匹配 以"*."開始 以字元結束 例如 : *.jsp *.do *.action 例如: afilter 路徑 /* bFilter 路徑 /demo4 ★一個資源有可能被多個過濾器匹配成功,多個過濾器的執行順序是按照web.xml中filter-mapping的順序執行的 /////////////////////////////// 步驟分析: 1.資料庫和表 create database day16; use day16; create table user( id int primary key auto_increment, username varchar(20), password varchar(20) ); insert into user values(null,'tom','123'); 2.web專案 jar包 工具類 配置檔案 3.新建一個登入頁面 表單 4.表單提交 loginservlet 接受使用者名稱和密碼 呼叫service完成登入操作,返回值User 判斷user是否為空 若不為空,將user放入session中 判斷是否勾選了自動登入 若勾選了: 需要將使用者名稱和密碼寫回瀏覽器 5.下次訪問網站的時候 過濾器攔截任意請求 判斷有無指定的cookie 有cookie,獲取使用者名稱和密碼 呼叫service完成登入操作,返回user 當user不為空的時候將user放入session中. 當我們換用jack登入的時候發現登入不了 自動登入只需要登入一次:當session中沒有使用者的時候 訪問有些資源是不需要自動登入的(和登入還有註冊相關的資源) 修改filter的邏輯: 首先判斷session中是否有user 若沒有 並且訪問的路徑不是和登入註冊相關的時候 才去獲取指定的cookie /////////////////////////////////////////////////////// /////////////////////////////////////////////////////// filter總結 filterConfig:(瞭解) 過濾器的配置物件 作用: 獲取全域性管理者 獲取當前filter的名稱 獲取當前filter的初始化引數 filter-mapping的子標籤(理解) servlet-name:匹配那個servlet 值寫的是serlvet標籤中servlet-name的值 建議:不要在一個filter中重複的匹配servlet 例如: serlvet的url-pattern為 /a/b/hello serlvetname:HelloServlet 如果filter中的url-pattern /* 最好不要在寫 servlet-name:HelloServlet dispatcher: 匹配哪種請求 預設的是REQUEST,一旦顯式的寫出來哪種請求,預設就不起作用了 理解 REQUEST:從瀏覽器傳送過來的請求(預設) 理解 FORWARD:轉發過來的請求 理解 瞭解 ERROR:因伺服器錯誤而傳送過來的請求 INCLUDE:包含過來的請求 ////////////////////////// ////////////////////////// 案例2-統一字元編碼 需求: 以前我們開發的時候若有引數,第一步都是設定編碼,才不會出現亂碼,通過過濾器設定,到servlet或者jsp上的時候已經沒有亂碼問題 技術分析: filter 配置路徑/* 過濾器的第一個位置 在filter中重寫getParameter(加強) 步驟分析: 我們只需要在filter中 對request進行加強(例如:只對request.getParameter()進行加強) 方法加強: 1.繼承(獲取構造器) 2.裝飾者模式(靜態代理) 3.動態代理 裝飾者書寫步驟: 1.要求裝飾者和被裝飾者實現同一個介面或者繼承同一個類 2.裝飾者中要有被裝飾者的引用 3.對需要加強方法進行加強 4.對不需要加強的方法呼叫原來的方法即可 加強request.getParameter(String key) 首先請求的方式不同,處理的方式也不同 獲取請求的方法 若是get請求 new String(value.getBytes("iso8859-1"),"utf-8"); 若是post請求 只需要設定一句話 request.setCharacterEncoding("utf-8"); 最後將包裝過的request物件(MyRequest)傳遞給servlet即可 /////////////////////////////////////////////////// /////////////////////////////////////////////////// 關於獲取引數的方法 String getParameter(String name);// arr[0] String[] getParameterValues(String name);// map.get(name) Map<String,String[]> getParameterMap(); ////////////////////////////////////////////// ////////////////////////////////////////////// listener 監聽器 監聽javaweb中的三個域物件 監聽三個物件的建立和銷燬 ServletContextListener ServletRequestListener HttpSessionListener 監聽三個物件屬性的變化 ServletContextAttributeListener ServletRequestAttributeListener HttpSessionAttributeListener 監聽javabean在session中的狀態 注意: javabean實現的介面 不需要在web.xml中配置 HttpSessionActivationListener(javabean的活化和鈍化) HttpSessionBindingListener(新增到session中還是從session中移除) 編寫步驟: 1.編寫一個類 實現介面 2.編寫配置檔案 <listener> <listener-class>.... </listener> ///////////////////////////////////// filter 介面,過濾請求和響應 編寫步驟: 1.編寫一個類 實現filter 重寫三個方法 2.編寫配置檔案 註冊filter 繫結路徑 filter的生命週期(瞭解) url-pattern配置(和servlet一樣) 一個路徑匹配到多個filter的時候,執行順序有有web.xml中filter-mapping的順序來決定的 FilterChain 必須放行才有可能到下一個Filter或者資源上 //////////////////////