2011-06-02 16 views
5

मैं एक एपीआई का उपयोग कर रहा हूं जो Iterables (java.lang.Iterable) का भारी उपयोग करता है, लेकिन मैं सीधे अपने जेएसपी पृष्ठों पर उनका उपयोग नहीं कर सकता क्योंकि जेएसटीएल टैग और ईएल उन्हें संसाधित नहीं कर सकता है। अभी, मैं उन्हें प्रतिपादन करने से पहले प्रत्येक पुनरावर्तनीय सूची में बदल रहा हूं।मैं अपने जेएसपी पृष्ठों में आईटेरबल्स के साथ कैसे काम कर सकता हूं?

पिछले परिवर्तनों के बिना इसे काम करने के लिए सबसे साफ और सरल दृष्टिकोण क्या होगा? नवीनतम जेएसटीएल-जैस्पर-ईएल-टैगलिब्स-आदि करें। संस्करण इसका समर्थन करते हैं? मुझे वह जानकारी कहां मिल सकती है? मुझे इसके बारे में कुछ भी नहीं मिला है ...

मुझे पता है कि मैं Iterable.iterator() का उपयोग कर सकता हूं, लेकिन मैं केवल उस विधि को जेएसपी के अंदर नहीं कह सकता, केवल मेरे नियंत्रक वर्ग में, और यह बहुत सीमित है ।

+0

आप ur jsp पेज पर स्क्रिप्टलेट के अंदर iterable.iterator() का उपयोग नहीं कर सकते? – MLS

+1

मैं स्क्रिप्टलेट से परहेज करना पसंद करूंगा, लेकिन वैसे भी, यह निश्चित रूप से एक तेज़ और सरल समाधान है। –

उत्तर

0

आप, जावा में अपने स्वयं के JSP टैग क्रियान्वित ताकि आप एक टैग है कि एक 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 फिर से शुरू करने के लिए थोड़ा बहुत ... मेरी इच्छा है कि यह सी में एकीकृत किया गया था: ForEach –

0

आप Map को अपने Iterables के साथ एक कुंजी के रूप में और Iterators के रूप में मूल्य के रूप में बना सकते हैं। फिर आप जेएसटीएल/ईएल का उपयोग कर अपने जेएसपी में अपने Iterables का उपयोग करके Iterators तक पहुंचने में सक्षम होना चाहिए।

अतिरिक्त पठन:

1

अपने JSTL टैग में ईएल भाव में अपने Iterables की iterators पहुंचने के लिए, आप कर सकते थे जावा कोड (अपने मॉडल, कंट्रोलर या सर्विस लेयर में) का उपयोग करें जो आपके इटेबल ऑब्जेक्ट्स को क्लास इटर के उदाहरणों में लपेटता है जो इस तरह दिखता है (जावा बीन्स विधि नाम सम्मेलन का पालन करने वाली एक साधारण गेटर विधि के साथ):

public class Iter<T> { 

    private final Iterable<T> iterable; 

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

    public Iterator<T> getIterator() { 
     return iterable.iterator(); 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे