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. Error running tomcatUnable to open debugger port (127.0.0.1 50181) java.net.B

    1.把tomcat删除,重新建一个,tomcat就会重新自动使用一个端口了 2.自己手动调一下端口 我用的是第二种,手动调了下,最开始的端口是:50181,该成了50182,就可以了.

  2. 通过webpack2从0开始配置自己的vue项目 1

    PS 阅读者需要node基础.webpack原理知识.vue基础 安装node 这个网上很多教程 打开终端 创建项目 npm init 全局安装: cnpm i webpack webpack-dev ...

  3. CSS之fontAwesome代替网页icon小图标

    引言 奥森图标(Font Awesome)提供丰富的矢量字体图标—通过CSS可以任意控制所有图标的大小 ,颜色,阴影. 网页小图标到处可见,如果一个网页都是干巴巴的文字和图片,而没有小图标,会显得非常 ...

  4. python之约束, 异常处理, md5

    1. 类的约束 1. 写一个父类. 父类中的某个方法要抛出一个异常 NotImplementedError (重点) 2. 抽象类和抽象方法 # 语法 # from abc import ABCMet ...

  5. map标签

    map和area 标签配合img标签制作分区超链接效果 http://www.w3school.com.cn/tiy/t.asp?f=html_areamap

  6. loadrunner 运行脚本-命令行运行脚本

    Loadrunner 运行脚本-命令行运行脚本   by:授客 QQ:1033553122 脚本所在目录 Run-time Settings->Additional Attributes设置   ...

  7. 利用奇异值分解(SVD)进行图像压缩-python实现

    首先要声明,图片的算法有很多,如JPEG算法,SVD对图片的压缩可能并不是最佳选择,这里主要说明SVD可以降维 相对于PAC(主成分分析),SVD(奇异值分解)对数据的列和行都进行了降维,左奇异矩阵可 ...

  8. Python之SGDRegressor

    实现: # -*- coding: UTF-8 -*- import numpy as npfrom sklearn.linear_model import SGDRegressor __author ...

  9. echars关系图

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  10. 谈谈程序猿求职简历的STAR法则

    最近Android/IOS的市场都有点躁动,前两天看业内几位大牛写的关于求职招聘的文章,觉得说的很有道理,暂且吸收进来,同时讲一下简历面试中使用STAR法则.我们在写简历或者面试时,最主要的一个目的, ...