jsp标签编程『下』---TagSupport类

掌握基本的标签定义后,可以发现定义标签时都需要继承TagSupport这个类,TagSupport类是整个标签编程的一个核心类,此类定义如下:

public class TagSupport extends Objet implements IterationTag,Serizlizable

 它同时实现了IteratorTag和Serializable两个接口,IterationTag接口的定义如下:

public interface IterationTag extends Tag{
   public static final int EVAL_BODY_AGAIN;
   public int doAfterBody() throws JspException;
}

 IterationTag本身又是Tag接口的子接口,Tag接口定义如下:

public interface Tag extends JspTag{
   public static final int SKIP_BODY;
   public static final int EVAL_BODY_INCLUDE;
   public static final int SKIP_PAGE;
   public static final int EVAL_PAGE;
   public void setPageContext(PageContext pc);
   public void setParent(Tag t);
   public Tag getParent();
   public int doStartTag() throws JspException;
   public int doEndTag() throws JspException;
   public void release();
}

 TagSupport类中定义的常量及方法:

No常量及方法类型描述
1protected PageContext pageContext属性表示pageContext对象,可以操作4种属性范围
2public static final int SKIP_BODY常量忽略标签体内容,将操作转交给doEndTag()
3public static final int EVAL_BODY_INCLUDE常量正常执行标签体操作,但不处理任何运算
4public static final int SKIP_PAGE常量所在在JSP上的操作走将停止,会将所有输出的内容立刻显示在浏览器上
5public static final int EVAL_PAGE常量

正常执行JSP页面

6public static final int EVAL_BODY_AGAIN常量重复执行标签体内容,会再次调用doAfterBody(),直到出现SKIP_BODY为止
7public int doStartTag() throws JspException方法处理标签开始部分
8public int doEndTag() throws JspException方法处理标签结束部分
9public int doAfterBody() throws JspException方法处理标签主体部分
10public viod release()方法释放标签资源

 

doStartTag():此方法忽略标签开始时执行,返回值如下:

  • SKIP_BODY:表示忽略标签体的内容,而将执行权转交给doEndTag()方法;
  • EVAL_BODY_INCLUDE:表示执行标签体的内容;

doAfterBody():此方法是IterationTag接口于Tag接口的区别所在,用来重复执行标签体的内容,返回治如下:

  • SKIP_BODY:表示标签体内容会被忽略,并且将执行权交给doEndTag()方法;
  • EVAL_BODY_AGAIN:表示重复执行标签体的内容,会重复调用doAfterBody()方法,一直循环下去,直到doAfterBody()方法返回SKIP_BODY为止;

doEndTag():此方法在标签结束时执行,返回值如下:

  • SKIP_PAGE:表示jsp页面立刻停止执行,并将所有的输出立刻回传到浏览器上;
  • EVAL_PAGE:表示JSP可以正常地运行完毕;

release():将标签处理类所产生或是获得的资源全部释放,并等待用户下次继续使用;

 

实现一个有标签体的标签库:

演示一个包含方法体标签的开发,主要完成:判断在某一属性中是否存在指定的属性,如果存在,则进行输出。

AttributeTag:

package com.keith.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;

public class AttributeTag extends TagSupport {
	//接受属性名称
	private String name;
	//接受查找范围
	private String scope;

	@Override
	public int doStartTag() throws JspException {
		Object value = null;
		//是否是page范围
		if ("page".equals(this.scope)) {
			value = super.pageContext
					.getAttribute(name, PageContext.PAGE_SCOPE);
		} else if ("request".equals(this.scope)) {
			//是否是request范围
			value = super.pageContext.getAttribute(name,
					PageContext.REQUEST_SCOPE);
		} else if ("session".equals(this.scope)) {
			//是否是session范围
			value = super.pageContext.getAttribute(name,
					PageContext.SESSION_SCOPE);
		} else {
			//是否是application范围
			value = super.pageContext.getAttribute(name,
					PageContext.APPLICATION_SCOPE);
		}
		//如果没有查到属性
		if (value ==null) {
			//不执行标签体内容
			return TagSupport.SKIP_BODY;
		}else{
			//找到属性,执行标签题内容
			return TagSupport.EVAL_BODY_INCLUDE;
		}
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getScope() {
		return scope;
	}

	public void setScope(String scope) {
		this.scope = scope;
	}
}

 attributetag.tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
    <!-- 标签库的版本 -->
	<tlib-version>1.0</tlib-version>
	<!-- 为标签苦在TLD中的描述名称 -->
	<short-name>attributetag</short-name>
	<tag>
	<!-- 表示标签在JSP中的使用名称 -->
 		<name>present</name>
 		<!-- 表示这个标签所这项的Class -->
 		<tag-class>com.keith.tag.AttributeTag</tag-class>
		<!-- 标签体内容为空 -->
 		<body-content>JSP</body-content>
 		<attribute>
 		<!-- format为属性名 -->
 			<name>name</name>
 			<!-- 表示此值必须设置 -->
 			<required>true</required>
 			<!-- 表示属性值是请求时表达式的结果 -->
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>

 		<attribute>
 		<!-- format为属性名 -->
 			<name>scope</name>
 			<!-- 表示此值必须设置 -->
 			<required>true</required>
 			<!-- 表示属性值是请求时表达式的结果 -->
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
	</tag>
</taglib>

 web.xml:

    <taglib>
  		<taglib-uri>attribute</taglib-uri>
  		<taglib-location>/WEB-INF/attributetag.tld</taglib-location>
  </taglib>

 index.jsp:

<%@ taglib prefix="attributetag" uri="attribute"%>

  <body>
  	<hr />
  	<%
  		String scope = "session";
  		session.setAttribute("name","keith");
  	 %>
  	 
  	 <attributetag:present name="name" scope="<%=scope %>">
  	 	<%=scope %>范围内存在:"${sessionScope.name }"
  	 </attributetag:present>
  </body>
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值