在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. 程式開發人員使用簡單的空白頁就可以進行開發,待頁面設計人員提交目標頁後,只需簡單的編輯即可完成替換
最終使頁面和代碼盡量分離。