1、自定义标签的概念

目前我们在JSP中使用的标签都是HTML的标签,浏览器会自动解析运行,例如<form action=""></form>,这里的form就是标签名称,action即form标签的属性,而<form></form>之间的内容,我们称之为标签体。

而自定义标签,就是可以根据需求,自己定义的标签,不论是标签的名字,属性,还是作用等等。使用自定义标签,可以把很多重复的代码或相似的功能封装起来,在JSP中就可以直接以标签使用,使JSP文件结构简练,可读性强,可维护性也强。

2、自定义标签的基本组成

自定义标签分为两个部分:
  • *.tld :(taglib descriptor)这是一个xml格式的文件,用来定义标签名称、属性、标签处理类、标签体等
  • *.class :每个标签会有对应的处理类,这个类要遵守一定的规范(继承或实现API中特定类或接口,覆盖方法)

也即是说,自定义标签的功能无非还是使用Java类来实现的,不过Java代码不再直接写到JSP中,而是用Java类实现,在JSP则以更简练的标签进行调用,以达到复用。

3、自定义标签的实例

下面实现这样一个简单的自定义标签,功能是:获取一个请求范围的属性的值并显示,如果该值为空,则显示字符串”该值不存在“。

3.1 创建tld文件

tld文件就是一个xml格式的文件,不过里面需要符合一些tld的格式规范,具体的可以参考《tld格式规范》,也可以下载相关的dtd(DTD可定义合法xml文档构建模块,定义文档结构,详情参考DTD简介)。

按照格式在tld文件中进行标签描述之后,需要将该tld文件存放在WEB-INF目录下:
<?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"
version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <display-name>Demo Tag</display-name>
<tlib-version>1.0</tlib-version>
<short-name>d</short-name>
<!--资源定位符,并不一定真实存在的路径,保持唯一即可-->
<uri>/dulk/learn/demo/taglib</uri> <!--tag,开始标签描述,可以设置多个-->
<tag>
<!--标签描述-->
<description><![CDATA[演示自定义标签]]></description>
<!--标签名称-->
<name>printAttr</name>
<!--标签处理类-->
<tag-class>dulk.learn.demo.PrintAttrHandler</tag-class>
<!--标签体的内容-->
<body-content>empty</body-content>
<!--开始标签属性描述,可以设置多个-->
<attribute>
<!--属性描述-->
<description><![CDATA[需要显示的请求中的属性名称]]></description>
<!--属性名称-->
<name>attr</name>
<!--属性必需性-->
<required>true</required>
<!--runtime expression value 运行期表达式的值,即是否可以传表达式,变量-->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> </taglib>
37
 
1
<?xml version="1.0" encoding="UTF-8"?>  
2

3
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
4
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
        version="2.0"
6
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
7

8
    <display-name>Demo Tag</display-name>
9
    <tlib-version>1.0</tlib-version>
10
    <short-name>d</short-name>
11
    <!--资源定位符,并不一定真实存在的路径,保持唯一即可-->
12
    <uri>/dulk/learn/demo/taglib</uri>
13

14
    <!--tag,开始标签描述,可以设置多个-->
15
    <tag>
16
        <!--标签描述-->
17
        <description><![CDATA[演示自定义标签]]></description>
18
        <!--标签名称-->
19
        <name>printAttr</name>
20
        <!--标签处理类-->
21
        <tag-class>dulk.learn.demo.PrintAttrHandler</tag-class>
22
        <!--标签体的内容-->
23
        <body-content>empty</body-content>
24
        <!--开始标签属性描述,可以设置多个-->
25
        <attribute>
26
            <!--属性描述-->
27
            <description><![CDATA[需要显示的请求中的属性名称]]></description>
28
            <!--属性名称-->
29
            <name>attr</name>
30
            <!--属性必需性-->
31
            <required>true</required>
32
            <!--runtime expression value 运行期表达式的值,即是否可以传表达式,变量-->
33
            <rtexprvalue>true</rtexprvalue>
34
        </attribute>
35
    </tag>
36

37
</taglib>

3.2 创建标签处理器类

标签的处理器类必须继承或实现API中的类,覆盖特定的方法,这里有很多种方式可以实现,示例中采用继承TagSupport类的方法,并覆盖其中的doStartTag方法。

处理器类还必须满足条件:tld文件中包含的属性,该类中必须提供同名属性,并拥有setXxx方法用以属性注入
public class PrintAttrHandler extends TagSupport {
//声明与tld文件中对应的属性
private String attr; //属性提供set方法
public void setAttr(String attr) {
this.attr = attr;
} //覆盖父类方法,实现标签功能
@Override
public int doStartTag() throws JspException {
//使用从父类继承到的pageContext对象,可以获取请求/会话/上下文等关键对象
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
JspWriter jspOut = pageContext.getOut();
String value = request.getParameter(attr) == null ? "该值不存在" : request.getParameter(attr);
try {
jspOut.println(value);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
}
24
 
1
public class PrintAttrHandler extends TagSupport {
2
    //声明与tld文件中对应的属性
3
    private String attr;
4

5
    //属性提供set方法
6
    public void setAttr(String attr) {
7
        this.attr = attr;
8
    }
9

10
    //覆盖父类方法,实现标签功能
11
    @Override
12
    public int doStartTag() throws JspException {
13
        //使用从父类继承到的pageContext对象,可以获取请求/会话/上下文等关键对象
14
        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
15
        JspWriter jspOut = pageContext.getOut();
16
        String value = request.getParameter(attr) == null ? "该值不存在" : request.getParameter(attr);
17
        try {
18
            jspOut.println(value);
19
        } catch (IOException e) {
20
            e.printStackTrace();
21
        }
22
        return super.doStartTag();
23
    }
24
}

以上通过继承得到了pageContext对象,我们能通过这个对象进而获取到其他内置对象进行使用。

3.3 使用实例

<%@page pageEncoding="utf-8" %>
<!--标签引入-->
<%@taglib uri="/dulk/learn/demo/taglib" prefix="dulk"%>
<html>
<body>
<h2>Hello World!</h2> <!--标签使用-->
request中author属性的值为:<dulk:printAttr attr="author"/> </body>
</html>
x
 
1
<%@page pageEncoding="utf-8" %>
2
<!--标签引入-->
3
<%@taglib uri="/dulk/learn/demo/taglib" prefix="dulk"%>
4
<html>
5
<body>
6
<h2>Hello World!</h2>
7

8
<!--标签使用-->
9
request中author属性的值为:<dulk:printAttr attr="author"/>
10

11
</body>
12
</html>

使用效果:
 
 

[03-01] JSP自定义标签的更多相关文章

  1. 一个简单的jsp自定义标签

    学到了一个简单的jsp自定义标签,后面有更多的例子,会更新出来: 例子1: 步骤: 1.编写标签实现类: 继承javax.servlet.jsp.tagext.SimpleTagSupport; 重写 ...

  2. jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题

    jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...

  3. java JSP自定义标签

    来至: http://blog.csdn.net/jiangwei0910410003/article/details/23915373 http://blog.csdn.net/jiangwei09 ...

  4. Rhythmk 一步一步学 JAVA(7): jsp 自定义标签

    1.实现Tag接口: TagSupport类实现了Tag接口,为我们提供了4个重要的方法(见表6-5). 1.1. TagSupport类中的常用方法           int doStartTag ...

  5. JSP 自定义标签

    0 标签技术的API继承体系 1 作用 jsp自定义标签用于移除页面中的java代码 2 实现 2.1 标签处理类ViewIPTag.java package com.zsm.util; import ...

  6. JSP自定义标签开发入门

    一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...

  7. jsp自定义标签分析

    jsp自定义标签的优势体现在于jsp页面上面减少了java代码. jsp自定义标签有三大部分组成,首先是类继承TagSupport,实现doStartTag方法. public int doStart ...

  8. JSP自定义标签库

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

  9. JSP自定义标签配置

    JSP自定义标签配置 JSP自定义标签 <taglib>         <taglib-uri>/WEB-INF/you.tld</taglib-uri>     ...

  10. JSP自定义标签开发入门《转》

    JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; ...

随机推荐

  1. JS模拟实现数组的map方法

    昨天使用map方法的时候,突然感觉一直在直接用,也没有试试是怎么实现的,本来想直接搜一篇文章盘一下子,结果没搜到合适的,好吧,那就自己来写一下子吧 今天就来实现一个简单的map方法 首先我们来看一下m ...

  2. 前端开发面试题-CSS(转载)

    本文由 本文的原作者markyun 收集总结. 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种, IE 盒子模型.W3C 盒子模型: (2)盒模型: 内容(conte ...

  3. Flume初入门简单配置与使用

    1.Flume在集群中扮演的角色 Flume.Kafka用来实时进行数据收集,Spark.Storm用来实时处理数据,impala用来实时查询. 2.Flume框架简介 1.1 Flume提供一个分布 ...

  4. Nginx 增加 Image 缩略图 功能

            Nginx 增加 Image 缩略图功能,需要使用Nginx Image 缩略图 模块     官网地址:https://github.com/3078825/ngx_image_th ...

  5. Clumsy 利用无线网卡结合Clumsy软件模拟弱网络测试

    利用无线网卡结合Clumsy软件模拟弱网络测试 by:授客 QQ:1033553122 实践环境 Clumsy 0.2 下载地址:http://jagt.github.io/clumsy/downlo ...

  6. 导入另一个 Git库到现有的Git库并保留提交记录

    在要合并到的目标git仓库,执行 "git pull  远程分支地址/本地git仓库根目录"

  7. [20180713]关于hash join 测试中一个疑问.txt

    [20180713]关于hash join 测试中一个疑问.txt --//上个星期做的测试,链接: http://blog.itpub.net/267265/viewspace-2157424/-- ...

  8. [20180627]truncate table的另类恢复.txt

    [20180627]truncate table的另类恢复.txt --//前几天看链接http://www.xifenfei.com/2018/06/truncate-table-recovery. ...

  9. python第七十六天--堡垒机完成

    堡垒机windows ,linux 都通过测试初始化说明: #进入根目录 1.初始化表结构 #python3 bin/start.py syncdb 2.创建堡垒机用户 #python3 bin/st ...

  10. python第四十九天--paramiko模块安装大作战

    准备开始学习:paramiko模块,发现这个模块十分难搞 安装不上 搞了半天,win10 64下 pytyon 3.6 的 paramiko模块 死活安不上,在网上不断的找资料,可是没有用,没有用啊 ...