[03-01] JSP自定义标签


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>

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();
    }
}

以上通过继承得到了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>

使用效果:
 
 
posted @ 2018-01-30 15:38  Dulk  阅读(250)  评论(0编辑  收藏  举报