建立JSP自訂標籤 __JSP

來源:互聯網
上載者:User

在JSP編程中,Struts一般用來處理form和商務邏輯,Struts中使用了很多自訂標籤,如html、bean等,但很多時候我們還是需要使用 "<% java code %>" 這樣的語句來操作一些輸出。為了減少這種代碼,可以建立自訂標籤。

一個tag就是一個普通的java類,它唯一特別之處是它必須繼承TagSupport或者BodyTagSupport類。這兩個類提供了一些方法,負責jsp頁面和你編寫的類之間的互動,例如輸入,輸出。而這兩個類是由jsp容器提供的,無須開發人員自己實現。換句話說,你只需把實現了商務邏輯的類繼承TagSupport或者BodyTagSupport,再做一些特別的工作,你的類就是一個Tag。並且它自己負責和jsp頁面的互動,不用你多操心。

下面介紹如何建立一個自訂標籤。
一.編寫java類繼承TagSupport或TagSupport
1) 提供屬性的set方法,
此後這個屬性就可以在jsp版面設定。以jstl標籤為例 <c:out value=""/>,這個value就是jsp資料到tag之間的入口。所以tag裡面必須有一個setValue方法,具體的屬性可以不叫value。例如setValue(String data){this.data = data;}
這個“value”的名稱是在tld裡定義的。取什麼名字都可以,只需tag裡提供相應的set方法即可。
2)處理 doStartTag 或 doEndTag
這兩個方法是 TagSupport提供的。 還是以<c:out value=""/>為例,當jsp解析這個標籤的時候,在“<”處觸發 doStartTag 事件,在“>”時觸發 doEndTag 事件。通常在 doStartTag 裡進行邏輯操作,在 doEndTag 裡控制輸出。
下面是一個簡單的例子
代碼 package com.test.tag;    import java.io.IOException;    import javax.servlet.jsp.JspTagException;    import javax.servlet.jsp.tagext.BodyContent;    import javax.servlet.jsp.tagext.BodyTagSupport;    /**   * PermissionBodyTag 根據是否有許可權顯示body內容    */   public class PermissionBodyTag extends BodyTagSupport {        boolean permission;        public boolean isPermission() {            return permission;        }        public void setPermission(boolean permission) {            this.permission = permission;        }        public int doStartTag() throws JspTagException {            if (permission) {                return EVAL_BODY_INCLUDE;            } else {                return SKIP_BODY;            }        }        public int doEndTag() throws JspTagException {            System.out.println("doEndTag");            try {                if (bodyContent != null) {                    bodyContent.writeOut(bodyContent.getEnclosingWriter());                }else{                }            } catch (IOException e) {                throw new JspTagException("IO ERROR:" + e.getMessage());            }            return EVAL_PAGE;        }        public void doInitBody() throws JspTagException {        }        public void setBodyContent(BodyContent bodyContent) {            this.bodyContent = bodyContent;        }    }  

 

 通常你會發現自己絕大多數活動都集中在 doStartTag 或 doEndTag 方法裡。確實如此,熟悉一些介面和類之後,寫taglib很容易。正如《jsp設計》的作者所言:裡面的邏輯稍微有點複雜,但畢竟沒有火箭上天那麼難。

二.編寫tld檔案
標籤檔案其實只是一個XML格式的說明檔案,內容也很簡單。
建立tagTest-html.tld檔案在這個標籤檔案中,我們將我們建立的標籤取名 tagTest,並聲明了類型和參數(permission)。將該檔案儲存在 /WEB-INF 下面。
代碼  <?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>tagTest</shortname>       <uri>/taiji</uri>       <tag>           <name>permission</name>           <tagclass>com.test.tag.PermissionBodyTag</tagclass>           <bodycontent>JSP</bodycontent>           <attribute>               <name>permission</name>               <required>true</required>               <rtexprvalue>true</rtexprvalue>           </attribute>       </tag>   </taglib>      

三.加到web.xml中
當然,我們還需要將我們自訂的標籤添加到 web.xml 中,否則還是無法使用。
代碼 <taglib>       <taglib-uri>/tagTest </taglib-uri>       <taglib-location>/WEB-INF/tagTest-html.tld</taglib-location>     </taglib>  

 

四.在jsp頁面匯入tld
代碼 <%@ taglib uri="/tagTest " prefix="tagTest "%>  

 

這樣,你的jsp頁面就可以使用自己的tag了。用這個標籤就可以根據傳人的boolean值來決定標籤包的jsp內容是否輸出
代碼 <tagTest:permission permission="<% java code%>">   //需有許可權輸出,使用者才能看到的內容    </tagTest:permission>  

 

優點
1. 修改後的JSP檔案不再或盡量少包含java代碼,. html代碼變得非常乾淨,頁面設計人員修改分頁檔時,不用擔心誤刪除程式碼了。
2. 程式開發人員使用簡單的空白頁就可以進行開發,待頁面設計人員提交目標頁後,只需簡單的編輯即可完成替換

最終使頁面和代碼盡量分離。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.