在JSP中使用标签是很平常的事情,在制作自定义标签时,通常都需要写tld文件来定义标签的各种属性,对应的Java类,前缀等等。标签与tld文件紧紧相连,那么,到底应该怎么放置tld文件?在web.xml中怎么定义tld文件的位置?

以下是具体的分析

Taglib的使用:

首先是在头部申明taglib, uri必须是web.xml定义的,或者是原始tld文件定义的。

然后便可以在jsp页面中通过prefix使用相应的标签

Uri与tld文件的映射关系

JSP文件中使用的标签通常都有一个tld定义文件(标签库定义文件,主要定义标签对应的java类,标签的属性等等信息)与之对应的,web容器需要找到相应的tld文件,以tld文件中定义的内容判断标签的使用是否正确。

Web做【使用正确性】判断处理,当遇到类似【

Key

(Uri)

Value

(String[] taglib_tld_location)

Taglib-URI:

taglib_tld_location[0]

taglib_tld_location[1]

本文主要介绍的便是uri到tld的映射

Tld文件路径定义方式

如下方式1和方式2只能在2.3版本使用,Servlet2.4开始便不能在web.xml中定义taglib了。

/p>

PUBLIC "-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

l  方式1:

如下所示,在web.xml中定义

/jstl-examples-taglib

/WEB-INF/lib/jstl-examples.tld

如果这样定义的话,映射关系便如下:

/jstl-examples-taglibßà{“/WEB-INF/lib/jstl-examples.tld”,””} // taglib_tld_location[0]就足以表示tld路径,因此taglib_tld_location[1]为空。

l  方式2:

如下所示,在web.xml中定义

/jstl-examples-taglib

/WEB-INF/lib/jstl-examples.jar

如果这样定义的话,映射关系便如下:

/jstl-examples-taglibßà{“/WEB-INF/lib/ jstl-examples.jar”,” META-INF/taglib.tld”}

// taglib_tld_location[0]表示jar路径,taglib_tld_location[1]固定为META-INF/taglib.tld(也就是说,tld在jar文件中的保存路径必须是META-INF/taglib.tld,名称必须是taglib.tld)。这就是说一个jar里只能有一个tld。如果代码中不固定为taglib.tld的话,也很难处理,因为如果tld的名称可以随便定义的话,出现多个tld在jar文件中时将会导致混乱。

l  方式3:

不需要在web.xml中定义,只需要把tld保存在web应用能够使用的jar文件中的META-INF路径下便可。这种情况的机制是这样的:web容器会遍历当前web应用能够访问的jar文件,从jar文件中查找META-INF/xxx.tld文件,当找到一个tld文件之后,便会解析tld文件,取出节点的值,把uri作为key值生成映射关系。

如下所示的jstl的core标签库的tld文件,便会有如下的映射关系

http://java.sun.com/jstl/coreßà{“tld文件所在的jar文件的路径”,” META-INF/xxx.tld”}//taglib_tld_location[0]表示jar路径,taglib_tld_location[1]为所搜到的tld在jar文件中的相对路径

……

1.0

1.2

c

http://java.sun.com/jstl/core

JSTLcore

JSTL 1.0 corelibrary

……

catch

org.apache.taglibs.standard.tag.common.core.CatchTag

JSP

Catchesany Throwable that occurs in its body and optionally

exposesit.

var

false

false

……

Ø  Tld文件的解析逻辑

以jstl为例:

Web容器遇到类似【找到uri,再根据此uri便可以定位到taglib_tld_location。当taglib_tld_location[0]不是jar文件时,便直接使用java的FileInputStream读取tld文件;当taglib_tld_location[0]是jar文件时,则会

通过如下代码读取tld文件。

URL jarFileUrl = new URL("jar:" +location[0] + "!/");

ZipEntry jarEntry = jarFile.getEntry(location[1]);

Ø  总结:

Tld的定义可以不在web.xml中定义,这时需要保证tld在web应用能够访问的jar中,并且保存在jar的META-INF目录下。此时JSP直接使用tld中定义的便可;

如果在web.xml中定义tld的路径的话,可以直接指定tld文件路径,此时要保证tld不在jar包中(比如在WEB-INF目录下);也可以指定为jar文件路径,此时要保证tld在jar中且路径为META-INF/taglib.tld。

在web.xml中定义的uri优先级要高于tld文件中定义的优先级。

===============================================================

jsp自定义标签 Tag文件版

实现一个与上篇文章类似的Select标签功能

1.在WEB-INF/tags/select.tag

${attrEntry.key}="${attrEntry.value }"

>

${option}

这里要注意tag文件只能放在如下位置:

1.WEB-INF/tags

2.WEB-INF/tags的子目录

3.WEB-INF/lib中jar包的META-INF/tags

4.WEB-INF/lib中jar包的META-INF/tags下的子目录

5.jar包中的tag文件需要tld

添加jstl.jar与standard.jar到WEB-INF/lib目录,还有一点就是上面标红的部分:不要使用http://java.sun.com/jstl/core这个url,否则会报foreach中的item属性有问题

2.在jsp中的使用

pageEncoding="UTF-8"%>

Insert title here

List colorList = new ArrayList();

colorList.add("red");

colorList.add("blue");

colorList.add("white");

request.setAttribute("colorList",colorList);

%>

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

jsp 自定义标签

jsp标签有两组api

JspTag ->SimpleTag ->SimpleTagSupport

JspTag ->Tag ->IterationTag->BodyTag

第二组是classic的,比较早的使用方式,doStartTag(),doEndTag()有N多返回值的那种,使用起来也确实不方便,今天学到了另一个使用第一组api方式的,让人大快人心,贴码

例子是一个Select的标签,支持动态属性设置

1.编写标签类

public class SelectTagHandler extends SimpleTagSupport implements DynamicAttributes {

private static final String ATTR_TEMPLATE = "%s='%s'";

private static final String OPTION_TEMPLATE = "%1$s";

private List optionsList;

private String name;

private String size;

private Map tagAttrs = new HashMap();

public void setName(String name) {

this.name = name;

}

public void setSize(String size) {

this.size = size;

}

public void setOptionsList(List optionsList) {

this.optionsList = optionsList;

}

@Override

public void doTag() throws JspException, IOException {

PageContext pageContext = (PageContext) getJspContext();

JspWriter out = pageContext.getOut();

out.print("

out.print(String.format(ATTR_TEMPLATE, "name", this.name));

out.print(String.format(ATTR_TEMPLATE, "size", this.size));

for (String attrName : tagAttrs.keySet()) {

String attrDefinition = String.format(ATTR_TEMPLATE, attrName, tagAttrs.get(attrName));

out.print(attrDefinition);

}

out.print(">");

for (Object option : this.optionsList) {

String optionTag = String.format(OPTION_TEMPLATE, option.toString());

out.println(optionTag);

}

out.println("

");

}

@Override

public void setDynamicAttribute(String uri, String name, Object value) throws JspException {

tagAttrs.put(name, value);

}

}

看到没,代码如此的简洁,动态属性配置也十分的方便,不用写N多个setter与getter方法.

2.编写tld文件WebRoot/tld/select.tld

xmlns:xsi="http://www.w3g.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"

version="2.0">

1.2

1.2

Forms Taglib

http://hi.baidu.com/tags/forms

An example tab library of replacements for the html form tags.

select

com.baidu.hi.tag.SelectTagHandler

empty

optionsList

true

true

java.util.List

name

true

size

true

true

3.在jsp中的使用

pageEncoding="UTF-8"%>

Insert title here

List colorList = new ArrayList();

colorList.add("red");

colorList.add("blue");

colorList.add("white");

request.setAttribute("colorList",colorList);

%>

java中的tld_自定义标签tld的使用相关推荐

  1. 怎么在java中创建一个自定义的collector

    文章目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream ...

  2. c++中的new_怎么在java中创建一个自定义的collector

    简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类. 今 ...

  3. Java中如何创建自定义的注解学习笔记(MD版)

    概要 Java中如何创建自定义的注解学习笔记(MD版). 博客 博客地址:IT老兵驿站. 前言 记得这篇笔记还是在泉州的龙玲酒店记录的,是一个周六的晚上,坐飞机从上海到泉州,从笔记中能勾起一些旅游的回 ...

  4. JAVA中利用break加标签的方式跳出双重for循环

    JAVA中利用break加标签的方式跳出双重for循环 一般情况下,使用break只能跳出当前层的for循环,但是加了标签的话,就可以跳出多重循环. public class TestBreak {@ ...

  5. Java中Double保留自定义小数位的几种方法

    Java中Double保留自定义小数位的几种方法 在Java语言编程中我们有时候会有保留指定小数位的需求,那应该如何操作呢,下面带来几种方法:(这里的所有方法以保留两位小数位为例) 一. 四舍五入并保 ...

  6. java中collector使用_怎么在java中创建一个自定义的collector

    怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或 ...

  7. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)

    velocity本身支持自定义标签和指令的扩展,我们看看扩展指令的步骤及searchweb2的应用场景, 1.使用方法 在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用 ...

  8. java 模糊查询 分页(自定义标签)

    本次的实现是采用struts2+hibernate+分页标签 实现 class :PagerTag 是用来实现自定义分页标签,继承SimpleTagSupport实现自定义标签 public clas ...

  9. java中table是什么标签_[Java教程]javascript格式化table标签内容

    [Java教程]javascript格式化table标签内容 0 2015-07-12 20:00:08 项目中遇到这样的需求,一大段文章正文的html代码在手机中显示不全,原因是由于其它有table ...

  10. 帮帮忙—ssm框架中,简单自定义标签SimpleTagSupport如何注入spirng中的bean

    权限太多,想用简单自定义标签来控制,但遇到一个头疼的问题,不能用@autowird自动注入spring管理的bean,让人恼火: 经过周折,终于解决问题,与大家一起分享,可能不是最好的方法,希望有更好 ...

最新文章

  1. 提高 GPU 训练利用率的Tricks
  2. 关系数据库范式粗略理解
  3. Ubuntu下安装和配置Apache2方法简介
  4. spring boot pom配置_125 SpringCloud服务配置中心
  5. mysql数据库utf-8编码
  6. springboot web项目_Vue、Spring Boot开发小而完整的Web前后端分离项目实战12
  7. priority_queueint,vectorint,greaterint优先队列,按照从小到大
  8. process 类 java_编写可执行jar——java的Process类的使用(二)
  9. telnet 无法连接_Telnet 为什么不能以 root 身份登录系统?
  10. Linux入门基础命令学习记录
  11. .net 版农业银行接口
  12. android 广播监听截屏,Android 应用监听截屏操作
  13. java判断接口地址是否存在_java.util.Iterator接口中的hashNext()方法是用来判断集合中是否存在下一个元素的()_学小易找答案...
  14. 微型计算机的地址加法器,地址加法器
  15. 《逆流而上的你》大结局将至,邹凯高蜜何去何从
  16. HTML二级下拉菜单自动联动,html二级联动下拉菜单 [Excel函数如何制作二级联动下拉菜单]...
  17. 中小型企业选择企业邮箱的好处
  18. 【小程序云开发】30分钟搭建个人相册小程序
  19. 苹果端手机微信页面长按图片无法保存的解决方案
  20. 安全模式启动电脑和正常启动有什么区别

热门文章

  1. 通过jquery读cookie添加xsrf HTTP头来避免请求伪造
  2. [编程题]雀魂启动! C++
  3. 仿原生安卓文件管理器
  4. MacPro安装运行Win10虚拟机 (Parallels Desktop)
  5. 计算机系固态硬盘机械硬盘,直观:如何在固态硬盘+机械硬盘上安装系统_IT /计算机_资料...
  6. java 开发 cms_10 个最受欢迎的 Java 开发的 CMS 系统
  7. 虚拟机快照、迁移、删除
  8. office2019 图目录_赶快收藏!这款强大的PPT通路图插件ScienceSlides 2016来了!
  9. Android工具类篇 清理APP应用缓存
  10. 【报告分享】2021中国瑜伽行业报告-精练(附下载)