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文件需要tldtag 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