Tom小貓,讓我看清你的五臟六腑(三)

Servlet過濾器
在Java Servlet2.3中定義,能夠對Servlet容器的請求和響應對象進行檢查和修改。所有的過濾器類都必須實現javax.servlet.Filter接口,其中有三個需要實現的方法
init(FilterConfig)-一個初始化方法,Servlet容器創建過濾器類後將調用這個方法,在此方法中可以讀取web.xml文件中的Servlet過濾器的初始化參數。
doFilter(ServletRequest,ServletResponse,FilterChain)-實際的過濾操作,FilterChain參數用於訪問後面的過濾器。
destroy()-用來釋放某些Servlet過濾器佔用的資源。

下面是一個解決中文亂碼問題很有用的一個過濾器:

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 {}
}

發佈Servlet過濾器-在web.xml在文件中加入<filter>元素和<filter-mapping>元素

下面的例子中Servlet過濾器會過濾所有的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過濾器
多個Servlet過濾器可以協同工作,Servlet容器將根據它們在web.xml中定義的先後順序,依次調用它們的doFilter()方法。
工作流程如下:
 Code1; // 表示調用chain.doFilter()前面的代碼
 chain.doFilter();  // 表示調用下一個過濾器的doFilter()方法
 Code2; // 表示調用chain.doFilter()後面的代碼

自定義JSP標籤庫
此技術在JSP 1.1版本中才出現,用來重用某些複雜的邏輯運算和事務,或定義JSP王爺的輸出內容和格式。製作一個完整的自定義標籤程序,包含3個步驟:

1. 創建標籤的處理類
此類必須擴展javax.servlet.jsp.TagSupport類或者javax.servlet.jsp.BodyTagSupport類。
以TagSupport類爲例,先了解一下這個類的主要方法:
doStartTag()-JSP容器遇到自定義標籤的起始標誌時調用該方法;
doEndTag()-JSP容器遇到自定義標籤的結束標誌時調用該方法;
setValue(String k,Object o)-在標籤處理類中設置key/value;
getValue(String k)-在標籤處理類中根據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(),此方法返回一個整數值,它有兩個可選值:Tag.SKIP_BODY(標籤之間的內容被忽略)和Tag.EVAL_BODY_INCLUDE(標籤之間的內容正常執行)。
例如:<prefix:mytag>test</prefix:mytag>,如果遇上Tag.SKIP_BODY,test字符串不會顯示在頁面上;如果遇上Tag.EVAL_BODY_INCLUDE,test字符串將會顯示在頁面上。

如果遇到結束標誌,調用doEndTag(),此方法也返回一個整數值,它有兩個可選值:Tag.SKIP_PAGE(表示立刻停止執行JSP頁面,網頁上未處理的靜態內容和JSP程序均別忽略,任何已有的輸出內容立刻返回到客戶端;)和Tag.EVAL_PAGE(表示按正常流程繼續執行JSP頁面)。

如果自定義標籤包含自定義的屬性,例如:<prefix:mytag attribute1="value1">,那麼處理類中應該將這個屬性做爲成員變量,並提供一組get和set方法:
private int attribute1;
public void setAttribute1(int value){
 this.attriubte1 = value;
}
public int getAttribute1(){
 return attribute1;
}

下面是一個用來驗證用戶登陸的標籤處理類例子:

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.創建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文件:

<?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.blogjava.net/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>

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

3.在web應用中使用標籤
先要在web.xml文件加入聲明引用標籤所在的標籤:

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章