`

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

正常执行JSP页面

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

 

分享到:
评论

相关推荐

    JSP标签库编程--简单标签库

    综上所述,JSP标签库编程是提升JSP应用开发效率的关键。通过创建简单的标签库,我们可以封装常用功能,使得代码更加模块化和易于维护。同时,理解和掌握标签库的原理和实践,对提升JSP开发技能至关重要。通过分析...

    jsp实用编程百例.rar_jsp_jsp编程

    - 实现自定义标签处理类:继承`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`。 6. **JSP与数据库交互** - JDBC(Java Database Connectivity):连接数据库,执行SQL语句...

    jsp 标签

    综上所述,JSP标签是构建动态网页的重要工具,它们简化了页面的编程模型,使得开发者可以更加专注于业务逻辑,而不是页面的呈现细节。了解和熟练掌握JSP标签的使用,对于提升Web应用开发效率和质量具有重要意义。

    JSP应用开发-自定义标签的使用.pptx

    - **定义标签处理类**:编写Java类,继承`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,根据标签是否有体来选择基类。 - **创建TLD文件**:定义标签的属性、行为和对应的...

    自定义JSP标签样例

    下面我们将深入探讨自定义JSP标签的原理、创建过程及其应用。 一、JSP标签基础知识 JSP标签分为两种类型:标准动作标签(Standard Actions)和自定义标签(Custom Tags)。标准动作标签如`&lt;jsp:include&gt;`、`&lt;jsp:...

    自定义JSP标签

    自定义JSP标签是Java服务器页面(JSP)技术中的一种高级特性,它允许开发者创建自己的可重用组件,以增强网页的可维护性和代码复用性。在JSP中,自定义标签与HTML标签类似,但它们可以执行更复杂的业务逻辑,提供了...

    javax.servlet---jsp-api jar包

    `Tag` 和 `TagSupport` 用于自定义JSP标签,扩展JSP的功能。 3. **使用场景**: 这些API广泛应用于企业级Web开发,尤其是在使用Java EE(Enterprise Edition)平台时。例如,你可以使用Servlet来处理HTTP请求,执行...

    jsp高级编程 (pdf)

    9. **自定义标签**:开发者可以通过实现Tag接口或TagSupport类来自定义JSP标签,增强代码复用性和可维护性。 10. **AJAX与JSP**:随着AJAX的流行,JSP也常常与AJAX技术结合,实现异步更新页面部分,提升用户体验。 ...

    JSP自定义标签.ppt

    3. 带标签体的标签:标签之间可以包含其他JSP标签、HTML或自定义标签的内容。 4. 可以被Scriptlet使用的标签:通过定义id和type属性,可以在标签后面的Scriptlet中引用。 在JSP技术中,自定义标签的处理类需要实现...

    权威实用jsp自定义标签demo<select,checkbox,radio>

    之后,我们就可以像使用内置JSP标签一样使用自定义标签: ```jsp ,green,blue" /&gt; 同意条款" /&gt; 男" /&gt; ``` 五、自定义标签的优势 1. **封装复杂逻辑**:自定义标签可以封装复杂的业务逻辑或视图渲染,使JSP页面...

    JSP 自定义标签(清华IT)PPT (适用于有一定编程基础的人员)

    而标签处理器则是Java类,实现了JSP标签的实际逻辑。当JSP容器遇到自定义标签时,会根据TLD文件找到相应的标签处理器并执行其中的方法。 创建自定义标签的步骤通常如下: 1. **编写标签处理器类**:这个类需要继承...

    掌握自定义JSP标签

    **自定义JSP标签**是JavaServer Pages (JSP)技术中的一个重要组成部分,它允许开发者创建可重用的、自定义的行为组件,以提高代码的复用性和可维护性。在传统的JSP开发中,我们通常使用JSP内置动作标签(如`&lt;jsp:...

    jsp高级编程

    - 开发者可以通过实现Tag接口或TagSupport类来自定义标签,封装复杂功能,提高代码复用性。 - TLD(Tag Library Descriptor)文件用于定义自定义标签的属性、事件和行为。 7. **MVC(Model-View-Controller)设计...

    JSP自定义标签:最近在项目中要用到这种技术,所以自己就写一个经典的HelloWorld实例

    标签处理程序类通常需要实现或扩展`javax.servlet.jsp.tagext.TagSupport`、`javax.servlet.jsp.tagext.SimpleTagSupport`或`javax.servlet.jsp.tagext.Tag`等接口,这些接口提供了处理标签生命周期的方法,比如`...

    JSP自定义标签动态属性支持

    TLD文件定义了标签的名称、属性、行为等元数据,而标签处理类则实现了这些行为,处理由JSP页面传递过来的参数和指令。 在描述中提到的"动态属性支持"是指,标签的属性不是静态固定的,而是可以在运行时根据需要动态...

    JSP高级编程(希望版)

    3. **自定义标签**:通过实现Tag接口或TagSupport类,可以创建自定义标签库,增强代码复用性。 4. **JSP 2.0及以上版本的特性**:如页面指令的简化、隐式对象、JSP动作的改进等,提高了开发效率。 本教程"JSP高级...

    JSP超全讲解(带书签).pdf

    - 通常需要继承`javax.servlet.jsp.tagext.SimpleTagSupport`或`javax.servlet.jsp.tagext.TagSupport`类。 7. **JSP是如何被执行的?执行效率比SERVLET低吗?** - JSP被编译成Servlet后执行,执行效率取决于多种...

    JSP高级编程

    总的来说,JSP高级编程涉及的内容不仅仅是编写简单的动态页面,还包括深入理解JSP的底层机制,掌握EL和JSTL的使用,学习自定义标签的开发,熟悉MVC设计模式,以及如何在Java EE框架下利用JSP与其他组件协同工作。...

    java+hibernate+jsp+tld+自定义标签分页

    1. **创建自定义标签**: 编写一个Java类作为自定义标签的实现,这个类需要继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,并覆盖其中的方法来处理分页逻辑。...

    jsp自定义标签实例

    在编写自定义标签时,我们需要创建一个Java类来处理标签逻辑,这个类通常会继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`。例如,我们可以创建一个名为`MyCustomTag`...

Global site tag (gtag.js) - Google Analytics