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

来源:互联网 发布:dede直播源码网站 编辑:程序博客网 时间:2024/05/22 14:53

     上篇博客我们已经介绍了自定义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 JspExceptionpublic 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标签,下篇博客见!


0 0
原创粉丝点击