2011-06-02 54 views
5

我正在使用大量使用Iterables(java.lang.Iterable)的API,但我無法直接在JSP頁面上使用它們,因爲JSTL標記和EL無法處理它們。現在,我正在將每個迭代器轉換爲列表,然後再渲染它們。如何在JSP頁面中使用Iterables?

什麼是最乾淨和最簡單的方法,使其工作沒有以前的轉換? 做最新的JSTL-Jasper-EL-taglibs-etc。版本支持它?我在哪裏可以找到這些信息?我沒有發現任何關於它谷歌搜索...

我知道我可以使用Iterable.iterator(),但我不能在JSP內部調用該方法,只能在我的控制器類中,這是非常有限的。

+0

你不能在你的jsp頁面的腳本里面使用iterable.iterator()嗎? – MLS 2011-06-02 09:40:11

+1

我寧願避免scriptlet,但無論如何,它是一個快速簡單的解決方案。 – 2011-06-08 10:52:18

回答

0

您可以實現自己的JSP標籤Java,所以你可以寫一個接受一個Iterable標籤,然後使用相同的方式,你會使用JSTL forEach標籤。

本文檔舉例說明了如何創建自定義標籤來迭代通過任意自定義對象 - 您的實現可能會更簡單。關鍵是要返回EVAL_BODY_AGAIN以允許您多次處理標籤的主體。

http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags6.html#68297

我還沒有試過運行此,但它可能是入手:

public class IterableForEachTag extends BodyTagSupport { 
    private static final long serialVersionUID = 1L; 
    private Iterable<?> iterable = null; 
    private Iterator<?> iterator = null; 
    private String var = null; 

    public int doStartTag() throws JspException { 
     if (iterator == null) { 
      iterator = iterable.iterator(); 
     } 
     if (iterator.hasNext()) { 
      Object element = iterator.next(); 
      pageContext.setAttribute(var, element); 
      return (EVAL_BODY_AGAIN); 
     } else 
      return (SKIP_BODY); 
    } 

    public int doAfterBody() throws JspException { 
     if (bodyContent != null) { 
      try { 
       JspWriter out = getPreviousOut(); 
       out.print(bodyContent.getString()); 
       bodyContent.clearBody(); 
      } catch (IOException e) { 
       throw new JspException(e); 
      } 
     } 
     if (iterator.hasNext()) { 
      Object element = iterator.next(); 
      pageContext.setAttribute(var, element); 
      return (EVAL_BODY_AGAIN); 
     } else { 
      return (SKIP_BODY); 
     } 
    } 

    public void setIterable(Iterable i) { 
     iterable = i; 
     iterator = null; 
    } 

    public void setVar(String v) { 
     var = v; 
    } 
} 
+0

看起來非常好。當我有一些時間時,我會嘗試。我接受它,因爲我認爲這是迄今爲止最好的解決方案。優雅,有點太多隻是迭代一個Iterable ...我希望它被集成在c:ForEach中 – 2011-06-08 10:59:28

0

您可以使用Iterables作爲關鍵字和它們的Iterators作爲值創建Map。然後,您應該能夠使用JSTL/EL在您的JSP中使用Iterables訪問Iterators

延伸閱讀:

1

要訪問EL表達式您Iterables的迭代器在你的JSTL標記,你可以使用Java代碼(在您的模型,控制器或服務層中)將Iterable對象包裝在類似Iter的實例中(看起來像這樣)(使用遵循Java bean方法名稱約定的簡單getter方法):

public class Iter<T> { 

    private final Iterable<T> iterable; 

    public Iter(Iterable<T> iterable) { 
     this.iterable = iterable; 
    } 

    public Iterator<T> getIterator() { 
     return iterable.iterator(); 
    } 
}