Servlet過濾器在Java Servlet2.3中定義,能夠對Servlet容器的請求和響應對象進行檢查和修改。所有的過濾器類都必須實現(xiàn)javax.servlet.Filter接口,其中有三個需要實現(xiàn)的方法:init(FilterConfig)-一個初始化方法,Servlet容器創(chuàng)建過濾器類后將調用這個方法,在此方法中可以讀取web.xml文件中的Servlet過濾器的初始化參數(shù)。doFilter(ServletRequest,ServletResponse,FilterChain)-實際的過濾操作,F(xiàn)ilterChain參數(shù)用于訪問后面的過濾器。destroy()-用來釋放某些Servlet過濾器占用的資源。
下面是一個解決中文亂碼問題很有用的一個過濾器:
發(fā)布Servlet過濾器-在web.xml在文件中加入<filter>元素和<filter-mapping>元素
下面的例子中Servlet過濾器會過濾所有的URL:
串連Servlet過濾器多個Servlet過濾器可以協(xié)同工作,Servlet容器將根據(jù)它們在web.xml中定義的先后順序,依次調用它們的doFilter()方法。工作流程如下: Code1; // 表示調用chain.doFilter()前面的代碼 chain.doFilter(); // 表示調用下一個過濾器的doFilter()方法 Code2; // 表示調用chain.doFilter()后面的代碼
自定義JSP標簽庫此技術在JSP 1.1版本中才出現(xiàn),用來重用某些復雜的邏輯運算和事務,或定義JSP王爺?shù)妮敵鰞热莺透袷健V谱饕粋€完整的自定義標簽程序,包含3個步驟:1. 創(chuàng)建標簽的處理類此類必須擴展javax.servlet.jsp.TagSupport類或者javax.servlet.jsp.BodyTagSupport類。以TagSupport類為例,先了解一下這個類的主要方法:doStartTag()-JSP容器遇到自定義標簽的起始標志時調用該方法;doEndTag()-JSP容器遇到自定義標簽的結束標志時調用該方法;setValue(String k,Object o)-在標簽處理類中設置key/value;getValue(String k)-在標簽處理類中根據(jù)key返回匹配的value;removeValue(String k)-在標簽處理類中刪除key/value;setPageContext(PageContext pc)-設置PageContext對象,該方法在調用doStartTag()和doStartTag()前調用;setParent(Tag t)-設置嵌套當前標簽的上層標簽的處理類,該方法在調用doStartTag()和doStartTag()前調用;getParent()-返回嵌套當前標簽的上層標簽的處理類。首先調用setPageContext(PageContext pc)和setParent(Tag t),設置TagSupport類的兩個重要屬性值。如果遇到起始標志,調用doStartTag(),此方法返回一個整數(shù)值,它有兩個可選值:Tag.SKIP_BODY(標簽之間的內容被忽略)和Tag.EVAL_BODY_INCLUDE(標簽之間的內容正常執(zhí)行)。例如:<prefix:mytag>test</prefix:mytag>,如果遇上Tag.SKIP_BODY,test字符串不會顯示在頁面上;如果遇上Tag.EVAL_BODY_INCLUDE,test字符串將會顯示在頁面上。如果遇到結束標志,調用doEndTag(),此方法也返回一個整數(shù)值,它有兩個可選值:Tag.SKIP_PAGE(表示立刻停止執(zhí)行JSP頁面,網(wǎng)頁上未處理的靜態(tài)內容和JSP程序均別忽略,任何已有的輸出內容立刻返回到客戶端;)和Tag.EVAL_PAGE(表示按正常流程繼續(xù)執(zhí)行JSP頁面)。如果自定義標簽包含自定義的屬性,例如:<prefix:mytag attribute1="value1">,那么處理類中應該將這個屬性做為成員變量,并提供一組get和set方法:private int attribute1;public void setAttribute1(int value){ this.attriubte1 = value;}public int getAttribute1(){ return attribute1;}下面是一個用來驗證用戶登陸的標簽處理類例子:
2.創(chuàng)建TLD-Tag Library Descriptor(標簽庫描述文件)TLD文件中元素可以分為三類:<tablib>、<tag>、<attribute><tablib>-設定標簽庫的相關信息,包含的子元素有tlibversion、jspversion、shortname、uri、info、tag。<tag>-用來定義一個標簽,包含的子元素有name、tagcalss、bodycontent、info、attribute。bodycontent的說明:有三個可選值empty、JSP、tagdependent,empty表示標簽中沒有body,JSP表示body中可以加入JSP程序代碼,tagdependent表示body的內容有標簽進行處理。<attribute>-用來定義標簽的屬性,包含的子元素有name、required、rtexprvalue。rtexprvalue的說明:表示是否可以使用<%=...%>類型的表達式,例如:<prefix:mytaglib attribute1="<%=name%>">下面是一個簡單的TLD文件:
實際中的使用:<%@ taglib uri="/tags/test" prefix="test" %><test:ifLogin name="pepsixp" password="888888"/>3.在web應用中使用標簽先要在web.xml文件加入聲明引用標簽所在的標簽:
參考:《Tomcat與JavaWeb開發(fā)技術詳解》