隨筆-18  評(píng)論-8  文章-0  trackbacks-0

          Servlet過(guò)濾器
          在Java Servlet2.3中定義,能夠?qū)ervlet容器的請(qǐng)求和響應(yīng)對(duì)象進(jìn)行檢查和修改。所有的過(guò)濾器類都必須實(shí)現(xiàn)javax.servlet.Filter接口,其中有三個(gè)需要實(shí)現(xiàn)的方法
          init(FilterConfig)-一個(gè)初始化方法,Servlet容器創(chuàng)建過(guò)濾器類后將調(diào)用這個(gè)方法,在此方法中可以讀取web.xml文件中的Servlet過(guò)濾器的初始化參數(shù)。
          doFilter(ServletRequest,ServletResponse,FilterChain)-實(shí)際的過(guò)濾操作,F(xiàn)ilterChain參數(shù)用于訪問(wèn)后面的過(guò)濾器。
          destroy()-用來(lái)釋放某些Servlet過(guò)濾器占用的資源。

          下面是一個(gè)解決中文亂碼問(wèn)題很有用的一個(gè)過(guò)濾器:

          public class SetCharacterEncodingFilter implements Filter {
              
              
          public void destroy() {}
            
              
          public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
                 throws IOException, ServletException 
          {

              request.setCharacterEncoding(
          "GB2312");
              chain.doFilter(request, response);
              }


              
          public void init(FilterConfig filterConfig) throws ServletException {}
          }

          發(fā)布Servlet過(guò)濾器-在web.xml在文件中加入<filter>元素和<filter-mapping>元素

          下面的例子中Servlet過(guò)濾器會(huì)過(guò)濾所有的URL:

          <filter> 
          <filter-name>Set Character Encoding</filter-name> 
          <filter-class>SetCharacterEncodingFilter</filter-class> 
          </filter> 
          <filter-mapping> 
          <filter-name>Set Character Encoding</filter-name>
          <url-pattern>/*</url-pattern> 
          </filter-mapping>

          串連Servlet過(guò)濾器
          多個(gè)Servlet過(guò)濾器可以協(xié)同工作,Servlet容器將根據(jù)它們?cè)趙eb.xml中定義的先后順序,依次調(diào)用它們的doFilter()方法。
          工作流程如下:
           Code1; // 表示調(diào)用chain.doFilter()前面的代碼
           chain.doFilter();  // 表示調(diào)用下一個(gè)過(guò)濾器的doFilter()方法
           Code2; // 表示調(diào)用chain.doFilter()后面的代碼

          自定義JSP標(biāo)簽庫(kù)
          此技術(shù)在JSP 1.1版本中才出現(xiàn),用來(lái)重用某些復(fù)雜的邏輯運(yùn)算和事務(wù),或定義JSP王爺?shù)妮敵鰞?nèi)容和格式。制作一個(gè)完整的自定義標(biāo)簽程序,包含3個(gè)步驟:

          1. 創(chuàng)建標(biāo)簽的處理類
          此類必須擴(kuò)展javax.servlet.jsp.TagSupport類或者javax.servlet.jsp.BodyTagSupport類。
          以TagSupport類為例,先了解一下這個(gè)類的主要方法:
          doStartTag()-JSP容器遇到自定義標(biāo)簽的起始標(biāo)志時(shí)調(diào)用該方法;
          doEndTag()-JSP容器遇到自定義標(biāo)簽的結(jié)束標(biāo)志時(shí)調(diào)用該方法;
          setValue(String k,Object o)-在標(biāo)簽處理類中設(shè)置key/value;
          getValue(String k)-在標(biāo)簽處理類中根據(jù)key返回匹配的value;
          removeValue(String k)-在標(biāo)簽處理類中刪除key/value;
          setPageContext(PageContext pc)-設(shè)置PageContext對(duì)象,該方法在調(diào)用doStartTag()和doStartTag()前調(diào)用;
          setParent(Tag t)-設(shè)置嵌套當(dāng)前標(biāo)簽的上層標(biāo)簽的處理類,該方法在調(diào)用doStartTag()和doStartTag()前調(diào)用;
          getParent()-返回嵌套當(dāng)前標(biāo)簽的上層標(biāo)簽的處理類。

          首先調(diào)用setPageContext(PageContext pc)和setParent(Tag t),設(shè)置TagSupport類的兩個(gè)重要屬性值。

          如果遇到起始標(biāo)志,調(diào)用doStartTag(),此方法返回一個(gè)整數(shù)值,它有兩個(gè)可選值:Tag.SKIP_BODY(標(biāo)簽之間的內(nèi)容被忽略)和Tag.EVAL_BODY_INCLUDE(標(biāo)簽之間的內(nèi)容正常執(zhí)行)。
          例如:<prefix:mytag>test</prefix:mytag>,如果遇上Tag.SKIP_BODY,test字符串不會(huì)顯示在頁(yè)面上;如果遇上Tag.EVAL_BODY_INCLUDE,test字符串將會(huì)顯示在頁(yè)面上。

          如果遇到結(jié)束標(biāo)志,調(diào)用doEndTag(),此方法也返回一個(gè)整數(shù)值,它有兩個(gè)可選值:Tag.SKIP_PAGE(表示立刻停止執(zhí)行JSP頁(yè)面,網(wǎng)頁(yè)上未處理的靜態(tài)內(nèi)容和JSP程序均別忽略,任何已有的輸出內(nèi)容立刻返回到客戶端;)和Tag.EVAL_PAGE(表示按正常流程繼續(xù)執(zhí)行JSP頁(yè)面)。

          如果自定義標(biāo)簽包含自定義的屬性,例如:<prefix:mytag attribute1="value1">,那么處理類中應(yīng)該將這個(gè)屬性做為成員變量,并提供一組get和set方法:
          private int attribute1;
          public void setAttribute1(int value){
           this.attriubte1 = value;
          }
          public int getAttribute1(){
           return attribute1;
          }

          下面是一個(gè)用來(lái)驗(yàn)證用戶登陸的標(biāo)簽處理類例子:

          public class ValidateLoginTag extends TagSupport{
              
          private String name;
              
          private String password;
              
          private Log log = LogFactory.getLog(ValidateLoginTag.class);

              
          public int doEndTag() throws JspException{

                 
          if(name.equals("pepsixp"&& password.equals("888888")){
                       
          return(EVAL_PAGE);
                    }

                  
          return (SKIP_PAGE);
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public String getPassword() {
                  
          return password;
              }


              
          public void setPassword(String password) {
                  
          this.password = password;
              }

          }

          2.創(chuàng)建TLD-Tag Library Descriptor(標(biāo)簽庫(kù)描述文件)
          TLD文件中元素可以分為三類:<tablib>、<tag>、<attribute>
          <tablib>-設(shè)定標(biāo)簽庫(kù)的相關(guān)信息,包含的子元素有tlibversion、jspversion、shortname、uri、info、tag。
          <tag>-用來(lái)定義一個(gè)標(biāo)簽,包含的子元素有name、tagcalss、bodycontent、info、attribute。
          bodycontent的說(shuō)明:有三個(gè)可選值empty、JSP、tagdependent,empty表示標(biāo)簽中沒(méi)有body,JSP表示body中可以加入JSP程序代碼,tagdependent表示body的內(nèi)容有標(biāo)簽進(jìn)行處理。
          <attribute>-用來(lái)定義標(biāo)簽的屬性,包含的子元素有name、required、rtexprvalue。
          rtexprvalue的說(shuō)明:表示是否可以使用<%=...%>類型的表達(dá)式,
          例如:<prefix:mytaglib attribute1="<%=name%>">
          下面是一個(gè)簡(jiǎn)單的TLD文件:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

          <taglib>
              
          <tlibversion>1.2</tlibversion>
              
          <jspversion>1.1</jspversion>
              
          <shortname>MY Tag Library</shortname>
              
          <uri>http://www.aygfsteel.com/pepsixp/</uri>
              
          <info></info>
              
          <tag>
                  
          <name>ifLogin</name>
                  
          <tagclass>com.akazam.struts.taglib.ValidateLoginTag</tagclass>
                  
          <bodycontent>empty</bodycontent>
                  
          <info></info>
                  
          <attribute>
                      
          <name>name</name>
                      
          <required>true</required>
                      
          <rtexprvalue>true</rtexprvalue>
                  
          </attribute>
                  
          <attribute>
                      
          <name>password</name>
                      
          <required>true</required>
                      
          <rtexprvalue>true</rtexprvalue>
                  
          </attribute>
              
          </tag>
          </taglib>

          實(shí)際中的使用:
          <%@ taglib uri="/tags/test" prefix="test" %>
          <test:ifLogin name="pepsixp" password="888888"/>

          3.在web應(yīng)用中使用標(biāo)簽
          先要在web.xml文件加入聲明引用標(biāo)簽所在的標(biāo)簽:

          <taglib>
                  
          <taglib-uri>/tags/test</taglib-uri>
                  
          <taglib-location>/WEB-INF/test.tld</taglib-location>
          </taglib>


          參考:《Tomcat與JavaWeb開(kāi)發(fā)技術(shù)詳解》

          posted on 2005-02-18 22:41 阿姆斯壯 閱讀(1219) 評(píng)論(0)  編輯  收藏 所屬分類: 基礎(chǔ)很重要
          主站蜘蛛池模板: 醴陵市| 磐石市| 内黄县| 静宁县| 黑水县| 冀州市| 甘孜县| 盐池县| 青冈县| 岳西县| 丰都县| 那曲县| 米泉市| 成都市| 济源市| 张家界市| 柘城县| 威海市| 稷山县| 察隅县| 沂源县| 辽宁省| 新平| 丹江口市| 连江县| 达日县| 宜阳县| 轮台县| 铁力市| 同德县| 湖口县| 邻水| 乌海市| 自治县| 股票| 南汇区| 扬中市| 台山市| 临桂县| 怀化市| 渑池县|