Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16503078
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:14:59

下载本文示例代码
  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   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 下载本文示例代码


Taglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的TagTaglib原理和实现之循环的Tag
阅读(95) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~