前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JSP:自定义标签技术

JSP:自定义标签技术

作者头像
WEBJ2EE
发布2019-07-19 11:54:36
1.2K0
发布2019-07-19 11:54:36
举报
文章被收录于专栏:WebJ2EEWebJ2EE

如果

你的 WEB 项目

  • 基于 Java EE;
  • 用 JSP 作为视图层;
  • 属于功能很多但 UI 风格有固定模式的 MIS 型系统;
  • 在大量的功能中,存在模式固定、高频使用的UI组件(例:表单、表格);
  • 希望业务开发人员集中精力于后端数据层,而不在CSS 、HTML上费时间;
  • 尽量屏蔽技术细节(例:跨浏览器、Flex布局),只对业务人员提供语义明确的 API 接口;

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 高级编程》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebJ2EE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档