JSP自定義標籤及函數的使用

JSP自定義標籤及函數

自定義標籤tags文件方式

  • 在WEB-INF/tags目錄下建立一個myTag.tag文件
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ attribute name="message" type="java.lang.String" required="true" description="消息"%>

<h2>Hello ${message}!</h2>
  • 在JSP文件中使用myTag標籤
<%@ page pageEncoding="UTF-8"%>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags"%>
<html>
<body>
    <tags:myTag message="this is my tag"></tags:myTag>
</body>
</html>
  • 輸出結果爲:Hello this is myTag!

自定義標籤TLD文件方式

  • 建立處理標籤的類,重寫doTag方法
package com.yeyun.web.taglib.tags;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class MyTagSupport extends SimpleTagSupport{
    
    private String message;
    
    public void doTag() throws JspException, IOException {
        JspWriter writer = getJspContext().getOut();
        writer.println("Hello " + message + "!");
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
  • 在WEB-INF/tlds目錄下建立一個myTld.tld文件(taglib description,標籤庫描述符)
<?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 tag library</description>
  <display-name>自定義標籤</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>t</short-name>
  <uri>/WEB-INF/tlds/myTld.tld</uri>

  <tag>
    <description>my自定義標籤</description>
    <name>myTag</name>
    <tag-class>com.yeyun.web.taglib.tags.MyTagSupport</tag-class>
    <body-content>empty</body-content>
    <attribute>
        <name>message</name>
        <required>true</required>
        <type>java.lang.String</type>
        <description>消息</description>
    </attribute>
  </tag>

</taglib>
  • JSP文件中使用myTag標籤(uri與TLD文件中的uri一致)
<%@ page pageEncoding="UTF-8"%>
<%@ taglib prefix="t" uri="/WEB-INF/tlds/myTld.tld"%>
<html>
<body>
    <t:myTag message="this is my tld"/>
</body>
</html>
  • 輸出結果爲:Hello this is my tld!

自定義標籤函數

  • 建立一個靜態方法
package com.yeyun.web.taglib.fns;

public class MyFunction {
    
    public static String getMessage(String message) {
        return "Hello " + message + "!";
    }
}
  • 在WEB-INF/tlds目錄下建立一個myFn.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>JSTL 1.1 functions library</description>
  <display-name>JSTL functions</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>fns</short-name>
  <uri>/WEB-INF/tlds/myFn.tld</uri>

  <function>
    <description>獲取信息</description>
    <name>getMessage</name>
    <function-class>com.yeyun.web.taglib.fns.MyFunction</function-class>
    <function-signature>java.lang.String getMessage(java.lang.String)</function-signature>
    <example>${fns:getMessage(message)}</example>  
  </function>

</taglib>
  • JSP文件中使用自定義函數
<%@ page pageEncoding="UTF-8"%>
<%@ taglib prefix="fns" uri="/WEB-INF/tlds/myFn.tld"%>
<html>
<body>
    ${fns:getMessage("this is my function!")}
</body>
</html>
  • 輸出結果爲:Hello this is my function!

總結

  • 在使用任何標籤庫以前,必須在每一個JSP文件的頭部先引入標籤庫,而後在使用
  • *.tld文件的格式參考jstl.jar下META-INF目錄下的fn.tld及c.tld
  • tag文件方式相似於freemarker的宏,能夠建立自定義頁面模板片斷,供其餘頁面複用。若是須要複用頁面代碼片斷,通常採用tag文件方式處理。涉及複雜的後臺取數據及處理,採用tld文件方式處理。
  • 自定義函數能夠直接獲取數據源,而不是經過常見的URL方式返回數據源。例如:
<form:select path="type"cssStyle="width:200px;height:32px">
  <form:options items="${fns:getEnumValues('com.olmysoft.system.enums.RoleTypeState')}" itemLabel="label" itemValue="value" htmlEscape="false"/>
</form:select>

常見的屬性

  • 自定義標籤的taglib
屬性 描述
tlib-version 標籤庫的版本號
short-name 標籤庫默認的助記名稱
uri 該標籤庫的 URI,至關於該標籤庫的惟一標識。JSP 頁面中使用標籤庫時就是根據該URI 屬性來定位標籤庫的
description 描述信息
display-name 顯示的名稱
  • 自定義標籤的tag
屬性 描述
description 描述信息
name 惟一的標籤名
tag-class 處理標籤類的全路徑,該類爲javax.serlvet.jsp.tagext.JspTag的子類
body-content 指定標籤體內容. tagdependent:標籤體內容直接被寫入BodyContent,由自定義標籤類來進行處理,而不被JSP容器解釋。例如: heihei 。empty:空的標籤體內容,即起始標記和結束標記之間沒有內容。例如: 。scriptless:支持靜態 HTML 元素,表達式語言等,但不支持JSP語法。JSP:支持全部的JSP語法
description 描述信息
fragment 若是聲明瞭該屬性,屬性值將被視爲一個 JspFragment
  • 自定義標籤的attribute
屬性 描述
name 定義屬性的名稱。每一個標籤的是屬性名稱必須是惟一的
required 指定屬性是不是必須的或者可選的,若是設置爲false爲可選
rtexprvalue 聲明在運行表達式時,標籤屬性是否有效
type 定義該屬性的Java類類型 。默認指定爲 String
description 描述信息
fragment 若是聲明瞭該屬性,屬性值將被視爲一個 JspFragment

*自定義標籤函數的functioncss

屬性 描述
description 描述信息
name 惟一的函數名
function-class 包含靜態方法的java類的全路徑
function-signature 靜態方法的聲明
example 使用自定義函數的示例
相關文章
相關標籤/搜索