第四篇 支持循環的Tag
1。問題:在request里的 People 對象,有個屬性叫 men ,men 是一個Collection ,有許多個man 。現在,把 collection里的man的名字都顯示出來
顯然,這是一個嵌套Tag的問題。有三個Tag互相作用:最外層的Tag找到People對象,中間的Tag取得Collection,子Tag負責打印。
例如:
<diego:withObject value="${people}">
<diego:withCollection <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
新聞熱點
疑難解答