<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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.tkk7.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 阿姆斯壯 閱讀(1213) 評(píng)論(0)  編輯  收藏 所屬分類: 基礎(chǔ)很重要
    主站蜘蛛池模板: 美美女高清毛片视频黄的一免费 | 免费无码一区二区三区蜜桃| 亚洲丝袜中文字幕| 久久精品国产亚洲AV不卡| 免费a级毛片高清视频不卡 | 亚洲视频在线一区二区三区| 亚洲免费视频一区二区三区| 热99re久久免费视精品频软件| **真实毛片免费观看| 国产精品永久免费| 粉色视频免费入口| 亚洲欧美熟妇综合久久久久 | 黄网站色在线视频免费观看| 嫩草在线视频www免费看| 日本黄页网址在线看免费不卡| 午夜在线a亚洲v天堂网2019| 久久精品国产亚洲AV无码偷窥 | 国产精品免费一区二区三区| 黄色网址大全免费| 国产精品亚洲专区一区| 亚洲kkk4444在线观看| 亚洲午夜一区二区电影院| 久久亚洲sm情趣捆绑调教| 久久久久久久久亚洲| 亚洲国产精品va在线播放| 亚洲乱码日产一区三区| 亚洲日韩人妻第一页| 免费国产不卡午夜福在线| 又大又粗又爽a级毛片免费看| 日本免费无遮挡吸乳视频电影| 女人张腿给男人桶视频免费版| 成年大片免费视频| 天天天欲色欲色WWW免费| 成人免费a级毛片无码网站入口| 又黄又爽又成人免费视频| 日本妇人成熟免费中文字幕| 国产日本一线在线观看免费 | 天堂亚洲国产中文在线| 亚洲色精品三区二区一区| 亚洲色成人网站WWW永久四虎| 亚洲欧美日韩中文字幕在线一区|