DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> Taglib原理和實現之循環的Tag
Taglib原理和實現之循環的Tag
編輯:XML詳解     
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
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved