Java Web程序開發(fā)與分析課件:Servlet編程(三)_第1頁
Java Web程序開發(fā)與分析課件:Servlet編程(三)_第2頁
Java Web程序開發(fā)與分析課件:Servlet編程(三)_第3頁
Java Web程序開發(fā)與分析課件:Servlet編程(三)_第4頁
Java Web程序開發(fā)與分析課件:Servlet編程(三)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

JavaWeb程序設(shè)計

——Servlet編程(3)2主要內(nèi)容過濾器(Filter)概述

FilterAPIFilter接口FilterConfig接口FilterChain接口過濾器的創(chuàng)建與部署3過濾器(Filter)概述

在Web應(yīng)用程序中,過濾器位于服務(wù)器端,在客戶端和服務(wù)器端資源之間過濾請求和響應(yīng)數(shù)據(jù)。過濾器(Filters)是在Servlet2.3規(guī)范中引入的新功能,并在Servlet2.4規(guī)范中得到增強。過濾器是一種Web組件,它們攔截請求和響應(yīng),以查看、提取或以某種方式操作客戶機和服務(wù)器之間交換的數(shù)據(jù)。

4

對于Web應(yīng)用,過濾器是駐留在服務(wù)器端,對Web請求和Web響應(yīng)的頭屬性(Header)和內(nèi)容體(Body)進行操作的一種特殊Web組件。如下圖所示:

客戶端瀏覽器Web容器目標(biāo)資源過濾器請求響應(yīng)圖1過濾器示意圖5

在一個Web應(yīng)用程序中,可以部署多個過濾器,這些過濾器組成一個過濾器鏈。過濾器鏈中的每個過濾器都有特定的操作,Web請求和響應(yīng)信息按照一定過濾器順序,在過濾器之間進行傳遞。Web容器目標(biāo)資源過濾器1過濾器2過濾器n…客戶端瀏覽器請求響應(yīng)圖2多個過濾器組成的過濾器鏈6

FilterAPI

與過濾器開發(fā)相關(guān)的接口和類包含在javax.servlet和javax.servlet.http包中,主要的接口和類如下:

(1)javax.servlet.Filter接口

該接口是過濾器必須要實現(xiàn)的接口,提供了過濾器生命周期中的基本方法。

(2)javax.servlet.FilterChain接口

該接口提供了對某一資源過濾請求調(diào)用鏈的視圖,過濾器對象可以使用該接口的對象。

7(3)javax.servlet.FilterConfig接口

該接口的對象為過濾器配置對象,其在初始化期間將信息傳遞給過濾器。

(4)javax.servlet.ServletRequestWrapper類

為ServletRequest接口的實現(xiàn)。

(5)javax.servlet.ServletResponseWrapper類

為ServletResponse接口的實現(xiàn)。

(6)javax.servlet.HttpServletRequestWrapper類

為HttpServletRequest接口的實現(xiàn)。

(7)javax.servlet.HttpServletReponseWrapper類

為HttpServletResponse接口的實現(xiàn)。8主要內(nèi)容過濾器(Filter)概述過濾器接口Filter接口FilterConfig接口FilterChain接口過濾器的創(chuàng)建與部署9(1)Filter接口

Filter接口是開發(fā)過濾器必須要實現(xiàn)的接口,該接口定義了init(),doFilter(),destroy()三個方法。這3個方法分別對應(yīng)Servlet過濾器生命周期中的初始化、響應(yīng)和銷毀3個階段。

①publicvoidinit(FilterConfigconfig)throwsServletException

該方法為過濾器的初始化方法,只在實例化過濾器時才會被調(diào)用一次。其中,該方法參數(shù)為FilterConfig對象,包含了在部署描述符配置中的與過濾器相關(guān)的初始化參數(shù)。10②publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsjava.io.IOException,ServletException

該方法實現(xiàn)了過濾器對Web請求和響應(yīng)的操作功能,當(dāng)請求和響應(yīng)經(jīng)過過濾器時,Web容器都要調(diào)用該方法doFilter()一次。

FilterChain參數(shù)對于正確的過濾器操作至關(guān)重要,為了將請求/響應(yīng)沿過濾器鏈繼續(xù)傳送,在每個過濾器的doFilter()方法中必須要調(diào)用FilterChain對象的doFilter()方法。11

在過濾器中處理的ServletRequest和ServletResponse對象,最終要傳遞到被過濾的Servlet或JSP,所以在doFilter()方法中可以通過對ServletRequest的操作來改變Web請求的頭信息,通過對ServletResponse的操作來改變響應(yīng)信息。任何出現(xiàn)在FilterChain的doFilter()方法之前的代碼都被看作預(yù)處理過濾器邏輯,在這一階段,可以對請求信息進行修改,但不能修改響應(yīng)信息;12任何出現(xiàn)在FilterChain的doFilter()方法之后的代碼都被看作過濾器邏輯的后處理,在這一階段,可以對響應(yīng)信息進行修改,但不能修改請求信息;③publicvoiddestroy()

調(diào)用destroy()方法表示過濾器生命周期結(jié)束,并且釋放過濾器使用的資源。FilterChain對象doFilter()過濾器邏輯的預(yù)處理過濾器邏輯的后處理可以修改請求信息可以修改響應(yīng)信息13(2)FilterConfig接口

FilterConfig接口包含以下的方法:

①publicStringgetFilterName()

獲得過濾器的名稱。②publicStringgetInitParameter(Stringname)

獲得過濾器的初始化字符串。③publicEnumerationgetInitParameterNames()

獲得過濾器初始化字符串的名稱。④publicServletContextgetServletContext()

獲得過濾器所在Web應(yīng)用的Servlet上下文對象引用。14(3)FilterChain接口

FilterChain接口僅定義了一個方法:

publicvoiddoFilter(ServletRequestreq,ServletResponseres)

該方法用于請求/響應(yīng)沿過濾器鏈向后傳送給下一個過濾器,如果調(diào)用該方法的過濾器是鏈中最后一個,那么目標(biāo)資源將被調(diào)用。

因此,過濾器對象通過FilterChain對象調(diào)用過濾器鏈中的下一個過濾器或者調(diào)用目標(biāo)資源。15主要內(nèi)容過濾器(Filter)概述

FilterAPIFilter接口FilterConfig接口FilterChain接口

過濾器的創(chuàng)建與部署16創(chuàng)建過濾器類:17packagepack;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjava.io.PrintWriter;public

classTestFilterimplementsFilter{過濾器類18publicTestFilter(){//TODOAuto-generatedconstructorstub}publicvoiddestroy(){//TODOAuto-generatedmethodstub}publicvoidinit(FilterConfigfConfig)throwsServletException{//TODOAuto-generatedmethodstub}19

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("befordoFilter");chain.doFilter(request,response);out.println("afterdoFilter");out.close();}調(diào)用FilterChain對象20<%@pagelanguage="java"contentType="text/html;charset=gb2312"pageEncoding="gb2312"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"><title>Inserttitlehere</title></head><body>

Filter測試!</body></html>test.jsp(需要過濾的JSP頁面)21<filter>

<description>

</description>

<display-name>TestFilter</display-name>

<filter-name>TestFilter</filter-name>

<filter-class>pack.TestFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>TestFilter</filter-name>

<url-pattern>/test.jsp</url-pattern>

</filter-mapping>web.xml文檔如果是Servlet:<servlet-name>myServlet</servlet-name>22運行結(jié)果:23說明:在Web應(yīng)用程序中,經(jīng)常需要用戶在頁面中輸入一些數(shù)據(jù),用戶在將這些數(shù)據(jù)提交給Web服務(wù)器,由服務(wù)器端的程序進行處理前,可以采用過濾器攔截客戶端的請求信息,獲得輸入?yún)?shù),對輸入?yún)?shù)的合法性進行校驗。

(1)實現(xiàn)3個JSP頁面:

FormCheck.jsp;FormSuccess.jsp;

FormFail.jsp

(2)實現(xiàn)一個過濾器:FormFilter.java

例:應(yīng)用過濾器對頁面表單數(shù)據(jù)進行校驗24FormCheck.jsp:<body><h2>使用過濾器校驗表單數(shù)據(jù):</h2><formmethod="post"

action="FormSuccess.jsp"><table><tr><td>姓名:</td><td><inputname="name"type="text"></td></tr><tr><td>年齡:</td><td><inputname="age"type="text"></td></tr><tr><td></td>

25<td><inputname="submit"type="submit"value="提交"><inputname="reset"type="reset"value="重置"></td></tr></table></form></body>26FormSuccess.jsp:<body><h2>您提交的數(shù)據(jù):</h2><form><table><tr><td>姓名:</td><td><inputname="name"type="text"

value=<%=request.getParameter("name")%>

readonly="true"></td></tr><tr>27<td>年齡:</td><td><inputname="age"type="text"

value=<%=request.getParameter("age")%>readonly="true"></td></tr></table></form>

<h2><fontcolor="#FF0000">數(shù)據(jù)成功通過了過濾器校驗!</font></h2></body>28FormFail.jsp:<body><h2>您提交的數(shù)據(jù)如下:</h2><form><table><tr><td>姓名:</td><td><inputname="name"type="text"

value=<%=request.getParameter("name")%>readonly="true"></td></tr><tr>29<td>年齡:</td><td>

<inputname="age"type="text"value=<%=request.getParameter("age")%>readonly="true"></td></tr></table></form>

<h2><fontcolor="#0000EE">輸入數(shù)據(jù)沒能通過過濾器的校驗!</font></h2></body>30FormFilter.java:packagepack;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.*;public

class

FormFilter

implementsFilter{31publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{

Stringname=request.getParameter("name");

StringstrAge=request.getParameter("age");

intage;

RequestDispatcherdispatcher=

request.getRequestDispatcher("FormFail.jsp");

該對象包裝位于特定路徑上的服務(wù)器資源32if(name==null||strAge=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論