| 
         
     
     | 
     | 
    
  
    | 
    Taglib原理和实现之循环的Tag | 
   
  
     | 
   
  
     | 
   
  
    | 
     作者:未知  来源:月光软件站  加入时间:2005-2-28 月光软件站  | 
   
  
    
 摘自久久学院 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  |   
 
  
 
  | 
   
  
     | 
   
  
     相关文章:相关软件:  | 
   
   
      |