Java_JSP自定义标签的开发与应用
在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方法中。该标签类的实现代码如下:
- package chapter1;
- import java.io.IOException;
- import java.util.Random;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.tagext.TagSupport;
- public class RandomTag extends TagSupport
- {
- // 封装random标签的两个属性的JavaBean属性
- private int min = 0;
- private int max = Integer.MAX_VALUE;
- // min属性的setter方法
- public void setMin(int min)
- {
- this.min = min;
- }
- // max属性的setter方法
- public void setMax(int max)
- {
- this.max = max;
- }
- // 覆盖TagSupport类的doStartTag方法
- // 当遇到标签(也就是<ct:random>)的开始标记时调用该方法
- @Override
- public int doStartTag() throws JspException
- {
- try
- {
- Random random = new Random();
- // 生成一个在min和max之间的随机数
- int result = min + random.nextInt(max - min);
- // 将生成的随机数输出到客户端
- pageContext.getOut().write(String.valueOf(result));
- }
- catch (IOException e)
- {
- }
- // TagSupport类的doStartTag方法默认返回SKIP_BODY,表示忽略自定义标签体
- return super.doStartTag();
- }
- }
在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文件,并在该文件中输入如下的内容:
- <?xml version="1.0" encoding="UTF-8" ?>
- <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
- <!-- 标签库的配置信息 -->
- <description>自定义标签库</description>
- <tlib-version>1.1</tlib-version>
- <short-name>ct</short-name>
- <uri>http://nokiaguy.blogjava.net</uri><taglib>
- <!-- random标签的配置信息 -->
- <tag>
- <description>产生一个指定范围的随机数</description>
- <name>random</name>
- <tag-class>chapter1.RandomTag</tag-class>
- <body-content>empty</body-content>
- <attribute>
- <name>min</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- </attribute>
- <attribute>
- <name>max</name>
Java_JSP自定义标签的开发与应用的更多相关文章
- JavaWeb 自定义标签库开发传统标签
自定义标签主要用于移除Jsp页面中的java代码. 移除jsp页面中的java代码,只需要完成两个步骤: 编写一个实现Tag接口的Java类,并覆盖doStartTag方法,把jsp页面中的java代 ...
- JSP 自定义标签的开发流程
1.编写一个实现Tag接口的标签处理器类 package cn.itcast.web.tag; import java.io.IOException; import javax.servlet.htt ...
- JSP进阶 之 SimpleTagSupport 开发自定义标签
绝大部分 Java 领域的 MVC 框架,例如 Struts.Spring MVC.JSF 等,主要由两部分组成:控制器组件和视图组件.其中视图组件主要由大量功能丰富的标签库充当.对于大部分开发者而言 ...
- Java Web开发技术教程入门-自定义标签
回顾: 昨天了解了JSP开发的两种模式Model1和Model2模式.Model1采用JSP+JavaBean技术开发Web应用,它比较适合小规模应用的开发,效率较高,易于实现.但由于在Model1中 ...
- 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例
EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service ...
- JavaWeb之 JSP:自定义标签
当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 自定义标签 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的 ...
- JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用
1.标签 以类似于html标签的方式实现的java代码的封装. 第一:形成了开发标签的技术标准---自定义标签的技术标准. 第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl, ...
- JSP自定义标签库
总所周知,JSP自定义标签库,主要是为了去掉JSP页面中的JAVA语句 此处以格式化输出时间戳为指定日期格式为例,简单介绍下JSP自定义标签的过程. 编写标签处理类(可继承自javax.servlet ...
- JavaWeb之 JSP:自定义标签的创建和使用
当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的java类, ...
随机推荐
- 洛谷P1411 砝码称重
传送门啦 这个题总体思路就是先搜索在 $ dp $ void dfs(int keep,int now){ //使用 放弃 if(now > m) return; //已经放弃超过m个了,就退出 ...
- 嵌入式 探讨父子线程、进程终止顺序不同产生的结果_skdkjxy_新浪博客
嵌入式 探讨父子线程.进程终止顺序不同产生的结果 Linux下编程,线程.进程退出顺序问题纷纷扰扰,如果父进程/线程先于子进程/线程终止,系统会做什么处理呢?反之,如果子进程/线程先于父进程/线 程终 ...
- MySQL学习笔记:set autocommit=0和start transaction
在MySQL中,接触事务的例子比较少,今晚在一个简单的存储过程中,循环插入50000条id数据的时候,得知必须开事务,如果逐提交数据,将会导致速度异常的慢. SET autocommit = 0; ...
- CI框架整合UEditor编辑器上传功能
最近项目中要使用到富文本编辑器,选用了功能强大的UEditor,接下来就来讲讲UEditor编辑器的上传功能整合. 本文UEditor版本:ueditor1_4_3_utf8_php版本 第一步:部署 ...
- iOS图片缓存
iOS的内存管理始终是开发者面临的大问题,内存占用过大时,很容易会被系统kill掉,开发者需要尽可能的优化内存占用问题. 现在的App界面做的越来越精致,里面集成了大量的图片,笔者首先想到的就是如何减 ...
- abp zero 4.3 发布
Demo URL: http://abpzerodemo.demo.aspnetzero.com Username: systemPassword: 123456 需要源码,请加QQ:3833-255 ...
- 【LOJ】#2052. 「HNOI2016」矿区
题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...
- 【LOJ】#2046. 「CQOI2016」路由表
题解 题面太长无法阅读系列-- 这里说的选择改变指的是在下面区间里碰上了一个更长的可匹配的地址,如果可匹配但是匹配长度没有当前的值大,那么不算改变 我们建一个可持久化的trie,查询的时候先在前\(a ...
- PCA(Principal Component Analysis)主成分分析
PCA的数学原理(非常值得阅读)!!!! PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可 ...
- 关于linux时间
时区确定cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 查看硬件时间hwclock --show 将系统时间写入硬件时间hwclock --sy ...