Spring自定义tag标签及使用

tag文件和jsp很相似,也有不同,tag文件只是以tag为后缀名的文本文件。除了jsp页面指令外,其他jsp元素都可以出现在tag文件中。jsp的指令有include,taglib和page,但tag中有include和taglib,没有page,此外还提供了tag,tag替代了jsp中的page,并提供了tld文件中<tag>的配置功能。

  • 页面引用格式:
    <%@ taglib prefix="ui" tagdir="/WEB-INF/tags" %>
    tagdir:用于指定tag文件目录,当页面使用<ui:xxxx>进,会查找该目录下对应的xxxx.tag文件。
    prefix:指定使用时标签前缀

  • 使用格式
    <ui:xxxx></ui:xxxx>
    例子:<ui:tagDemo><ui:tagDemo>

  • 定义属性格式
    tag文件添加属性:当tag文件需要引用页面传入参数时,就需要在tag文件中填加属性
    <%@ attribute name="attributename" required="true" type="com.myapp.util.ListPage" %>
    name(必须):属性名
    required(必须):指定是否必须传
    type(可选):指定属性类型。
    tag文件获得传入参数值
    String attributename=(String) pageContext.getAttribute("attributename");
    或者在jsp元素中使用${pageScope.attributename}
    也可使用<jsp:doBody/> 获取引用页面标签内的body内容。

  • tag文件存放位置
    1.WEB-INF/tags
    2.WEB-INF/tags的子目录
    3.WEB-INF/lib中jar包的META-INF/tags
    4.WEB-INF/lib中jar包的META-INF/tags下的子目录
    5.jar包中的tag文件需要tld

  • tag directive有下面属性,均为可选:

属性描述
pageEncoding同page中的含义,定义tag输出的编码
isELIgnored同page中的含义,要求container不计算EL表达式,缺省为false
language同page中的含义,目前只支持java
deferredSyntaxAllowedAsLiteral同page中的含义,要求container忽略和不对延迟EL语法进行解析
trimDirectiveWhitespaces同page中的含义,将directives周围的空格trim掉
import同page中的含义,可以引入java类,多个通过逗号分隔
description、display-name、small-icon、large-icon通tld中的定义,略
body-content是tld种的body-content的替代,但略有差异,有效值为empty, scriptless和tagdependent,没有jsp,即在tag文件中不允许使用scriptlets和expressions。缺省值为scriptless
dynamic-attributes同tld,表明是否允许动态属性,缺省为空,即不支持动态属性。如果需要设置,则设置为你需要获得所有动态变量的EL名字,这个EL是Map

代码

  • 目录结构
    这里写图片描述

  • TagController.java

package com.xyc.tagdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

/**
 * Created by xyc on 2017/8/7 0007.
 */
@Controller
@RequestMapping("/tag")
public class TagController {
    @GetMapping("/test")
    public String test(Map<String, Object> model) {
        return "test";
    }
}
  • tagDemo.tag
<%--
body-content:
    tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释
    jsp:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作
    empty:空标记,即起始标记和结束标记之间没有内容
    scriptless:接受文本、EL和JSP动作
dynamic-attributes:支持动态属性(即EL),获取的参数名字为dynamicAttributes
trimDirectiveWhitespaces:去除空行
--%>
<%@ tag pageEncoding="UTF-8" body-content="scriptless" dynamic-attributes="dynamicAttributes" trimDirectiveWhitespaces="true" %>

<%--
name(必须):属性名
required(必须):指定是否必须传
rtexprvalue(可选):是否可以使用JSP表达式
type(可选):指定属性类型。
--%>
<%@ attribute name="htmlTitle" type="java.lang.String" rtexprvalue="true" required="true" description="网页的标题" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<!DOCTYPE html>

<!-- 这里演示了动态属性加到现有html标签的例子:当中的c:out提供两个功能:显示value之前加了空格,即确保每个属性之前存在空格;禁止escapeXML,由于这些html的属性要真实有效,因此参数名不能escapeXML -->
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <!-- 设置title,删除前后的空格trim -->
    <title><c:out value="${fn:trim(htmlTitle)}"/></title>
</head>

<!-- jsp:doBody 仅在tag文件中使用,告诉容器计算JSP中本tag的body内容,并显示出来。可以加上var varReader属性和scope属性,将输入放入变量而不是显示出来 -->
<body>
<jsp:doBody/>
</body>
</html>
  • test.jsp
<%--
  Created by IntelliJ IDEA.
  User: xyc
  Date: 2017/8/7 0007
  Time: 21:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="mt" tagdir="/WEB-INF/tags" %>

<mt:tagDemo htmlTitle="自定义tag标签">
    你好,我是自定义tag标签的内容!
</mt:tagDemo>
  • 测试

这里写图片描述

参考:http://zhangxing119.iteye.com/blog/1919548
参考:http://blog.csdn.net/flowingflying/article/details/58010078

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值