• 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 使用自定义函数的示例
  • 相关阅读:
    python3调用js的库之execjs
    字体替换 re.sub
    asyncio和aiohttp
    微信公众号数据抓取
    celery
    Airtest 的连接安卓模拟器
    Scrapy同时启动多个爬虫
    随机IP代理插件Scrapy-Proxies
    Charles和mitmproxy代理设置
    win下删除EFI分区
  • 原文地址:https://www.cnblogs.com/yeyun/p/6384140.html
Copyright © 2020-2023  润新知