fossil

          鳥在籠中,恨關(guān)羽不能張飛 人處世上,要八戒更須悟空
          posts - 40, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          日歷

          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          學(xué)習(xí)

          • 前輩
          • 向前輩學(xué)習(xí)

          搜索

          •  

          最新評(píng)論

          原創(chuàng)講解JSP過濾器和監(jiān)聽器

          BeanSoft(劉長(zhǎng)炯) 2007年11月

          關(guān)于這個(gè)問題, 比較復(fù)雜的說. 不過我希望通過例子來解釋會(huì)方便理解一些.

          假設(shè)有一個(gè)非常危險(xiǎn)的任務(wù), 是九死一生. 需要你揣著炸藥包從北平開車走高速路過保定去石家莊把鬼子的碉堡給炸了. 注意: 這個(gè)任務(wù)十分艱巨, 有可能半路炸藥爆炸. 所以出發(fā)前你需要苦練10元一本的<<鐵布衫>>, 還需要立遺囑交代一下后事. 下面是路線圖:
          去時(shí)路線: 北平 ==> 高速路收費(fèi)站入口(都有警察和警犬) A? ==> 保定收費(fèi)站 B ==> 石家莊收費(fèi)站 C ==> 炸碉堡 D ==> 轉(zhuǎn)車(剛才的車已經(jīng)炸沒了) E =>
          回來路線: 石家莊收費(fèi)站 ==> 保定收費(fèi)站 ==> 高速路收費(fèi)站出口(都有警察和警犬) A ==> 安全回到北平 G

          那么我們先簡(jiǎn)介可能發(fā)生的情況.? A 點(diǎn)有可能被警察和警犬發(fā)現(xiàn), 所以你只能被扭送回北平.? 即使不被發(fā)現(xiàn), 還可能出現(xiàn)收費(fèi)時(shí)發(fā)現(xiàn)10個(gè)現(xiàn)大洋一個(gè)路口的買路錢沒帶!! 哎, 只能又回去了. 還有最慘的: 高速路入口寫著: 對(duì)不起, 到石家莊的路線因?yàn)槭┕げ煌? 只好回家等著吧.
          到了B和C你可能還會(huì)被人發(fā)現(xiàn)帶了炸藥包, 或者發(fā)現(xiàn)買路費(fèi)少帶了! 極有可能又被扭送回北平, 注意已經(jīng)在半道了, 是不會(huì)讓你繼續(xù)到石家莊的, 所以你會(huì)被從車上逮下來, 然后轉(zhuǎn)到警車上帶回來!? 也就是從 B 或者 C 直接返回.
          好了, 最佳情況就是你炸了碉堡, 也成功的返回了. 然后你可以開心的把<<鐵布衫>>扔了, 然后宣告遺囑作廢.

          OK, 以上過程, 就是過濾器和監(jiān)聽器的真實(shí)案例.

          那么炸碉堡這個(gè)任務(wù), 就相當(dāng)于要調(diào)用 JSP 或者 Servlet 來獲得執(zhí)行結(jié)果(炸碉堡 D ).? 在執(zhí)行之前你需要做一些準(zhǔn)備工作, 相當(dāng)于要寫一個(gè)
          監(jiān)聽器 com.allanlxf.ums.web.ServiceListener
          在里面你可以做一些事情例如初始化資源, 例如上文的苦練<<鐵布衫>>, 立遺囑, 這個(gè)相當(dāng)于代碼中的
          public void contextInitialized(ServletContextEvent sce) 這樣一個(gè)初始化事件.
          那么在整個(gè)任務(wù)完成之后, 這些事情你就要考慮應(yīng)該作廢了, 所以需要
          public void contextDestroyed(ServletContextEvent sce) 這樣一個(gè)銷毀事件, 例如把<<鐵布衫>>扔了, 然后宣告遺囑作廢, 也就是收回資源.

          那么過濾器在哪里呢? 它位于任務(wù)的 A B C 點(diǎn). 注意是雙向路程都會(huì)經(jīng)過的. 也就是請(qǐng)求和響應(yīng)都會(huì)經(jīng)過. 但是過濾器也會(huì)檢查不同的情況, 例如 A 點(diǎn)實(shí)際上有兩個(gè)過濾功能: 查炸藥包和收買路錢. 這就相當(dāng)于配置了:
          ??
          ?????? sessionFilter
          ???? * *.do
          ???? * REQUEST
          ???? * FORWARD
          ??
          ?
          兩個(gè)過濾功能都要檢查. 如果成功了怎么辦呢? 會(huì)繼續(xù)讓你走下一個(gè)路口, 注意不是讓你直接成功. 也就是代碼:
          ??????? if(session.getAttribute("user") != null || path.equals("/login"))//若用戶已經(jīng)登錄并且當(dāng)前路徑仍然停留在登錄頁面????? {???????????
          ?????????? chain.doFilter(request, response);//繼續(xù)走下面的過濾器或者任務(wù)(不保證最終任務(wù), 因?yàn)橄聜€(gè)過濾器也可能讓你回來)
          ?????????? 只有當(dāng)走到 C 點(diǎn)的時(shí)候, 下一步才是執(zhí)行了最終的任務(wù): 執(zhí)行JSP或者Servlet.
          ?????? }
          反過來怎么辦? 把你扭送上警車, 強(qiáng)行返回! 這樣你連路口 B C 和最終任務(wù)都無法訪問了. 也就是不會(huì)讓你訪問下一個(gè)過濾器和執(zhí)行最終的 JSP 或者 Serlvet, 可以選擇直接返回, 或者放警車上帶回去.
          ?????? {
          ?????????? return;// 直接返回
          ?????????? 或者 response.sendRedirect(request.getContextPath() + "/login.jsp");//則扭送上警車, 強(qiáng)行返回到警察局
          ?????? }

          那么在 E 點(diǎn)發(fā)生了什么? 也就是你可能替換掉了原來的 response 對(duì)象,? 也就是換車. 這意味著你可以在過濾器里私下修改請(qǐng)求和響應(yīng)對(duì)象.

          雖然已經(jīng)不那么抽象了, 但是要理解可能還是需要耐心體會(huì)的.

          =====================================================================
          注: 原始問題

          ??? 1.請(qǐng)看下面一段代碼和其注釋:
          import javax.servlet.*;

          import javax.servlet.http.*;

          import java.io.*;

          public class SessionFilter extends HttpFilter

          {

          ?? public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)

          ?????????????? throws ServletException, IOException

          ?? {

          ?????? String path = request.getServletPath();//取得該servlet的路徑名稱

          ?????? path = path.substring(0, path.indexOf("."));?? //獲得路徑中.之前的部分

          ?????? HttpSession session = request.getSession();//從請(qǐng)求中取得session為得是從session中讀取用戶是否登錄的標(biāo)志值

          ?????? if(session.getAttribute("user") != null || path.equals("/login"))//若用戶已經(jīng)登錄并且當(dāng)前路徑仍然停留在登錄頁面

          ?????? {???????????

          ???????? *? chain.doFilter(request, response);//則將當(dāng)前濾鏡加入到濾鏡鏈條當(dāng)中

          ?????? }else//若用戶尚未成功登錄

          ?????? {

          ?????????? response.sendRedirect(request.getContextPath() + "/login.jsp");//則使用請(qǐng)求重定向轉(zhuǎn)到登錄頁面

          ?????? }???????

          ?? }

          }

          /*

          * 該Filter濾鏡類所過濾的是用戶在瀏覽器中輸入的

          * 當(dāng)前web application的訪問路徑,通過判斷用戶是

          * 否成功登錄而決定是否對(duì)訪問路徑加以限止

          * 在該web application的web.xml配置文件中為

          * 該filte濾鏡做了相應(yīng)配置

          */

          請(qǐng)問: 上面代碼FilterChain對(duì)象盛裝的是Filter對(duì)象, 可它是怎么工作的啊?
          加*號(hào)的語句是何用意啊,不是過濾路徑嗎, 為什么要將請(qǐng)求與響應(yīng)加入呢?

          2.請(qǐng)看下面一段代碼:

          import javax.servlet.*;

          import javax.servlet.http.*;

          import java.io.*;

          public abstract class HttpFilter implements Filter

          {

          ?? private FilterConfig config;

          ?? public void init(FilterConfig config) throws ServletException

          ?? {

          ?????? this.config = config;

          ?????? init();

          ?? }

          ?? public void init() throws ServletException

          ?? {

          ?? }

          ?? public String getInitParameter(String name)

          ?? {

          ?????? return config.getInitParameter(name);

          ?? }

          ?? public ServletContext getServletContext()

          ?? {

          ?????? return config.getServletContext();

          ?? }

          ?? public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

          ?????????????? throws ServletException, IOException

          ?? {

          ?????? doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);

          ?? }

          ?? public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)

          ?????????????? throws ServletException, IOException;

          ?? public void destroy()

          ?? {

          ?? }

          }

          請(qǐng)問: 該類就這樣寫了一下,沒有包含任何行為,它如何完成過濾工作啊?

          3.請(qǐng)看下面代碼:
          package com.allanlxf.ums.web;

          import javax.servlet.*;

          //import javax.servlet.http.*;

          import com.allanlxf.ums.service.SystemService;

          import com.allanlxf.ums.service.StudentService;

          public class ServiceListener implements ServletContextListener

          {

          ?? public void contextInitialized(ServletContextEvent sce)

          ?? {

          ?????? ServletContext application = sce.getServletContext();

          ?????? StudentService service = new StudentService();

          ?????? application.setAttribute("studentService", service);

          ?????? SystemService systemService = new SystemService();

          ?????? application.setAttribute("systemService", systemService);

          ?? }

          ?? public void contextDestroyed(ServletContextEvent sce)

          ?? {

          ?? }

          }

          /*

          *本類是該web application的監(jiān)聽器類,在該類中,

          *將兩個(gè)無為本系統(tǒng)提供服務(wù)的兩個(gè)對(duì)象寫入到了

          *application隱含對(duì)象中(這樣保證在該系統(tǒng)的任何

          *地方都能夠取得這兩個(gè)服務(wù)類對(duì)象的引用)

          *在本系統(tǒng)的web.xml文件中對(duì)該監(jiān)聽器做了配置

          */

          請(qǐng)問: 為什么要將服務(wù)類對(duì)象寫入到程序上下文中呢,直接創(chuàng)建不也一樣嗎?
          ???? 監(jiān)聽器只有這樣的功能嗎,是否還有其它功能呢?

          3.請(qǐng)看下面的配置文件內(nèi)容:

          ??
          ?????? sessionFilter
          ?????? com.allanlxf.ums.web.SessionFilter
          ??
          ???
          ??
          ?????? sessionFilter
          ???? * *.do
          ???? * REQUEST
          ???? * FORWARD
          ??
          ???????
          ??
          ?????? com.allanlxf.ums.web.ServiceListener
          ???

          請(qǐng)問: 加*號(hào)的三項(xiàng)是什么意思?

          當(dāng)初老師講的時(shí)候,許多基本的原則原理尚不清楚,這些根本沒有聽明白,當(dāng)然,老師也未細(xì)講,只說會(huì)用即可, 可是若不能明白其本質(zhì),用也只能用這一點(diǎn)兒, 怎么成呢, 希望您能夠比較詳悉的講一下. thank you very much!




          文章來源:http://www.aygfsteel.com/beansoft/archive/2007/11/09/159374.html

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 长宁区| 桂阳县| 古丈县| 阳泉市| 蓝田县| 醴陵市| 剑川县| 新乡市| 麻城市| 县级市| 礼泉县| 小金县| 吉林省| 新乡市| 青阳县| 洪洞县| 桑日县| 万源市| 七台河市| 嫩江县| 永仁县| 始兴县| 饶河县| 高陵县| 黑龙江省| 沙洋县| 九龙城区| 建始县| 汽车| 大冶市| 西安市| 伊通| 郁南县| 阜新| 五莲县| 岳阳市| 资兴市| 孝感市| 泸州市| 呈贡县| 合水县|