现在的位置: 首页 > 综合 > 正文

自定义标签得介绍

2013年11月08日 ⁄ 综合 ⁄ 共 2851字 ⁄ 字号 评论关闭


1自定义标签可以降低 jsp 开发的复杂度和维护量,从 html 角度来说,可以使 html 不用去过多的关注那些比较复杂的商业逻辑(业务逻辑)。
利用自定义标签,可以软件开发人员和页面设计人员合理分工:页面设计人员可以把精力集中在使用标签(HTML,XML或者JSP)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面,如国际化等,从而提高了工程生产力
将具有共用特性的tag库应用于不同的项目中,体现了软件复用的思想。
2.什么是自定义标签
用户定义的一种自定义的jsp标记 。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为 标签处理类 的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后,实际上tag标签被转化为了对tag处理类的操作。

3传统标签和简单标签
开发自定义标签,其核心就是要编写处理器类,一个标签对应一个标签处理器类,而一个标签库则是很多标签处理器的集合。所有的标签处理器类都要实现 JspTag 接口,该接口中没有定义任何方法,主要作为 Tag 和 SimpleTag 接口的父接口。
在 JSP 2.0 以前,所有标签处理器类都必须实现 Tag 接口,这样的标签称为传统标签。
JSP 2.0 规范又定义了一种新的类型的标签,称为简单标签,其对应的处理器类要实现 SimpleTag 接口

5标签的形式
空标签:<hello/>
带有属性的空标签:
   <max num1=“3” num2=“5”/>
带有内容的标签:
  <greeting>
       hello
  </greeting>
带有内容和属性的标签:
 <greeting name=“Tom”>
       hello
  </greeting>

7自定义标签的开发与应用步骤
编写完成标签功能的 Java 类(标签处理器)
编写标签库描述(tld)文件,在tld文件中对自定义中进行描述
在 JSP 页面中导入和使用自定义标签
8SimpleTag 接口
setJspContext 方法:该方法把代表 JSP 页面的 pageContext 对象传递给标签处理器对象。
setParent 方法:该方法把父标签处理器对象传递给当前标签处理器对象
getParent 方法:该方法用于获得标签的父标签处理器对象
setJspBody 方法:该方法用于把代表标签体的 JspFragment 对象传递给标签处理器对象
doTag 方法:该方法用于完成所有的标签逻辑。该方法可以抛出 javax.servlet.jsp.SkipPageException 异常,用于通知 web 容器不再执行 JSP 页面中位于结束标记后面的内容。
9.ldt 编写过程如下:

<?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"
    xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
   
  <!-- 对当前的 tld 文件进行描述 --> 
  <description>--simpletag study--</description>
  <display-name>simpletag core</display-name>
  <tlib-version>0.1</tlib-version>
  <!--
   希望在 JSP 页面使用当前标签库时的前缀名:
   即 <%@ taglib prefix="itcast" uri="/WEB-INF/hellotag.tld" %> 中的 prefix
  -->
  <short-name>itcasttag</short-name>
  <!--
   对当前 tld 文件的唯一标识, 该名称必须和当前 web 应用中使用的其它标签库描述文件的
   uri 不能重复.
  -->
  <uri>http://www.itcast.cn/simpletag/core_1</uri>
 
  <!-- 描述自定义标签 -->
  <tag>
   <!-- 设置标签的名字, 该节点的文本值不能和其他标签的 name 文本值重复 -->
   <name>hellosimpletag</name>
   <!-- 设置当前自定义标签关联的标签处理器类 -->
   <tag-class>cn.itcast.javaweb.simpletag.TestSimpleTag</tag-class>
   <!-- 定义标签体内容类型, 可选值有 empty, scripless, dependant -->
   <body-content>empty</body-content>
  </tag>
 
  <!-- 描述自定义标签 -->
  <tag>
   <!-- 设置标签的名字, 该节点的文本值不能和其他标签的 name 文本值重复 -->
   <name>hellotag</name>
   <!-- 设置当前自定义标签关联的标签处理器类 -->
   <tag-class>cn.itcast.javaweb.simpletag.HelloWithInitParamTag</tag-class>
   <!-- 定义标签体内容类型, 可选值有 empty, scripless, dependant -->
   <body-content>empty</body-content>
  </tag>
 
  <!-- 描述自定义标签 -->
  <tag>
   <!-- 设置标签的名字, 该节点的文本值不能和其他标签的 name 文本值重复 -->
   <name>attributetag</name>
   <!-- 设置当前自定义标签关联的标签处理器类 -->
   <tag-class>cn.itcast.javaweb.simpletag.SimpleTagWithAttribute</tag-class>
   <!-- 定义标签体内容类型, 可选值有 empty, scripless, dependant -->
   <body-content>empty</body-content>
   
   <!-- 设置自定义标签的属性 -->
   <attribute>
    <!-- 配置属性的名字 -->
     <name>num</name>
     <!-- 该属性是否必须, 默认为 false -->
     <required>true</required>
     <!--
      该属性是否可以接受动态传入的值, 即是否可以为 el 或 jsp 表达式
      rtexprvalue: runtime expression value, 默认为 true
      -->
     <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

抱歉!评论已关闭.