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. Loading Assets from AssetBundles

    [Loading Assets from AssetBundles] 1.LoadAsset GameObject gameObject = loadedAssetBundle.LoadAsset&l ...

  2. Linux系统服务之inetd

    [Linux系统服务之inetd] inetd的角色是作为Telnet和FTP等与网络服务器相关的进程的“超级服务器”.这是一个简单的道理:并不是全部的服务器进程(包括那些接受新的Telnet和FTP ...

  3. metasploit framework(二):记一次入侵

    msfconsole use 其中一个 exploit前台执行注入 后台执行shell 加-j 通过sessions查看后台执行的shell,可以看到这个会话的id号为2 进入会话,sessions ...

  4. day32 并发编程

    并发编程 并发编程的理论 python中实现多进程 进程测试 import os import time while True: time.sleep(0.5) print("hahaha& ...

  5. oracle 查询列表中选取其中一行

    select k.SAL from (select SAL,rownum rn from (select SAL from SCOTT.EMP where MGR = 7698 order by SA ...

  6. jenkins权限控制

    一.插件安装 插件:Role-based Authorization Strategy版本:2.3.2 二.全局安全配置 进入Jenkins后点击系统管理进入全局安全配置 当插件安装好的时候,授权策略 ...

  7. 跨域导致无法获取cookie

    首先我用的框架是vue,请求协议用的是ajax,跨域的处理办法是使用了反向代理,在我之前的博文有详细说明,有兴趣的可以去查看下,在做身份认证权限限制的时候,后台有在http-header的respon ...

  8. pta l2-16(愿天下有情人都是失散多年的兄妹)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 题意:两个异性的人五服之内不得通婚 ...

  9. Android 基础 (四大组件,五大存储,六大布局)

    Android四大组件: 参考:https://blog.csdn.net/shenggaofei/article/details/52450668 Android四大组件分别为activity.se ...

  10. 图片Bitmap在本地的存储与读取 File

    将Bitmap存储到本地: public void SaveImage(Bitmap image, String user_id){ //照片通常存在DCIM文件夹中 String sdCardDir ...