2011-06-02 12 views
5

Iterables (java.lang.Iterable) yoğun kullanan bir API kullanıyorum, ancak JSTL etiketleri ve EL bunları işleyemediğinden bunları doğrudan JSP sayfalarında kullanamıyorum. Şu anda, yinelenen her birini, bunları oluşturmadan önce bir listeye dönüştürüyorum.JSP sayfalarında Iterables ile nasıl çalışabilirim?

Önceki dönüşümler olmadan çalışmasını sağlamak için en temiz ve en basit yaklaşım hangisiydi? En yeni JSTL-Jasper-EL-taglibs-etc yapın. sürümleri destekliyor mu? Bu bilgiyi nerede bulabilirim? Bunun hakkında bir şey bulamıyorum ...

Iterable.iterator() yöntemini kullanabileceğimi biliyorum, ancak bu yöntemi JSP içinde, yalnızca denetleyici sınıfımda arayamıyorum ve bu çok kısıtlayıcı. .

+0

ur jsp sayfasındaki iterable.iterator() komut dosyalarının içeriklerini kullanamazsınız? – MLS

+1

Komut dosyalarından kaçınmayı tercih ederim, ancak yine de, bu kesinlikle hızlı ve basit bir çözümdür. –

cevap

0

Sen Java kendi JSP etiketlerini uygulayabilirsiniz.

Bu belgede, isteğe bağlı bir özel nesne üzerinden yinelenen özel bir etiketin nasıl oluşturulduğuna dair bir örnek bulunmaktadır; bu, uygulamanızın daha kolay olacaktır. Anahtar, etiketin gövdesini birden çok kez işlemenizi sağlamak için EVAL_BODY_AGAIN döndürüyor.

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

Bunu çalışan denemedim ama başlangıç ​​için bir şey olabilir: Kendi JSTL etiketleri EL ifadelerde senin Iterables yineleyiciler erişmek için

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

Çok iyi görünüyor. Biraz zamanım olduğunda deneyeceğim. Kabul ediyorum, çünkü bence şimdiye kadarki en iyi çözüm. Zarif, sadece çok fazla yinelenen bir yineleme yapmak için biraz fazla ... Keşke c: entegre edilmiş olsaydı –

0

Iterables anahtarınız ile bir Map ve anahtar olarak Iterators değerleri oluşturabilirsiniz. Daha sonra Iterators, JPL/EL kullanarak JSP'nizde Iterables'u kullanarak erişebilmeniz gerekir.

fazla okuma: çok ilginç ve yazı düşündürücü

1

, yapabilirsin Iterable nesnelerini, bu gibi görünen bir sınıf Iter örneklerinde (Java çekirdekleri yöntem adı kuralını izleyen basit bir alıcı yöntemiyle) saran Java kodunu (modelinizde, denetleyicide veya hizmet katmanında) kullanın: