如果
你的 WEB 项目
JSP 自定义标签技术
可以满足你
1. 什么是 JSP 标签 ?
JSP 标签是 JavaServer Pages 技术中的特殊语法,它看起来就像普通的 HTML 或者 XML 标签一样。
就像这样
但只要封装的合理
就能大幅度提高开发效率
就像这样
下面以 RookieTable 为例
简要介绍
自定义 JSP 标签
开发技术
2. 怎么写自定义标签 ?
A. TLD,标签库描述符文件
TLD 文件主要描述了自定义标签库的命名空间前缀、标签名以及标签属性,负责定义标签
B. TagClass,标签处理器
所有 JSP 标签都将引起某些标签处理器的执行,标签处理器包含了用于完成标签目的的必要代码。标签处理器将在 TLD 中的标签定义中指定,容器则使用该信息将 JSP 中的标签映射到应该执行的Java代码。
——《Java Web 高级编程,8.1 节》
写一个自定义 JSP 标签分两步
1. 用 TLD 定义标签
2. 编写标签处理类实现标签功能
搞定
3. 怎么用自定义标签 ?
2 步:
a. 使用 taglib 指令引用自定义标签库;
b. <prefix:tagName tagAttr=xxx ..> 这么用;
4. 写标签时的几个技术点
4.1. tld 的 uri
URI 是一个命名惯例,并不是实际的 TLD 位置(并不是一个真正的URL)。事实上,大多数情况下,在浏览器中访问该 URI 时,你将会看到一个 404 页面未找到或者其他类似的错误。你所使用的 TLD 将被以某种方式包含在应用程序中,无论是在容器中、应用程序的 JAR 文件中或者应用程序的 WEB-INF 目录中。URI 只是一种用于识别唯一 TLD 的技术,通过这种方式可以正确地关联到响应的 TLD。
——《Java Web 高级程序设计 7.1节》
4.2. tld 应该放哪 ?容器怎么查找?
当 JSP 解析器遇到 taglib 指令时,它将在不同的位置搜索该 URI,并定位到该标签库的 TLD 文件。JSP 规范中定义的这些位置如下(按优先级从高到低显示):
(1). 搜索所有匹配 Java EE 规范的 TLD 文件,包括 JSP 标签库、Java 标准标签库和所有的 JavaServer Faces 库;
(2). 然后解析器将检查 web.xml 文件中 <jsp-config> 中的显式 <taglib> 声明;
(3). 如果解析器仍然未找到匹配的 TLD 文件,它将检查应用程序的 /WEB-INF/lib 目录中所有 JAR 文件的 META-INF 文件中的所有 TLD 文件,或者检查应用程序的 /WEB-INF 目录中的 TLD 文件,或者递归检查所有 /WEB-INF 子目录中的 TLD 文件;
(4). 最后,解析器将检查 Web 容器或者应用服务器中的所有 TLD 文件;
——《Java Web 高级程序设计 7.1节》
注:不建议在 web.xml 中描述 tld;建议将 tld 放在 jar 文件的 META-INF 目录中,让容器去自己扫描;而且用 jar 管理 tld,也便于未来 tld 的升级;
图:RookieTable 将 tld 放置于 WEB-INF 目录中
图:spring-mvc 将 tld 放置于 jar 中
4.3. 只能继承 BodyTagSupport ?
有
而且还不少
...
标签处理器必须是 javax.servlet.jsp.tagext.Tag 或 javax.servlet.jsp.tagext.SimpleTag 的实现类;
——《Java Web 高级程序设计 8.1节》
从继承体系上看,主要分 SimpleTag 和 Tag,BodyTagSupport 是 Tag 的子类;Tag 是典型的标签处理器(JSP 出现的初期,它就已经出现了),SimpleTag 是到了 JSP 2.0 才添加,SimpleTag 的接口比 Tag 更简单一些;
注:SimpleTag 我没用过,就不胡写了...
4.4. BodyTagSupport 核心接口说明
参考:
JSP 2.3 官方文档: http://download.oracle.com/otndocs/jcp/jsp-2_3-mrel2-eval-spec/ 《Java Web 高级编程》