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="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容器解释。例如:<t:myTag>heihei</t:myTag>。empty:空的标签体内容,即起始标记和结束标记之间没有内容。例如:<t:myTag message="this is my tld"/>。scriptless:支持静态 HTML 元素,表达式语言等,但不支持JSP语法。JSP:支持所有的JSP语法
description 描述信息
fragment 如果声明了该属性,属性值将被视为一个 JspFragment
  • 自定义标签的attribute
属性 描述
name 定义属性的名称。每个标签的是属性名称必须是唯一的
required 指定属性是否是必须的或者可选的,如果设置为false为可选
rtexprvalue 声明在运行表达式时,标签属性是否有效
type 定义该属性的Java类类型 。默认指定为 String
description 描述信息
fragment 如果声明了该属性,属性值将被视为一个 JspFragment

*自定义标签函数的function

属性 描述
description 描述信息
name 唯一的函数名
function-class 包含静态方法的java类的全路径
function-signature 静态方法的声明
example 使用自定义函数的示例
原文地址:https://www.cnblogs.com/yeyun/p/6384140.html