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. 【CSS学习】--- 文本样式

    一.前言 CSS文本属性可以定义文本的外观.通过文本属性,可以定义文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. CSS常用的文本属性目录: text-align 文本对齐属性 te ...

  2. python中文编码&json中文输出问题

    python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json 文件输出时,显示中文而非 un ...

  3. Web.config配置customErrors mode为Off后依然不显示具体错误的可能原因。

    有时候我们的网站程序在本地运行没有问题,但在上传到远程服务器后则报错.这就需要我们了解具体错误,但IIS默认只显示统一的运行时错误,想要知道具体错误就需要配置Web.config中customErro ...

  4. Python 再谈变量作用域与变量引用

    再谈变量作用域与变量引用 by:授客 QQ:1033553122 module3.py #!/usr/bin/env python # -*- coding:utf-8 -*-   __author_ ...

  5. ViewPager防止Fragment销毁以及取消Fragment的预加载

    存在的问题 1. 默认情况下,ViewPager会根据setOffscreenPageLimit()方法设置的大小,自动预加载2. 还是根据setOffscreenPageLimit()方法设置的大小 ...

  6. 【详细】【转】C#中理解委托和事件

    文章是很基础,但很实用,看了这篇文章,让我一下回到了2016年刚刚学委托的时候,故转之! 1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具 ...

  7. TypeError: __init__() missing 1 required positional argument: 'on_delete'

    报错的原因呢,就是在设计model时我弄了个外键,然后就报错了... 不难看出,它是想让我们在表与表关联时添加一个on_delete参数 解决办法: 如其所愿,加上on_delete=models.C ...

  8. Djanggo ORM操作

    Django ORM那些相关操作  一般操作 看专业的官网文档:https://docs.djangoproject.com/en/1.11/ref/models/querysets/,做专业的程序员 ...

  9. maven(七),本地仓库

    运行机制: 在pom.xml文件中添加依赖jar包时,首先会从本地仓库查找,如果本地仓库不存在,就从中央仓库下载到本地仓库,中央仓库是maven默认的远程仓库 仓库坐标 eclipse默认会在wind ...

  10. 在 Azure Resource Manager 模板中使用托管磁盘

    本文介绍使用 Azure Resource Manager 模板预配虚拟机时托管与非托管磁盘之间的差异. 这有助于将现有模板从使用非托管磁盘更新为使用托管磁盘. 我们将使用 101-vm-simple ...