jsp的三種自定義標籤 寫法示例

劍握在手發表於2015-12-21

自定義標籤可以大大方便我們的頁面控制元件編寫,並且可以實現很多統一的管理。

 

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定義的,本文只是對其中幾種基礎用法羅列,希望對大家有所幫助。

相關文章