tag file从两个方面简化了自定义标签的开发。首 先,tag file无须提前编译,直到第一次被调用才会编 译。除此之外,仅仅使用JSP语法就可以完成标签的扩 展定义,这意味着不懂Java的人也能够进行标签自定义 了。
其次,标签库描述文件也不再需要了。原先需要在 标签库描述文件里定义标签元素的名字,以及它所对应 的action。使用tag file的方式,tag file名和action相同, 因此不再需要标签库描述文件了。
JSP容器提供多种方式将tag file编译成Java的标签 处理类。例如Tomcat将tagfile翻译成继承于 javax.servlet.jsp.tagext.SimpleTag接口的标签处理类。
一个tag file和JSP页面一样,它拥有指令、脚本、 EL表达式、动作元素以及自定义的标签。一个tag file 以tag和tagx为后缀,它们可以包含其他资源文件。一个 被其他文件包含的tag file应该以tagf为后缀。
tag文件必须放在应用路径的WEB-INF/tags目录下 才能生效。和标签处理类一样,tag 文件可以被打到jar 包里。
tag file中也有一些隐藏对象,通过脚本或者EL表 达式可以访问这些隐藏对象。表7.1列出了这些隐藏对 象。这些隐藏对象和JSP隐藏对象类 似。
对象 | 类型 |
request | javax.servlet.http.HttpServletRequest |
response | javax.servlet.http.HttpServletResponse |
out | javax.servlet.jsp.JspWriter |
session | javax.servlet.http.HttpSession |
application | javax.servlet.ServletContext |
config | javax.servlet.ServletConfig |
jspContext | javax.servlet.jsp.JspContext |
1. 下面的这个例子包含一个tag文件和一个使用这个tag文 件的JSP页面。例子的目录结构如图所示。
这个tag file的名称是firstTag.tag,代码如下所 示。
<%@ 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)); %>
tag file和JSP页面是很相似 的。在firstTag.tag文件里包含了一个tag指令和一个脚本 片段,其中tag指令里又有两个import属性。接下来,只 需要将这个tag file放到WEB-INF/tags目录下就可以使用 了。注意tag file名和标签的名字是一样的,例如这个 firstTag.tag的tag file对应的标签名即为firstTag。
2. 下面是一个使用firstTag.tag文件的JSP实例: firstTagTest.jsp。
firstTagTest.jsp页面
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %> Today is <easy:firstTag/>
效 果:
和JSP页面一样,tag file可以使用指令来指挥JSP容 器如何编译这个tag file。tag file的指令语法和JSP是一 样的:
<%@ directive (attribute="value")* %>
星号(*)表示括号内的可以重复0次或者多次,上 面的指令也可以写成下面这种更直白的样子:
<%@ directive attribute1="value1" attribute2="value2" ... %>
属性必须被单引号或者双引号包裹,<%@之后和 %>之前的空格加不加都不影响正确性,但是为了可读 性,建议加上空格。除了page指令,其他所有的JSP指 令都可以用于tag file。在tag file中,可以使用tag指令代 替page指令。另外,你还可以使用两个新指令: attribute 和variable。下表展示了所有可以在tag file中使 用的指令。
指令 | 描述 |
tag | 作用与JSP页面中的page指令类似 |
include | 用于将其他资源导入tag file中 |
taglib | 用于将自定义标签库导入tag file中 |
attribute | 用于将自定义标签库导入tag file中 |
variable | 用于将自定义标签库导入tag file中 |
tag指令和JSP页面中的page指令类似。以下是它的 使用语法:
<%@ tag (attribute="value")* %>
也可以使用下面这种更直白的表达式:
<%@ tag attribute1="value1" attribute2="value2" ... %>
属性 | 描述 |
display-name | 在XML工具中显示的名称。默认值是不包含后缀的tagfile名 |
body-content | 指定标签body的类型,body-content属性值有empty、tagdependent、scriptless,默认值是scriptless |
dynamicattributes | 指定tagfile动态属性的名称。当dynamicattributes值被设定时,会产生一个Map来存放这些动态属性的名称和对应的值 |
small-icon | 指定一个图片路径,用于在XML工具上显示小图标。一般不会用到 |
large-icon | 指定一个图片路径,用于在XML工具上显示大图标。一般也不会用到 |
description | 标签的描述信息 |
example | 标签使用实例的描述 |
language | tagfile中使用的脚本语言类型。当前版本的JSP中,该值必须设为“java” |
import | 用于导入一个java类型,和JSP页面中的import相同 |
pageEncoding | 指定tagfile使用的编码格式,可以使用“CHARSET”中的值。和JSP页面中的pageEncoding相同 |
除了import属性,其他所有的属性在一个tag指令或 一个tag file中都只能出现一次。例如,以下的tag file就 是无效的,因为body-content属性在同一个tag file中出 现了多次:
<%@ tag display-name="first tag file" body-content="scriptless" %> <%@ tag body-content="empty" %>
ag file中的include指令和JSP页面中的include指令 是一样的。可以使用这个指令来将外部文件导入到tag file中。当你有一个公共资源文件有可能用在多个tag file中时,include指令将能够发挥它的作用。这个公共 资源文件可以是静态文件(例如HTML文件),也可以 是动态文件(例如其他tag file)。 例如清单7.3中的includeDemoTag.tag文件就导入了 一个静态文件(included.html)和一个动态文件 (included.tagf)。
原文:https://www.cnblogs.com/jiangfeilong/p/10705357.html