Spring自定义tag标签及使用

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

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

  • 使用格式

    例子:

  • 定义属性格式
    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}
    也可使用 获取引用页面标签内的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

代码

  • 目录结构
    Spring自定义tag标签及使用_第1张图片

  • 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 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" %>




<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <title><c:out value="${fn:trim(htmlTitle)}"/>title>
head>


<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>
  • 测试

Spring自定义tag标签及使用_第2张图片

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

你可能感兴趣的:(tag,自定义标签)