`
igogogo9
  • 浏览: 250877 次
  • 性别: Icon_minigender_1
  • 来自: 海口市
社区版块
存档分类
最新评论

Taglib原理和实现之循环的Tag

阅读更多
1、问题:在request里的 People 对象,有个属性叫 men ,men 是一个Collection ,有许多个man 。现在,把 collection里的man的名字都显示出来。

  显然,这是一个嵌套Tag的问题。有三个Tag互相作用:最外层的Tag找到People对象,中间的Tag取得Collection,子Tag负责打印。

  例如:

<diego:withObject value="${people}">
 <diego:withCollection property="men">
  <diego:elementout property="name"/>
 </diego:withCollection>
</diego:withObject>

  思路如下:

  1) 编写WithObjectTag,负责从El表达式中取得对象

  2) 编写WithCollectionTag,负责从对象中取得 Collection ,遍历 Collection ,每遍历一次 Collection ,执行一次body

  3) 编写ElementoutTag ,把 Collection 中每个men对象的 name 打印出来

  2. 完整程序如下:

  在上例的diegoyun.vo包内,编写 People 类

package diegoyun.vo;
import java.util.Collection;
public class People
{
 private Collection men = null;
 public Collection getMen()
 {
  return men;
 }
 public void setMen(Collection men)
 {
  this.men = men;
 }
}

  编写 withObject ,这是从request里取得People对象的最外层Tag

package diegoyun;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
public class WithObjectTag extends BodyTagSupport
{
 private Object value = null;

 public Object getValue()
 {
  return value;
 }
 public void setValue(Object value)throws JspException
 {
  this.value = ExpressionEvaluatorManager.evaluate("value", value.toString(), Object.class, this, pageContext);
 }
 public int doStartTag()
 {
  return EVAL_BODY_INCLUDE;
 }
 public int doEndTag()throws JspException
 {
  return EVAL_PAGE;
 }


  编写WithCollectionTag,该Tag负责取得Collection,并遍历执行子Tag

package diegoyun;

import java.util.Collection;
import java.util.Iterator;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

import org.apache.commons.beanutils.PropertyUtils;

public class WithCollectionTag extends BodyTagSupport {
 private Object element = null;

 private Collection list = null;

 private Iterator iterator = null;

 public Object getElement() {
  return element;
 }

 public void setProperty(String property) throws JspException {
  //取得父Tag对象,并且得到Collection
  WithObjectTag parent = (WithObjectTag) getParent();
  if (parent == null)
   throw new JspException("parent tag is null");
   try {
    Object propertyValue = PropertyUtils.getProperty(parent.getValue(),property);
    this.list = (Collection) propertyValue;
    if (list == null)
     throw new JspException("Collection is null");
   } catch (Exception e) {
    throw new JspException(e);
  }
 }

 public int doStartTag() throws JspException {
  //设置第一个元素,然后执行子Tag
  iterator = list.iterator();
  if (iterator.hasNext())
   element = iterator.next();
   return EVAL_BODY_INCLUDE;
 }

 public int doAfterBody() {
  if (iterator.hasNext()) {
   //如果还存在子元素,设置子元素,并且再次执行子Tag
   //循环由此而来
   //否则不再执行子Tag
   element = iterator.next();
   return EVAL_BODY_AGAIN;
  }
  else
   return EVAL_PAGE;
 }
}

  编写 ElementOutputTag

package diegoyun;
import java.io.IOException;

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

import org.apache.commons.beanutils.PropertyUtils;

public class ElementOutputTag extends TagSupport
{
 private Object propertyValue = null;
 public void setProperty(String property)throws JspException
 {
  WithCollectionTag parent = (WithCollectionTag)getParent();
  if(parent == null)
   throw new JspException("parent tag is null");
  try
  {
   //判断上层tag中是否存在该属性名称,如果存在,取得属性值,否则报错
   propertyValue = PropertyUtils.getProperty(parent.getElement(), property);
  }
  catch (Exception e)
  {
   throw new JspException(e);
  }
 }
 public int doEndTag()throws JspException
 {
  try
  {
   //简单的把值打印到jsp页面
   pageContext.getOut().print(propertyValue);
  }
  catch (IOException e)
  {
   throw new JspException(e);
  }
  return EVAL_PAGE;
 }
}

  编写tld

<!--WithObjectTag-->
<tag>
 <name>withObject</name>
 <tag-class>diegoyun.WithObjectTag</tag-class>
 <body-content>JSP</body-content>
 <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
 </attribute>
</tag>
<!--WithCollectionTag-->
<tag>
 <name>withCollection</name>
 <tag-class>diegoyun.WithCollectionTag</tag-class>
 <body-content>JSP</body-content>
 <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
 </attribute>
</tag>
<!--ElementOutputTag-->
<tag>
 <name>elementout</name>
 <tag-class>diegoyun.ElementOutputTag</tag-class>
 <body-content>empty</body-content>
 <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
 </attribute>
</tag>

  编写jsp

<%@ page language="java" %>
<%@ page import="diegoyun.vo.*"%>
<%@ page import="java.util.*"%>
<%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%>

<html>
<body bgcolor="#FFFFFF">
<%
 Collection c = new ArrayList();

 Man man1 = new Man();
 man1.setName("diego");
 c.add(man1);

 Man man2 = new Man();
 man2.setName("Zidane");
 c.add(man2);

 Man man3 = new Man();
 man3.setName("Rui");
 c.add(man3);

 People p =new People();
 p.setMen(c);
 request.setAttribute("people",p);
%>
Test loop tag:
<br>
<diego:withObject value="${people}">
<diego:withCollection property="men">
<diego:elementout property="name"/>
<br>
</diego:withCollection>
</diego:withObject>
</body>
</html>

  运行,则可以看到: 

Test loop tag:
diego
Zidane
Rui  
分享到:
评论

相关推荐

    JSP taglib 精讲

    ### JSP taglib 精讲 #### TagLib 基础 TagLib,即标记库,是JSP(Java Server Pages)中的一个重要概念。...TagLib的核心思想在于将...理解并掌握taglib的基本原理和技术细节,对于从事JSP开发的技术人员来说至关重要。

    pager-taglib使用指南 .txt

    `pager-taglib` 是一个用于实现网页分页功能的 JSP 标签库。该标签库提供了一系列的标签来帮助开发者简化分页逻辑的编写过程,使其能够更加高效地展示数据列表。 #### 二、基本原理与配置 `pager-taglib` 的核心...

    Noka-tag_java_tanknnn_jsp_

    《Noka-tag:Java JSP标签库的深度解析与应用》 在Web开发领域,Java Server...开发者可以通过学习和理解Noka-tag的工作原理,提升开发效率,同时也能更好地理解和掌握JSP标签库的使用,从而在Web开发领域更上一层楼。

    jsp标签库(详细)

    2. **找到与之对应的tag处理类**:这是实现自定义标签功能的关键部分,存储于应用的WEB-INF目录。 3. **tag标签的类型**:包括无属性标签、有属性标签、有体内容的标签、定义了脚本变量的标签以及具有协作关系的标签...

    struts_tag

    自定义标签的实现通常包括标签处理类(Tag Handler)和标签库描述符(TLD)两部分。 **7. 源码分析** 对于想要深入了解Struts标签库的开发者,可以研究其源码。Struts的源码提供了一个学习MVC模式和JSP标签实现的好...

    jsp 自定义标签 供自学时用

    ### JSP自定义标签详解 #### 一、引言 JSP (Java Server Pages) 是一种基于Java的技术,...通过学习和实践自定义标签的创建和使用,开发者可以更好地理解和掌握 JSP 的核心原理,为后续的 Web 开发奠定坚实的基础。

    自定义JSTL标签java项目文件

    通过学习和分析这些文件,开发者可以深入理解自定义JSTL标签的工作原理,并将其应用到自己的Java项目中,提升代码质量和开发效率。 总的来说,自定义JSTL标签是Java Web开发中的一个重要技巧,它将业务逻辑封装在...

    jstl1.2和standard1.1.2jar包

    例如,`<c:if>`、`<c:forEach>`等核心标签用于条件判断和循环,`<fmt:formatDate>`用于日期格式化。 **2. Standard1.1.2** Standard1.1.2是JSTL1.2的配套库,它实现了EL(Expression Language)表达式引擎,这是...

    jsp实现留言本代码

    3. `taglib指令`:引入自定义标签库,比如JSTL(JavaServer Pages Standard Tag Library)。 ### JSP脚本元素 1. `声明(Declarations)`:定义变量或方法,这些声明在Servlet类中作为成员变量和方法。 2. `脚本...

    JSTL 自定义标签

    在自定义标签的实现过程中,我们需要深入理解JSP和Servlet API,以及JSTL的工作原理。标签处理类中的`doStartTag()`和`doEndTag()`方法是处理标签的核心,它们会根据标签的逻辑执行相应的操作。同时,通过`...

    jsp购物车实现

    本篇文章将详细探讨如何利用JSP来设计和实现一个购物车程序。 一、JSP基本原理 JSP是Java EE平台的一部分,它允许开发人员将HTML代码与Java代码混合编写,从而在服务器端生成动态内容。JSP页面在服务器上被编译为...

    JSP课后作业 很全。

    JSP页面由HTML或XML标签和嵌入的Java代码组成,包括脚本元素(scriptlet、expression、declaration)、指令(page、include、taglib)以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library...

    java自定义分页标签

    2. 编写标签处理类:在`PaginationTag.java`中,我们需要实现`javax.servlet.jsp.tagext.TagSupport`接口。这个类负责处理标签的逻辑,如计算总页数、获取当前页数据等。例如: ```java public class PaginationTag...

    jsp大学教程代码

    根据提供的信息,我们可以总结出以下关于“jsp大学教程代码”的...需要注意的是,随着技术的发展,目前Struts 2 和 Spring MVC 等框架已经成为了主流选择,但对于学习JSP和Struts 1 的基本原理仍然具有很高的参考价值。

    jstl-1.1.2.jar(及源码)、standard-1.1.2.jar(及源码)

    **JSTL(JavaServer Pages Standard Tag Library)与Standard库** JSTL是JavaServer Pages标准标签库,它提供了一套用于处理常见JSP任务的标签,如迭代、条件判断、XML处理等,旨在减少在JSP页面中使用Java脚本的量...

    Web开发——jstl标签真分页实战

    JavaServer Pages Standard Tag Library (JSTL) 是一套为简化JSP页面开发而设计的标准标签库。它提供了一系列预定义标签来执行常见任务,比如条件判断、循环、数据库操作等。通过使用JSTL标签,开发者可以在JSP页面...

    由浅到深详细讲解JSP自定义标签

    ### JSP自定义标签详解 #### 一、基本概念 ##### 1、标签(Tag) 在JSP技术中,标签(Tag)是一种特殊的XML元素。...通过深入了解其原理和实践应用,开发者可以更好地利用这项技术来构建高质量的应用程序。

    JSP程序开发范例宝典书籍中第九章中的源代码及资料

    5. **JSTL(JavaServer Pages Standard Tag Library)**:一种标准标签库,包含多种用于处理常见任务的标签,如XML处理、数据库操作、条件语句和循环。 6. **Servlet与JSP交互**:讲解如何通过HTTPServlet与JSP配合...

    JSP课程目录

    - 使用scriptlet进行条件判断和循环控制 2. **JSP声明和脚本片段** - 声明全局变量和方法 - 在JSP中编写Java代码片段 3. **JSP指令** - page指令 - include指令 - taglib指令 ### 第三部分:JSP动作标签 1...

Global site tag (gtag.js) - Google Analytics