您的位置:首页 > 编程语言 > Java开发

【JavaWeb探究】自定义JSP标签(二)

2015-09-29 15:36 525 查看
     上篇博客我们已经介绍了自定义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标签,下篇博客见!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  自定义JSP标签