zoukankan      html  css  js  c++  java
  • [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>

    使用效果:
     
     
  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/deng-cc/p/8385299.html
Copyright © 2011-2022 走看看