Jsp中自定義標籤使用方法

自定義標籤在功能上邏輯上與javaBean 類似,都封裝Java 代碼。自定義標籤是可重用的組件代碼,並且允許開發人員爲複雜的操作提供邏輯名稱;其實換句話說,taglib可以看成是對JSP標記的一種擴展,正如xml是對html的一種擴展一樣。

爲什麼要使用自定義標籤?

JSTL標籤庫只提供了簡單的輸出等功能,沒有實現任何的HTML代碼封裝,並且某些複雜類型轉換,或者邏輯處理的時候,JSTL標籤庫完成不了,需要自定義標籤!

一般情況,自定義tag標籤主要用於操作隱藏對象、處理html提交表單、訪問數據庫等操作。

自定義標籤語法中兩類標籤:自定義標籤與自定義函數。

自定義標籤與普通標籤庫中的標籤用法相同,自定義函數它可以讓我們在jsp用直接調用某個方法,根據自定義的方法返回指定的值,兼容jstl標籤,省去了在jsp中直接使用<%!%>來定義方法體再調用的繁瑣。

編寫自定義標籤的步驟:

1.編寫一個實現Tag接口的Java類【標籤處理器類】;

2.在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在tld文件中對標籤處理類(實現Tag接口的Java類)進行描述;

自定義標籤TLD文件配置屬性說明:

taglib子元素說明:

tlib-version:標籤庫的版本
jsp-version:這個標籤庫要求的JSP規範版本
short-name:JSP頁面編寫工具可以用來創建助記名的可選名字
uri:唯一標識該標籤庫的的URI
display-name:將由工具顯示的可選名
description:可選的標籤特定信息
listener:一個tag庫可能定義一些類做爲它的事件偵聽類,這些類在TLD中被稱爲listener 元素,jsp服務器將會實例化這些偵聽類,並且註冊它們。Listener元素中有一個叫listener-class的子元素,這個元素的值必須是該偵聽類的完整類名。

tag子元素說明:

name:獨一無二的元素名
tag-class:Tag標籤對應的tag處理類
tei-class:javax.servlet.jsp.tagext.TagExtraInfo的子類,用於表達腳本變量(可選)
body-content:Tag標籤body的類型
display-name:被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)
small-icon:被可視化工具(諸如Jbuilder)用來顯示的小圖標(可選)
large-icon:被可視化工具(諸如Jbuilder)用來顯示的大圖標(可選)
description:此tag標籤的描述
variable:提供腳本變量的信息(同tei-class(可選)
attribute:Tag標籤的屬性名

attribute子元素說明:

name:屬性名
required:該屬性名可不可省略
rtextprvalue: 表示的是屬性是否接受scriptlet表達式的計算結果,默認情況下爲false,即只能接受靜態值
type:標籤處理類中相關屬性的類型

自定義標籤實例:

編寫一個實現Tag接口的Java類:

通常我們自定義類繼承TagSupport、BodyTagSupport,重寫doStartTag(),doAfterBody()和doEndTag()方法,在對應方法中實現我們自己的邏輯:

public class SelectButton extends BodyTagSupport {private static final long serialVersionUID = 1L;
  private String flag;
  private JspWriter out;public void init() {
        out = pageContext.getOut();
    }@Override
    public int doStartTag() throws JspException {
        init();
        return super.EVAL_BODY_INCLUDE;
    }
    //處理方法
    @Override
    public int doEndTag() throws JspException {
        try {
            StringBuffer sb=new StringBuffer();
            sb.append("<select>");
            if(flag=="0") {
              sb.append("<option value =\"shanxi\">山西</option>");
                sb.append("<option value =\"beijing\">北京</option>"); 
                sb.append("<option value=\"shanghai\">上海</option>");
                sb.append("</select>");  
            }else {
              sb.append("<option value =\"shanxi\">山西1</option>");
              sb.append("<option value =\"beijing\">北京1</option>"); 
              sb.append("<option value=\"shanghai\">上海1</option>");
              sb.append("</select>");
        }
            out.print(sb.toString());
        }catch (Exception e) {
      // TODO: handle exception
    }
        return super.EVAL_PAGE;
    }public String getFlag() {
    return flag;
  }public void setFlag(String flag) {
    this.flag = flag;
  }
}

爲了簡化標籤開發的複雜度,在JSP 2.0中定義了一個更爲簡單、便於編寫和調用的SimpleTag接口來實現標籤的功能。一般地,我們做開發都是繼承SimpleTagSupport類(該類實現了SimpleTag)來編寫自定義標籤。

實現了SimpeTag接口的標籤稱之爲簡單標籤:

public class SimpSelectButton extends SimpleTagSupport {private String flag;@Override
  public void doTag() throws JspException, IOException {
    StringBuffer sb = new StringBuffer();
​
    sb.append("<select>");
    if (flag == "0") {
      sb.append("<option value =\"shanxi\"><--簡單的標籤實現方式--></option>");
      sb.append("<option value =\"shanxi\">山西</option>");
      sb.append("<option value =\"beijing\">北京</option>");
      sb.append("<option value=\"shanghai\">上海</option>");
      sb.append("</select>");
    } else {
      sb.append("<option value =\"shanxi\">山西1</option>");
      sb.append("<option value =\"beijing\">北京1</option>");
      sb.append("<option value=\"shanghai\">上海1</option>");
      sb.append("</select>");
    }this.getJspContext().getOut().write(sb.toString());
  }public String getFlag() {
    return flag;
  }public void setFlag(String flag) {
    this.flag = flag;
  }
}

在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在tld文件中對標籤處理類(實現Tag接口的Java類)進行描述

<?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>自定義標籤庫</description>
  <display-name>author functions</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>author</short-name>
  <uri>/author</uri>
  <tag>
    <description><![CDATA[Render a select element]]></description>
    <name>select</name>
    <tag-class>com.qiyun.SelectButton</tag-class> <!-- 注意這裏是自己定義的標籤類(處理你自己的標籤內容)-->
    <body-content>JSP</body-content>
    <attribute>
      <description><![CDATA[The css class to use for element]]></description>
      <name>flag</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>
    </tag>
    
    <tag>
    <description><![CDATA[Render a select element]]></description>
    <name>simpselect</name>
    <tag-class>com.qiyun.SimpSelectButton</tag-class> <!-- 注意這裏是自己定義的標籤類(處理你自己的標籤內容)-->
    <body-content>empty</body-content>
    
    <attribute>
      <description><![CDATA[The css class to use for element]]></description>
      <name>flag</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
      
    </attribute>
    </tag>
</taglib>

自定義標籤的使用:

如果要使用tag標籤,則應用JSP的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標籤之前聲明)

<%@taglib prefix="author" uri="/author" %>

uri屬性定義了唯一的標籤庫描述(以下簡稱TLD),它可以是直接是tld文件名或一個獨一無二的名字。

prefix是用來區別其它TLD中和本TLD中有重名的tag的一種手段。

TLD必須以.tld作爲擴展名,並且存放在當前應用的WEB-INF目錄或其子目錄下。你可以通過它的文件名直接引用它,也可以通過別的方式間接地引用它。

引用自定義標籤的簡單使用:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="author" uri="/author" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>練習自定義標籤TLD的用法</title>
</head>
<body>
<div><author:select flag="0"></author:select>     </div>
<div><author:simpselect flag="0"></author:simpselect>     </div></body>
</html>

自定義函數:

自定義函數也是自定義標籤的一種,只是更加簡單。

編寫自定義函數的步驟:

1.編寫一個實現function接口的Java類【標籤處理器類】;

2.在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在tld文件中對標籤處理類(實現function接口的Java類)進行描述;

自定義函數TLD文件配置屬性說明:

taglib子元素說明:

tlib-version:標籤庫的版本
jsp-version:這個標籤庫要求的JSP規範版本
short-name:JSP頁面編寫工具可以用來創建助記名的可選名字
uri:唯一標識該標籤庫的的URI
display-name:將由工具顯示的可選名
description:可選的標籤特定信息
listener:一個tag庫可能定義一些類做爲它的事件偵聽類,這些類在TLD中被稱爲listener 元素,jsp服務器將會實例化這些偵聽類,並且註冊它們。Listener元素中有一個叫listener-class的子元素,這個元素的值必須是該偵聽類的完整類名。

function子元素說明:

description:可選的標籤特定信息
name:獨一無二的元素名
function-class:定義函數處理類
function-signature:定義函數的對應方法
實例:執行標籤具體的方法的類

實例:編寫執行標籤具體的方法的類:

public class Tools {
  
  /**
   * 獲取當前用戶權限
   */
  public static String getUserAuthor(String menuId) {
    
    return menuId;
  }    
}

在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在tld文件中對自定義函數處理類進行描述:

<?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>自定義標籤庫</description>
  <display-name>author functions</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>author</short-name>
  <uri>/author</uri>
  <function>
    <description>取得用戶權限</description>
    <name>author</name>
    <function-class>com.qiyun.Tools</function-class>
    <function-signature>java.lang.String getUserAuthor(java.lang.String)</function-signature>
  </function></taglib>

自定義函數的使用:

如果要使用自定義函數,與自定義標籤一樣,則應用JSP的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標籤之前聲明)

<%@taglib prefix="author" uri="/author" %>

uri屬性定義了唯一的標籤庫描述(以下簡稱TLD),它可以是直接是tld文件名或一個獨一無二的名字。

prefix是用來區別其它TLD中和本TLD中有重名的tag的一種手段。

TLD必須以.tld作爲擴展名,並且存放在當前應用的WEB-INF目錄或其子目錄下。你可以通過它的文件名直接引用它,也可以通過別的方式間接地引用它。

引用自定義標籤的簡單使用:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="author" uri="/author" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>練習自定義標籤TLD的用法</title>
</head>
<body>
<button class="${author:author('button1')}">${author:author('button')}</button>
<h1 class="hidden">這是一個隱藏標題</h1>
<h1>這是一個標題</h1>
</body>
</html>
<style>
button.button{
  display: none;
}
h1.hidden {display:none;}
</style>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章