上篇博客我们已经介绍了自定义JSP标签的创建过程以及Servlet容器是如何处理自定义标签的,这篇博客我们从理论出发,从实践入手,继续介绍自定义JSP标签。
在开始之前,我要问一个问题,自己想过没有,为什么要使用自定义标签呢?我们现在所开发的系统中就运用到了自定义JSP标签,那么问一下自己,为什么要用自定义标签呢?自定义JSP标签是通过自定义标签实现类来实现复杂的、可重复利用的功能,它可以简化JSP页面,提高代码的复用性。比如,如果你的页面需要一个下拉框,但是这个下拉框是从字典表取值,正常的处理办法可能要每次都从字典表中去查询;如果采用自定义JSP标签的方式,就可以将这一系列的事统统放在JSP标签的实现类中来实现。
接下来,我们来手动创建一个自定义标签。这篇博客,我们先从简单的入手,创建一个简单的JSP标签,下篇博客我们再提高难度,创建一个下拉框的自定义标签。首先,按照我们上篇博客创建自定义标签的步骤,先创建一个处理自定义标签的处理类。
<span style="font-size:12px;">import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class MyTagTest extends TagSupport {
private String tagShow;
/**
* <p>Description:构造函数</p>
* @param tagShow
*/
public MyTagTest(String tagShow) {
super();
this.tagShow = tagShow;
}
/**
* 标签开始方法
*/
public int doStartTag() throws JspTagException{
return super.EVAL_BODY_INCLUDE;
}
/**
* 标签结束方法
*/
public int doEndTag() throws JspTagException{
JspWriter printOut = pageContext.getOut();
try{
System.out.println(printOut);
}catch (Exception e) {
e.printStackTrace();
}
return super.SKIP_BODY;
}
/**
* 释放资源
*/
public void release(){
super.release();
}
/*********************get/set方法****************************/
public String getTagShow() {
return tagShow;
}
public void setTagShow(String tagShow) {
this.tagShow = tagShow;
}
}</span>
我们可以看到实现类继承了TagSupport,TagSupport类的主要属性:
》》》1.parent属性:代表嵌套了当前标http://write.blog.csdn.net/postedit/48806519签的上层标签的处理类
》》》2.jsp容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量。
》》》3.在TagSupport的构造方法中不能访问pageContext成员变量,此时的JSP容器还没有调用setPageContext方法对pageContext进行初始化。
额外再说一点TagSupport的内容。TagSupport类提供了两个处理标签的方法
public int doStartTag() throws JspException
public int doEndTag() throws JspException
当JSP容器遇到自定义标签的起始标志时就会调用doStartTag()方法,该方法返回一个整数值,用来决定程序的后续流程。
A.Tag.SKIP_BODY:表示?>…之间的内容被忽略;
B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行。
但当JSP容器遇到自定义标签的结束标志时,就会调用doEndTag()方法,该方法也返回一个整数值,用来决定程序的后续流程。A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页。
说完了TagSupport,我想说一下上面处理类的成员变量。可能我们这个自定义标签的内容比较简单,不容易看出来,我不知道大家看出来没有,一般自定义标签有哪些自定义的属性,这些属性就作为成员变量出现在该标签的处理类中,并且跟上get/set方法。所以要创建一个自定义标签的处理类,要具备如下资源:
》》》1.必须要引入如下资源:
<span style="font-size:14px;">import javax.servlet.jsp.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;</span>
》》》2.要继承TagSupport类并覆盖doStartTag()和doEndTag()方法。
》》》3.从ServeltContext对象中获取java.util.Properties对象
》》》4.从Properties对象中获取key对应的属性值
》》》5.对获取的属性进行相应的处理并输出结果
接下来,继续创建一个xxx.tld文件。在WEB-INF下创建一个tlds文件夹,在该文件夹下创建一个myTagTest.tld文件。
<?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">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>hh</short-name>
<uri>/myTagTest</uri>
<info>自定义JSP标签</info>
<tag>
<description> Display hello </description>
<name>hello</name>
<tag-class>com.wdl.taglib.MyTagTest</tag-class>
<attribute>
<name>tagShow</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
然后在web.xml中配置taglib元素。
<taglib>
<taglib-uri>/MyTagTest</taglib-uri>
<taglib-location>/WEB-INF/tlds/myTagTest.tld</taglib-location>
</taglib>
最后,我们在页面中引用自定义标签。
<%@ taglib uri="/MyTagTest" prefix="hh"%>
<hh:hello showTag="Hello"/>
到最后,我们创建的自定义JSP标签就创建完成了,因为上篇文章对原理性的内容已经做过讲解,所以这里不再赘述。下篇博客我们继续创建一个自定义JSP标签,下篇博客见!