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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值