Tag file
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("<");
} else if(c == '>'){
encodedTag.append(">");
} else if(c == '&'){
encodedTag.append("&");
} else if(c == '"'){
encodedTag.append("&qout");
} else if(c == ' '){
encodedTag.append(" ");
} 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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 终极解法According to TLD or attribute directive in tag file, attribute select does not accept any expressions
3天硬是是把这个问题解决了 有时候突然上个厕所灵感就来了 第一次向用JSTL解析xml 然后我想遍历整个xml文档打印出来 居然不让我输入变量 那让我怎么办啊 在网上各种找答案 说什么<%@ t ...
- 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 ...
- 使用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 ...
- 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 ...
- 解决:According to TLD or attribute directive in tag file, attribute value does not accept any express。
http://blog.csdn.net/lzblog/article/details/22076893 ——————————————————————————————————————————————— ...
- 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: ...
随机推荐
- 使用rtl8192du安装无线驱动步骤
*************一.直接操作发********** 步骤:1.去Realtek官网下载无线网卡驱动下载地址:点击这里2.驱动在压缩包中的driver目录(也是一个压缩包),将其解压到/opt ...
- MATLAB GUI图片添加背景
global im [filename,pathname]=uigetfile('*.jpg','输入图片'); file=strcat(pathname,filename); im=imread(f ...
- Spring read-only="true" 只读事务的
概念:从这一点设置的时间点开始(时间点a)到这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!(查询中不会出现别人在时间点a之后提交的数据) 应用场合: 如果你一次执行单条查询语句,则没有必 ...
- propTypes
[propTypes] React.PropTypes is deprecated as of React v15.5. Please use the prop-types library inste ...
- Restrict & Cascade
[Restrict & Cascade] 参考:https://my.oschina.net/cart/blog/277624
- 手工命令行 搭建 hadoop 和 spark 环境
环境准备:3台CentOS7,64位,Hadoop2.7需要64位Linux 192.168.20.161 192.168.20.162 192.168.20.163 三台机器分别叫host01. ...
- smtp扫描
nc扫描 nc -nv ip号 25 nmap扫描
- 解题(MiGong--迷宫问题(深度搜索))
题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, ...
- Java 几种锁
自旋锁 自旋锁顾名思义,它会等待一定时间(自旋),在这期中会什么都不做就是等资源被释放,好处在于没有了内核态用户态切换的效率损失,但是如果它一直不能访问到资源的话就会一直占用cpu资源,所以它会循环一 ...
- 执行SDK的aapt报错./aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./aapt)
问题| 执行SDK下的aapt报错./aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./aapt) ../ ...