日期:2014-05-16  浏览次数:20436 次

[jsp自定义标签2] jsp自定义标签属性和标签体

jsp自定义标签——添加标签属性


通过标签属性控制标签展示的样式,这使其目的之一。
[jsp自定义标签1] jsp自定义标签的处理过程

中介绍了最基础的自定义标签的开发流程。在此基础上我们添加自定义标签的属性:

?

第一步:调整tld文件,为标签定义属性名称和相应的参数。

?

<tag>
    	<name>helloTag2</name>
    	<tag-class>com.fox.mytag.HelloMyTag2</tag-class>
    	<body-content>empty</body-content>
    	<attribute>
    		<name>fontColor</name>
    		<required>false</required>
    	</attribute>
    	<attribute>
    		<name>fontSize</name>
    		<required>false</required>
    	</attribute>
    </tag>

?

?

第二步:调整handler类,为属性字段添加set、get方法。

?

package com.fox.mytag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
/**
 * 
 * @author huangfox
 * jsp自定义标签(标签属性)
 */
public class HelloMyTag2 extends TagSupport {
	
	private String fontSize = "14px" ;
	private String fontColor = "red" ;

	@Override
	public int doEndTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.print("do End Tag ");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.doEndTag();
	}

	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.print("<font color=\""+fontColor+"\" size=\""+fontSize+"\">hello!</font>");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}

	public String getFontSize() {
		return fontSize;
	}

	public void setFontSize(String fontSize) {
		this.fontSize = fontSize;
	}

	public String getFontColor() {
		return fontColor;
	}

	public void setFontColor(String fontColor) {
		this.fontColor = fontColor;
	}
	
	
	
}

?第三步:使用标签

?<f:helloTag2 fontColor="green" fontSize="30px"/>

?

------------------------------

?

自定义标签——添加标签体

要开发带标签体的标签,可实现BodyTag接口,也可从BodyTag接口的实现类BodyTagSupport继承,为简化开发,推荐从BodyTagSupport类继承开发。

?

编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:

doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(),

他们执行顺序如下:

doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()

doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,如果返回EVAL_BODY_ INCLUDE则继续执行;如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法。

setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,EV