JSP 2.0 引入 Tag file ,tag file 以 tag 或 tagx 为后缀,它们可以包含其他资源文件;一个被其他文件包含的 tag file 应该以 tagf 为后缀。

如同JSP页面被翻译成 Servlet 一样,JSP容器提供多种方式将 tag file 编译成 Java 的标签处理类。例如 Tomcat 将 tag file 翻译成继承与 javax.servlet.jsp.tagext.Simpletag 接口的标签处理类。

一个 Tag file 和 JSP 页面一样,拥有指令、脚本、EL表达式、动作元素、自定义的标签。

Tag file 从两方面简化了自定义标签的开发:

1)tag file 无需提前翻译,直到第一次被调用才会编译
2)不再需要标签库描述文件,使用 tag file 的方式,tag file 的文件名和标签名称(不包含后缀)相同。

tag file必须放在应用路径的 WEB-INF/tags 目录下才能生效。

tag file 中也有一些隐藏对象,通过脚本或者EL表达式可以访问这些隐藏对象。

request     // javax.sevlet.http.HttpServletRequest
response // javax.servlet.http.HttpServletResponse
out // javax.servlet.jsp.JspWriter
contig // javax.servlet.ServletContig
session // javax.servlet.http.HttpSession
application // javax.servlet.ServletContext
jspContext // javax.servlet.jsp.JspContext

使用 tag file 的例子

在应用项目的 WEB-INF 下新建 tags 目录,然后再 tags 目录下新建 tag file

<%-- firstTag.tag --%>
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ tag import="java.util.Date" import="java.text.DateFormat" %> <%
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
Date now = new Date(System.currentTimeMillis());
out.println(dateFormat.format(now));
%>

在 JSP 页面中使用 tag file

<%-- firstTagtest.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="easy" %> <!-- 使用tagdir属性 --> <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test tag file</title>
</head>
<body>
Today is <easy:firstTag /> <!-- 标签名和tag file名相同 -->
</body>
</html>

测试

Tag file 中的指令

和 JSP 页面一样,tag file 可以使用指令来指挥 JSP容器如何编译这个 tag file,tag file 的指令语法和 JSP是一样的

<%@ 指令名称 属性=“属性值” 属性=“属性值” %>
tag <!-- 与JSP中的page指令作用相同 -->
taglib <!-- 用于引入自定义标签库到 tag file 中 -->
include <!-- 用于将其他资源导入 tag file 中 -->
attribute <!-- -->
variable <!-- -->

tag 指令 <%@ tag 属性=“属性值” ... %>

display-name  // 在XML工具中显示的名称,默认值是不包含后缀的tag file名
body-content // 指定标签body的类型,body-content属性值有empty、tagdependent、scriptless,默认值是scriptless
dynamic-attributes // 指定tag file动态属性的名称。当dynamic-attributes值被设定时,会产生一个Map来存放这些动态属性的名称和对应的值
small-icon // 指定一个图片路径,用于在XML工具上显示小图标。一般不会用到。
large-icon // 指定一个图片路径,用于在XML工具上显示大图标。一般不会用到。
description // 标签的描述信息
example // 标签使用实例的描述
language // tag file中使用的脚本语言类型,该值必须是“java”
import // 用于导入一个java类型,和JSP页面中的import相同。
pageEncoding // 指定tag file的编码格式,可以使用“CHARSET”中的值。和JSP中的pageEncoding相同。

taglib 指令  <%@ taglib uri=''tagLibraryURL" prefix="tagPrefix"%>

tag file 中的taglib 指令和JSP页面中的taglib 指令是一样的。该指令只有两个属性:uri 和 prefix

include 指令 <%@ include file=“文件相对 uri 地址” %>

tag file 中的include指令和JSP中的include指令是一样的。可以有多个 include 指令,该指令只有一个 file 属性

<!-- includeDemoTag.tag -->

This tag file shows the use of the include directive.
The first include directive demonstrates how you can include
a static resource called included.html.
<br />
Here is the content of included.html:
<%@ include file="included.html" %>
<br />
<br />
The second include directive includes another dynamic resource: included.tagf
<br />
<%@ include file="included.tagf" %> <!-- 导入到tag file中的tag file 必须以tagf为后缀 -->
<!-- included.html -->

<table>
<tr><td><b>Menu</b></td></tr>
<tr><td>CDs</td></tr>
<tr><td>DVDs</td></tr>
<tr><td>Others</td></tr>
</table>
<!-- included.tagf -->

<%
out.print("Hello from included.tagf.");
%>
<!-- includeDemoTagTest.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="easy" %> <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test include directive</title>
</head>
<body>
<easy:includeDemoTag />
</body>
</html>

attribute 指令 <%@ attribute 属性=“属性值” %>

用于设定 tag file 中标签的属性,将值从JSP页面中传递到tag file中。其和标签库描述文件中的atttribute元素等效

name  // 用于设定该属性的名称。在一个 tag file 中,每个属性的名称必须是唯一的。
required // 用于设定该属性是否是必须的。值可以取 true 和 false 默认是 false
fragment // 用于设定该属性是否是fragment,默认是 false
rtexprvalue // 用于设定该属性的值是否在运行时被动态计算,值可以取 true 或 false 默认是 true
type // 用于设定该属性的类型,默认是 java.lang.String
description // 用于设定该属性的描述信息
<!-- encode.tag -->
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ attribute name="content" required="true" %> <%!
private String encodeHtmlTag(String tag) {
if (tag == null){
return null;
}
int length = tag.length();
StringBuilder encodedTag = new StringBuilder(2 * length);
for(int i=0; i<length; i++){
char c = tag.charAt(i);
if(c == '<'){
encodedTag.append("&lt");
} else if(c == '>'){
encodedTag.append("&gt");
} else if(c == '&'){
encodedTag.append("&amp");
} else if(c == '"'){
encodedTag.append("&qout");
} else if(c == ' '){
encodedTag.append("&nbsp");
} else {
encodedTag.append(c);
}
}
return encodedTag.toString();
}
%> <%=encodeHtmlTag(content) %>
<!-- encodeTagTest.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="easy" %> <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>encodedTagTest</title>
</head>
<body>
<easy:encode content="<br /> means changing line" />
<br />
<easy:encode content="Today is Sunday." />
</body>
</html>

variable 指令 <%@ variable 属性=“属性值” %>

将 tag file 中的一些值传递到JSP页面中,用于定义那些需要传递到JSP页面的变量

name-given           // 变量名。在JSP页面的脚本和EL表达式中,可以使用该变量名。不能和name-from-attribute属性同时出现
name-from-attribute // 和name-given属性类似,由标签属性的值来决定变量的名称。不能和name-given属性同时出现
alias // 设定一个用来接收变量值的局部范围
varialbe-class // 变量的类型,默认为java.lang.String
declare // 设定该变量是否声明,默认值为false
scope // 用于指定该变量的范围。可取的值为AT_BEGIN、AT_END、NESTED。默认为NESTED
description //用于描述该变量
<!-- varDemo.tag -->
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ tag import="java.util.Date" %>
<%@ tag import="java.text.DateFormat" %>
<%@ variable name-given="longDate" %>
<%@ variable name-given="shortDate" %>
<%
Date now = new Date(System.currentTimeMillis());
DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG);
DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT);
jspContext.setAttribute("longDate", longFormat.format(now));
jspContext.setAttribute("shortDate", shortFormat.format(now));
%>
<jsp:doBody /> <!-- 该动作元素用来调用这个标签体 -->
<!-- varDemoTest.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %> <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>varDemoTest</title>
</head>
<body>
Today's date:
<br />
<tags:varDemo>In long format: ${longDate }</tags:varDemo>
<br />
<tags:varDemo>In short format: ${shortDate }</tags:varDemo>
</body>
</html>

DoBody 动作元素

该动作元素只能在 tag file 中使用,用来调用一个标签的本体内容。

doBody动作元素也可以有属性,通过这些属性来指定某个变量来接收主体内容,如果不使用这些指令,那么 doBody 动作元素会把主体内容写到 JSP 页面的 JspWriter 上。

var        // 用于保存标签主体内容的变量名,主体内容就会以java.lang.String的类型保存在这个变量内,var 和 varReader 属性只能出现一个
varReader // 用于保存标签主体内容的变量名,主体内容会以java.io.Reader的类型保存在这个变量内
scope // 变量保存到作用域

invoke动作元素

invoke动作元素和doBody动作元素类似,在 tag file 中,可以使用它来调用一个 fragment。

fragment   // 要调用的fragment的名称
var //
varReader //
scope //

Tag file的更多相关文章

  1. According to TLD or attribute directive in tag file, attribute test does not accept any expressions

    HTTP Status 500 - /WEB-INF/views/emp/list.jsp (line: 30, column: 4) According to TLD or attribute di ...

  2. According to TLD or attribute directive in tag file, attribute end does not accept any expressions

    问题描述: 在 JSP 页面中使用 JSTL 标签库,访问 JSP 页面时抛出了如下异常信息: org.apache.jasper.JasperException: /WEB-INF/manageUs ...

  3. According to TLD or attribute directive in tag file, attribute value does not accept any expressions

    1.错误描写叙述 2014-7-13 17:27:21 org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one ...

  4. 终极解法According to TLD or attribute directive in tag file, attribute select does not accept any expressions

    3天硬是是把这个问题解决了 有时候突然上个厕所灵感就来了 第一次向用JSTL解析xml 然后我想遍历整个xml文档打印出来 居然不让我输入变量 那让我怎么办啊 在网上各种找答案 说什么<%@ t ...

  5. EL表达式报错:  According to TLD or attribute directive in tag file, attribute value does not accept any expressions

    EL表达式报错: According to TLD or attribute directive in tag file, attribute value does not accept any ex ...

  6. 使用jstl报错:According to TLD or attribute directive in tag file, attribute value does not accept any expressions

    使用jstl报错:According to TLD or attribute directive in tag file, attribute value does not accept any ex ...

  7. According to TLD or attribute directive in tag file, attribute items does not accep t any expressions

    According to TLD or attribute directive in tag file, attribute items does not accep t any expression ...

  8. 解决:According to TLD or attribute directive in tag file, attribute value does not accept any express。

    http://blog.csdn.net/lzblog/article/details/22076893 ——————————————————————————————————————————————— ...

  9. jstl错误排除:According to TLD or attribute directive in tag file, attribute value does not accept any expressions

    问题描述: 在 JSP 页面中使用 JSTL 标签库,访问 JSP 页面时抛出了如下异常信息: org.apache.jasper.JasperException: /index.jsp (line: ...

随机推荐

  1. APP支付-》支付宝RSA2->支付与验签

    第一次配置支付宝,按照官网示例搞了一天,走不通.经过两天的踩坑,百度了大神的代码,支付宝终于可以了. 1:下载这是官网的最新SDK 2:配置SDK,添加命名空间 AopClient.php文件: Si ...

  2. hbase 调试各种报错

    1.master is initializing 怎么都不知道怎么回事,直接从hbase 2.0 换到了 hbase 2.1 2.java.lang.ClassNotFoundException: o ...

  3. python网络编程之进程论

    标签(空格分隔): 进程 什么是进程: 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu; 进程与程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程 注意: 需要强调的 ...

  4. WOPI的安装文档方法

    Office Web Apps安装部署 系统要求为Windows Server 2012, 注意:安装Office Web Apps的服务器除了Office Web Apps之外,不能安装其他应用.包 ...

  5. BP神经网络学习

    人工神经元模型     S型函数(Sigmoid) 双极S型函数 神经网络可以分为哪些? 按照连接方式,可以分为:前向神经网络 vs. 反馈(递归)神经网络 按照学习方式,可以分为:有导师学习神经网络 ...

  6. pta7-19打印学生选课清单(模拟)

    题目链接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101314114875633664 题意:输入n个学生,k門课程, ...

  7. websocket搭建错误

    用一下版本: gevent == 1.2.2 Eel == 0.9.7 gevent-websocket == 0.10.1 greenlet == 0.4.13 PyInstaller == 3.3 ...

  8. WdatePicker控件Javascript取得当前时间、取得减30分钟时间

    1.取得当前时间 function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var se ...

  9. spring mybatis springmvc整合

    使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...

  10. JAVA读取XML文件并解析获取元素、属性值、子元素信息

    JAVA读取XML文件并解析获取元素.属性值.子元素信息 关键字 XML读取  InputStream   DocumentBuilderFactory   Element     Node 前言 最 ...