webber

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  11 Posts :: 2 Stories :: 3 Comments :: 0 Trackbacks
实现自定义标签按如下步骤进行:
(1)开发自定义标签处理类;
(2)建立一个*.tld 文件,每个*.tld 文件对应一个标签库,每个标签库对应多个标签;
(3)在web.xml文件中增加自定义标签的定义;
(4)在JSP 文件中使用自定义标签。
一、开发自定义标签处理类
自定义标签类都必须继承一个父类: java.Servlet.jsp.tagext.TagSupport 。除此之外,自定义标签类还有如下要求。
·如果标签类包含属性,每个属性都有对应的getter 和setter 方法。
·重写doStartTag()或doEndTag()方法,这两个方法生成页面内容。
·如果需要在销毁标签之前完成资源回收,则重写re1ease()方法。
下面提供了一个最简单的标签代码:
Java代码
  1. import java.io.IOException;   
  2. import javax.servlet.jsp.JspTagException;   
  3. import javax.servlet.jsp.tagext.TagSupport;   
  4.   
  5. //标签处理类,继承TagSupport 父类   
  6. publicclass HelloWorldTag extends TagSupport {   
  7.     // 重写doEndTag方法,该方法在标签结束生成页面内容   
  8.     publicint doEndTag() throws JspTagException {   
  9.         try {   
  10.             // 获取页面输出流,并输出字符串   
  11.              pageContext.getOut().write("Hello World");   
  12.          }   
  13.         // 捕捉异常   
  14.         catch (IOException ex) {   
  15.             // 抛出新异常   
  16.             thrownew JspTagException("错误");   
  17.          }   
  18.         //返回值   
  19.         return EVAL_PAGE;   
  20.      }   
  21. }  
import java.io.IOException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
//标签处理类,继承TagSupport 父类
public class HelloWorldTag extends TagSupport {
// 重写doEndTag方法,该方法在标签结束生成页面内容
public int doEndTag() throws JspTagException {
try {
// 获取页面输出流,并输出字符串
pageContext.getOut().write("Hello World");
}
// 捕捉异常
catch (IOException ex) {
// 抛出新异常
throw new JspTagException("错误");
}
//返回值
return EVAL_PAGE;
}
}


这是个非常简单的标签,它只在页面中生成一个"Hello World" 的字符串。该标签没有属性,因此无须提供setter 和getter 方法;此外,该标签无须初始化资源,因此无须重写init 方法;在标签结束时无须回收资源,因此无须重写destroy 方法。

二、建立TLD 文件
Xml代码
  1. <?xmlversion="I.O"encoding="ISO-8859-1"?>  
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems,Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_l_2.dtd">  
  3. <taglib>  
  4.     <!--定义标签库版本-->  
  5.     <tlib-version>1.0</tlib-version>  
  6.     <!--定义JSP 版本-->  
  7.     <jsp-version>1.2</jsp-version>  
  8.     <!--配置第一个标签-->  
  9.     <tag>  
  10.         <!--配置标签名-->  
  11.         <name>helloworld</name>  
  12.         <!--确定标签的处理类-->  
  13.         <tag-class>mytag.HelloWorldTag</tag-class>  
  14.         <!--确定标签的标签体,标签体为空-->  
  15.         <body-content>empty</body-content>  
  16.     </tag>  
  17. </taglib>  
<?xml version="I.O" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems,Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_l_2.dtd">
<taglib>
<!--定义标签库版本-->
<tlib-version>1.0</tlib-version>
<!--定义JSP 版本-->
<jsp-version>1.2</jsp-version>
<!--配置第一个标签-->
<tag>
<!--配置标签名-->
<name>helloworld</name>
<!--确定标签的处理类-->
<tag-class>mytag.HelloWorldTag</tag-class>
<!--确定标签的标签体,标签体为空-->
<body-content>empty</body-content>
</tag>
</taglib>

这个标签库配置文件非常简单,没有标签体及标签属性等。只是一个空标签。

三、在web.xml 文件中增加标签库定义
在web.xml 文件中定义标签库时使用taglib 元素,该元素包含两个子元素: taglib-uri
和taglib-location,前者确定标签库的URI; 后者确定标签库定义文件的位置。下面是web.xml 文件中关于test.tld 标签库的定义片段:
Xml代码
  1. <!--定义标签库-->  
  2. <taglib>  
  3.     <!--确定标签库的URI-->  
  4.     <taglib-uri>/tags/tldtest.tld</taglib-uri>  
  5.     <!--确定标签库定义文件的位置-->  
  6.     <taglib-location>/WEB-INF/tldtest.tld</taglib-location>  
  7. </taglib>  
<!--定义标签库-->
<taglib>
<!--确定标签库的URI-->
<taglib-uri>/tags/tldtest.tld</taglib-uri>
<!--确定标签库定义文件的位置-->
<taglib-location>/WEB-INF/tldtest.tld</taglib-location>
</taglib>
如果需要使用多个标签库,只需要增加多个taglib 元素即可,因为每个taglib 元素可对应一个标签库。

四、使用标签库
(1)导入标签库:使用taglib 编译指令导入标签。
(2)使用标签:在JSP 页面中使用自定义标签。
taglib 的语法格式如下:
Jsp代码
  1. <%@ taglib uri= "tagliburi" prefix="tagPrefix" %>  
其中uri 属性确定标签库定义文件的URI,这个URI 就是在web.xml 文件中为标签库定义的URI。而prefix 属性确定的是标签前缀,即在JSP 页面中使用标签时,该标签库负责处理的标签前缀。
使用标签的语法格式如下:
<tagPrefix : tagName tagAttribute=ntagValue n ...>
<tagBody/>
</tagPrefix>
如果该标签没有标签体,则可以使用如下语法格式:
<tagPrefix : tagName tagAttribute=ntagValue n .../>

五、带属性的标签
带属性的标签必须为每个属性提供对应的setter 和getter 方法。其TLD配置如下:
Xml代码
  1. <?xmlversion="I.O"encoding="ISO-8859-1"?>  
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems,Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_l_2.dtd">  
  3. <taglib>  
  4.     <!--定义标签库版本-->  
  5.     <tlib-version>1.0</tlib-version>  
  6.     <!--定义JSP 版本-->  
  7.     <jsp-version>1.2</jsp-version>  
  8.     <!--配置第一个标签-->  
  9.     <tag>  
  10.         <!--配置标签名-->  
  11.         <name>query</name>  
  12.         <!--确定标签的处理类-->  
  13.         <tag-class>mytag.QueryTag</tag-class>  
  14.         <!--确定标签的标签体,标签体为空-->  
  15.         <body-content>empty</body-content>  
  16.         <!--配置标签属性: driver-->  
  17.         <attribute>  
  18.         <name>driver</name>  
  19.         <required>true</required>  
  20.         <rtexprvalue>true</rtexprvalue>  
  21.         </attribute>  
  22.         <!--配置标签属性: url -->  
  23.         <attribute>  
  24.         <name>url</name>  
  25.         <required>true</required>  
  26.         <rtexprvalue>true</rtexprvalue>  
  27.         </attribute>  
  28.     </tag>  
  29. </taglib>  
<?xml version="I.O" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems,Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_l_2.dtd">
<taglib>
<!--定义标签库版本-->
<tlib-version>1.0</tlib-version>
<!--定义JSP 版本-->
<jsp-version>1.2</jsp-version>
<!--配置第一个标签-->
<tag>
<!--配置标签名-->
<name>query</name>
<!--确定标签的处理类-->
<tag-class>mytag.QueryTag</tag-class>
<!--确定标签的标签体,标签体为空-->
<body-content>empty</body-content>
<!--配置标签属性: driver-->
<attribute>
<name>driver</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!--配置标签属性: url -->
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>


页面中引用如下:
Jsp代码
  1. <%@ taglib uri="/tags/tldtest.tld" prefix="mytag" %>   
  2. <mytag:query driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/j2ee"/>  
<%@ taglib uri="/tags/tldtest.tld" prefix="mytag" %>
<mytag:query driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/j2ee"/>


六、带标签体的标签

带标签体的标签,就是允许在标签内嵌套标签,通常可用于完成一些逻辑运算例如判断和循环等。
带标签体的标签需要继承BodyTagSupport,该类包含一个bodyContent 属性,该属性代表标签体。
BodyTagSupport 还包含两个方法。
• doAfterBodyO: 每次处理完标签体后调用该方法。
• void doInitBodyO: 开始调用标签体时调用该方法。

在处理标签类的各个方法中,不同的返回值对应不同的含义,常用的返回值有如下
几个。
• SKIP_BODY: 不处理标签体,直接调用doEndTag()方法。
• SKIP_PAGE: 忽略标签后面的JSP 页面。
• EVAL_PAGE: 处理标签结束,直接处理页面内容。
• EVAL_BODY_BUFFERED: 处理标签体。
• EVAL_BODY_INCLUDE: 处理标签体,但忽略setBodyContent()和doInitBody()方法。
• EVAL_BODY_AGAIN: 对标签体循环处理。
posted on 2009-12-30 15:16 webber 阅读(386) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: