自定義標籤可以大大方便我們的頁面控制元件編寫,並且可以實現很多統一的管理。
0、首先需要引入支援自定義標籤的jar包,有兩種方式,
一個是直接在maven裡面引入依賴:
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> </dependency>
另一個是直接用你Tomcat自帶的jsp-api
兩種方式取其中一種即可。
1、通過tld檔案,自定義方法標籤
tld的這種用法,讓我們可以在jsp裡直接使用類中定義的方法
引入方式示例,直接在jsp上引入tld標籤檔案:
<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %>
寫法示例(檔名fns.tld,存放位置在上面的uri中有定義):
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>JSTL 1.1 functions library</description> <display-name>JSTL functions sys</display-name> <tlib-version>1.1</tlib-version> <short-name>fns</short-name> <uri>http://java.sun.com/jsp/jstl/functionss</uri> <!-- DictUtils --> <function> <description>獲取字典物件列表</description> <name>getDictList</name> <function-class>com.sdyy.base.sys.utils.DictUtils</function-class> <function-signature>java.util.List getDictList(java.lang.String)</function-signature> <example>${fns:getDictList(typeCode)}</example> </function> <function> <description>獲取字典物件列表</description> <name>getDictListJson</name> <function-class>com.sdyy.base.sys.utils.DictUtils</function-class> <function-signature>java.lang.String getDictListJson(java.lang.String)</function-signature> <example>${fns:getDictListJson(typeCode)}</example> </function> <function> <description>物件變json</description> <name>toJSONString</name> <function-class>com.alibaba.fastjson.JSON</function-class> <function-signature>java.lang.String toJSONString(java.lang.Object)</function-signature> </function> </taglib>
function-class就是該方法的實體所在類路徑,
function-signature就是該方法的方法名,值得一提的是,這個方法必須是個static方法。
example就是使用方式寫法示例
2、通過tag檔案自定義控制元件標籤(感謝評論區一樓指正)
此類標籤,讓我們可以在jsp裡,通過傳入一些引數,動態的生成jsp程式碼
引入方式示例:
<%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %>
注意,這裡引入的是一個路徑
如此 tags目錄下的sys目錄下的所有tag(感謝評論區一樓指正)都會自動被載入,標籤tag寫法示例(寫法其實類似jsp):
<%@ tag language="java" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %> <%@ attribute name="typeCode" type="java.lang.String" required="true" description="字典code"%> <%@ attribute name="defaultValue" type="java.lang.String" description="預設選中"%> <%@ attribute name="style" type="java.lang.String" description="預設選中"%> <%@ attribute name="cls" type="java.lang.String" description="預設選中"%> <%@ attribute name="name" type="java.lang.String" description="預設選中"%> <select style="${style}" class="${cls}" name="${name}" id="${name}" > <option value="" >請選擇... </option> <c:if test="${not empty typeCode}"> <c:forEach items="${fns:getDictList(typeCode)}" var='dict'> <option value='${dict.VALUE}' ${defaultValue==dict.VALUE?'selected':''}>${dict.TEXT}</option> </c:forEach> </c:if> </select>
這裡我引入了兩個taglib,是為了在該檔案中使用它們,attribute則相當於引數,定義這些引數才能在使用的時候動態傳入,注意還有一些關鍵字,比如這裡的“cls”,就是因為“class”是關鍵字
如此,tag名就是標籤名,例如這個tag叫 select.tag(感謝評論區一樓指正),那麼它的用法就是
<sys:select cls="formselect" name="MODULE_TYPE" typeCode="HOME_MODULE_TYPE" defaultValue="${record.MODULE_TYPE }" />
其中 “sys:select” 中 【sys】是我們在上面【引入方式示例】中定義的prefix,select和【select.tag】的紅字部分是對應的
3、通過 tld檔案 自定義判斷標籤、控制元件標籤(偷個懶,寫一塊了)
引入方式和1相同,寫法示例如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>bgt</short-name> <!-- backGroundTag --> <uri>http://www.sdyy.tag</uri> <tag> <name>hasUrlPerm</name> <tag-class>com.sdyy.common.tags.HasUrlPermissionTag</tag-class> <attribute> <name>link</name> <required>false</required> <rtexprvalue>true</rtexprvalue><!-- 是否支援惡劣表示式 --> <type>java.lang.String</type> <description>示例:acApplication/forMain.do</description> </attribute> </tag> </taglib>
A、【判斷標籤】HasUrlPermissionTag標籤是一個判斷標籤,通過該標籤來決定標籤包裹的內容是否顯示,寫法如下:
package com.sdyy.common.tags; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; import com.sdyy.common.spring.interceptor.PermissionInterceptor; /** * * @ClassName: HasUrlPermissionTag * @Description: 根據url判斷許可權標籤 * @author: liuyx * @date: 2015年12月21日上午11:15:32 */ public class HasUrlPermissionTag extends BodyTagSupport { private String link;// acApplication/forMain.do @Override public int doStartTag() throws JspException { // 在標籤開始處出發該方法 HttpServletRequest request=(HttpServletRequest) pageContext.getRequest(); //獲取session中存放的許可權 //判斷是否有許可權訪問 if (PermissionInterceptor.isOperCanAccess(request, link)) { //允許訪問標籤body return BodyTagSupport.EVAL_BODY_INCLUDE;// 返回此則執行標籤body中內容,SKIP_BODY則不執行 } else { return BodyTagSupport.SKIP_BODY; } } @Override public int doEndTag() throws JspException { return BodyTagSupport.EVAL_BODY_INCLUDE; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } }
在JSP中的使用方式:
<bgt:hasUrlPerm link="abc.do"> <div>tttttttttttttttttest</div> </bgt:hasUrlPerm>
B、【控制元件標籤】,這種標籤直接返回一個控制元件,不過是通過java程式碼生成的控制元件內容,寫法示例:
package com.sdyy.common.tags; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; /*import com.sdyy.base.ac.ac_permission.model.AcPermission;*/ public class ButtonUrlTag extends BodyTagSupport { private static final long serialVersionUID = -7811902545513255473L; //標籤屬性使用者名稱 private String user = null; //標籤屬性操作url private String url = null; //標籤屬性 js方法 private String jsmethod = null; //標籤屬性image 按鈕圖片 private String image = null; //標籤屬性 alt 提示 private String alt = null; //標籤屬性操作value 按鈕文字 private String value = null; /* 標籤初始方法 */ public int doStartTag() throws JspTagException{ return super.EVAL_BODY_INCLUDE; } /* 標籤結束方法 */ public int doEndTag() throws JspTagException{ Boolean b = false; List list = new ArrayList(); /*AcPermission p = new AcPermission();*/ /*JDBCHibernate jdbca = new JDBCHibernate();*/ try { /*list = jdbca.getHaveURLByUsernameList(user);*/ } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } for(int i = 0;i < list.size(); i++){ /*p = (AcPermission) list.get(i);*/ if(1==1) {//p.getUrl().trim().equals(url.trim())){ b = true; //如果jsmethod屬性不為null 則把超連結href改為呼叫js if(jsmethod!=null){ url = jsmethod; } } } JspWriter out = pageContext.getOut(); if(b){ try { //有許可權 顯示操作按鈕 out.println("<a href='" +url+ "' class='regular'><img src='" + image + "' alt='" + alt +"' />" + value + "</a>"); } catch (IOException e) { e.printStackTrace(); } } return super.SKIP_BODY; } /* 釋放資源 */ public void release(){ super.release(); } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getImage() { return image; } public void setImage(String image) { this.image = image; } public String getAlt() { return alt; } public void setAlt(String alt) { this.alt = alt; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getJsmethod() { return jsmethod; } public void setJsmethod(String jsmethod) { this.jsmethod = jsmethod; } }
綜上 標籤一般都是通過tld和tag定義的,本文只是對其中幾種基礎用法羅列,希望對大家有所幫助。