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>

    使用效果:
     
     
  • 相关阅读:
    java环境变量配置 win7/win8 java配置
    (JSON转换)String与JSONObject、JSONArray、JAVA对象和List 的相互转换
    (yum)更新yum报错:yum makecache: error: argument timer: invalid choice: 'fast' (choose from 'timer')
    (ElasticSearch)中文字符串精确搜索 term 搜不到结果
    (端口)打开阿里云服务组端口和防火墙端口
    (乱码)Spring Boot配置文件出现乱码解决方案
    (特殊字符)url中包含特殊字符导致请求报错的解决方案
    (端口占用)Windows 查看所有端口和PID
    (注释)IDEA快捷键注释不能自动对齐
    (JDK)oracle下载jdk需要注册?
  • 原文地址:https://www.cnblogs.com/deng-cc/p/8385299.html
Copyright © 2011-2022 走看看