在JSTL提供了四个标签库(核心标签库、国际化标签库、数据库标签库和XML标签库),涉及到了几十个标签。虽然这些标签可以完成比较复杂的工作,但它们仍然无法满足程序中的特殊需求。因此,就需要用户根据自己的需要来定制JSP标签,这种由用户自己实现的JSP标签被称为自定义标签。

.1 自定义标签基础

自定义标签和JSTL中的标签从技术上看没有任何区别,可以将这些标签统称为JSP标签。JSP标签在JSP页面中通过XML语法格式被调用,当JSP引擎将JSP页面翻译成Servlet时,就将这些调用转换成执行相应的Java代码。也就是说,JSP标签实际上就是调用了某些Java代码,只是在JSP页面中以另外一种形式(XML语法格式)表现出来。

1.1 编写输出随机数的标签

开始自定义标签的学习之前,在这一节先来实现一个简单的自定义标签,以使读者做一下热身,同时读者通过本节的例子可以对自定义标签的实现方法和过程有一个感性的认识。

【实例1-1】 实现输出随机数的标签

1. 实例说明

在本例实现的自定义标签(random标签)的功能是输出一个指定范围的随机整数。random标签有如下几个特征:

没有标签体。

有两个属性:min和max。其中min属性表示生成随机数的最小值,max属性表示生成随机数的最大值。min属性的默认值是0,max属性的默认值是Integer.MAX_VALUE。

生成随机数的范围是min <= random < max。

random标签的标准调用形式如下:

<ct:random min="1" max="100" />

其中“ct”是调用标签时的前缀,通过taglib指定的prefix属性指定。上面的代码的功能是输出一个在1(包括)和100(不包括)之间的随机数。

2. 编写标签类

标签类是自定义标签的核心部分。实现标签类的方法有很多,但最简单的方法是编写一个从

javax.servlet.jsp.tagext.TagSupport类继承的Java类,并在该类中覆盖TagSupport类的doStartTag方法。为了读取标签中的属性值,还需要在标签类中为每一个标签属性提供一个相应数据类型的标签类属性以及该属性的setter方法(不需要getter方法)。生成随机数的代码需要放在标签类的doStartTag方法中。该标签类的实现代码如下:

  1. package chapter1;
  2. import java.io.IOException;
  3. import java.util.Random;
  4. import javax.servlet.jsp.JspException;
  5. import javax.servlet.jsp.tagext.TagSupport;
  6. public class RandomTag extends TagSupport
  7. {
  8. // 封装random标签的两个属性的JavaBean属性
  9. private int min = 0;
  10. private int max = Integer.MAX_VALUE;
  11. // min属性的setter方法
  12. public void setMin(int min)
  13. {
  14. this.min = min;
  15. }
  16. // max属性的setter方法
  17. public void setMax(int max)
  18. {
  19. this.max = max;
  20. }
  21. // 覆盖TagSupport类的doStartTag方法
  22. // 当遇到标签(也就是<ct:random>)的开始标记时调用该方法
  23. @Override
  24. public int doStartTag() throws JspException
  25. {
  26. try
  27. {
  28. Random random = new Random();
  29. // 生成一个在min和max之间的随机数
  30. int result = min + random.nextInt(max - min);
  31. // 将生成的随机数输出到客户端
  32. pageContext.getOut().write(String.valueOf(result));
  33. }
  34. catch (IOException e)
  35. {
  36. }
  37. // TagSupport类的doStartTag方法默认返回SKIP_BODY,表示忽略自定义标签体
  38. return super.doStartTag();
  39. }
  40. }

在RandomTag类的doStartTag方法中使用了一个pageContext变量来获得JspWriter对象(JSP的out

内置对象)。pageContext变量是在TagSupport类中定义的一个类变量,该变量通过TagSupport类中的

setPageContext方法进行赋值。实际上,setPageContext方法是在Tag接口中定义的,而TagSupport实现了

Tag接口的setPageContext方法。Servlet容器在调用doStartTag方法之前,会先调用Tag接口的setPageContext方法来初始化pageContext变量。Tag接口将在1.1.3节介绍,在这里只要知道所有的标签类都必须实现Tag接口。为了简化标签类的实现,JSP API提供了一个TagSupport类,有了TagSupport类,用户在编写标签类时就不需要实现Tag接口的所有方法了。

3. 编写标签库描述符文件(TLD文件)

在JSTL中有若干TLD文件(详见图9.1),其中tld是Tag Library Descriptor(标签库描述符)的缩写。

要想使一个自定义标签正常工作,必须在TLD文件中对该标签进行配置。在TLD文件中主要配置如下两部分内容: 标签库的配置信息、标签库中具体标签的配置信息

标签库的配置信息主要包括如下的内容:

标签库的版本:使用<tlib-version>标签设置。

正常使用标签库中的标签所需要的最低JSP版本:使用<jsp-version>标签设置。

标签库的默认前缀:使用<short-name>标签设置。

标签库的URI:使用<uri>标签设置。

标签库的描述信息:使用<description>标签设置。

标签的配置信息主要包括如下的内容:

标签名:使用<name>标签设置。

标签对应的Java类:使用<tag-class>标签设置。

标签体的类型:使用<body-content>标签设置。

标签的描述信息:使用<description>标签设置。

标签属性的信息:每一个标签属性对应一个<attribute>标签。在<attribute>标签中可以指定标签名(使用<name>标签设置)、该属性是否必须指定(使用<required>标签设置)、该属性是否支持动态属性值(使用<rtexprvalue>标签指定)等配置信息。

在WEB-INF目录中建立一个jsp-taglib.tld文件,并在该文件中输入如下的内容:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  5. http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
  6. <!-- 标签库的配置信息 -->
  7. <description>自定义标签库</description>
  8. <tlib-version>1.1</tlib-version>
  9. <short-name>ct</short-name>
  10. <uri>http://nokiaguy.blogjava.net</uri><taglib>
  11. <!-- random标签的配置信息 -->
  12. <tag>
  13. <description>产生一个指定范围的随机数</description>
  14. <name>random</name>
  15. <tag-class>chapter1.RandomTag</tag-class>
  16. <body-content>empty</body-content>
  17. <attribute>
  18. <name>min</name>
  19. <required>false</required>
  20. <rtexprvalue>false</rtexprvalue>
  21. </attribute>
  22. <attribute>
  23. <name>max</name>

Java_JSP自定义标签的开发与应用的更多相关文章

  1. JavaWeb 自定义标签库开发传统标签

    自定义标签主要用于移除Jsp页面中的java代码. 移除jsp页面中的java代码,只需要完成两个步骤: 编写一个实现Tag接口的Java类,并覆盖doStartTag方法,把jsp页面中的java代 ...

  2. JSP 自定义标签的开发流程

    1.编写一个实现Tag接口的标签处理器类 package cn.itcast.web.tag; import java.io.IOException; import javax.servlet.htt ...

  3. JSP进阶 之 SimpleTagSupport 开发自定义标签

    绝大部分 Java 领域的 MVC 框架,例如 Struts.Spring MVC.JSF 等,主要由两部分组成:控制器组件和视图组件.其中视图组件主要由大量功能丰富的标签库充当.对于大部分开发者而言 ...

  4. Java Web开发技术教程入门-自定义标签

    回顾: 昨天了解了JSP开发的两种模式Model1和Model2模式.Model1采用JSP+JavaBean技术开发Web应用,它比较适合小规模应用的开发,效率较高,易于实现.但由于在Model1中 ...

  5. 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

    EL应用      自定义一个标签,实现两个字符串的相加 1回顾      1.1servlet生命周期           init(ServletConfig)           service ...

  6. JavaWeb之 JSP:自定义标签

    当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 自定义标签 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的 ...

  7. JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用

    1.标签 以类似于html标签的方式实现的java代码的封装. 第一:形成了开发标签的技术标准---自定义标签的技术标准. 第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl, ...

  8. JSP自定义标签库

    总所周知,JSP自定义标签库,主要是为了去掉JSP页面中的JAVA语句 此处以格式化输出时间戳为指定日期格式为例,简单介绍下JSP自定义标签的过程. 编写标签处理类(可继承自javax.servlet ...

  9. JavaWeb之 JSP:自定义标签的创建和使用

    当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的java类, ...

随机推荐

  1. html-表格和列表

    一:表格标签 表格 描述 <table> 定义表格 <caption> 定义表格标题. <th> 定义表格的表头. <tr> 定义表格的行. <t ...

  2. SQLAlchemy-对象关系教程ORM-连接,子查询

    对象关系教程ORM-连接 一:内连接 方法一: for u, a in session.query(User, Address).\ filter(User.id==Address.user_id). ...

  3. 统计学习方法九:EM算法

    一.EM算法是什么? EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计. 作用:简单直白的说,估计参数 是一种生成模型 (1)用在概率模型中 (2)含有隐变量 (3)用极大似然估计方 ...

  4. thinkphp辅助方法,数据库操作

  5. 多路复用IO与NIO

    最近在学习NIO相关知识,发现需要掌握的知识点非常多,当做笔记记录就下. 在学NIO之前得先去了解IO模型 (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(No ...

  6. Es官方文档整理-3.Doc Values和FieldData

    Es官方文档整理-3.Doc Values和FieldData 1.Doc Values 聚合使用一个叫Doc Values的数据结构.Doc Values使聚合更快.更高效且内存友好. Doc Va ...

  7. Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数

    Transact-SQL提供了4个排名函数: rand() , dense_rand() , row_number() , ntile() 下面是对这4个函数的解释:rank() 返回结果集的分区内每 ...

  8. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  9. 20165333 2016-2017-2 《Java程序设计》第1周学习总结

    20165333 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 java 的地位 Java 的特点 安装JDK 系统环境的设置 Java程序的编写,编译和运 ...

  10. day9作业

    题目:简单主机批量管理工具 需求: 1.主机分组: 2.登录后显示主机分组,选择分组后查看主机列表: 3.可批量执行命令.发送文件,结果实时返回: 4.主机用户名密码可以不同.