2012-09-13 15 views
7

मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो ऐसा लगता है कि यह अपेक्षाकृत सरल और दीवार की थोड़ी सी में चल रहा है।जेएसपी अभिव्यक्तियां और गतिशील विशेषता नाम

मान लें कि मुझे उन उत्पादों की एक सूची मिली है जिन्हें मैं products नाम के तहत अनुरोध विशेषता के रूप में उजागर करता हूं। आइए यह भी कहें कि प्रत्येक उत्पाद में id फ़ील्ड है, और मेरे पास selectedProduct_<product-id> के रूप में सेट किए गए अनुरोध गुणों का समूह भी है, यह इंगित करने के लिए कि कौन से चुने गए हैं।

मैं समझता हूं कि इस जानकारी का प्रतिनिधित्व करने के बेहतर तरीके हैं, जैसे सभी चयनित आईडी को Map में डालकर और इसके खिलाफ जांच कर रहे हैं, लेकिन मान लीजिए कि मुझे किसी भी कारण से उस दृष्टिकोण तक पहुंच नहीं है।

तो मैं क्या करना चाहता हूं यह products है और केवल कुछ मार्कअप उत्सर्जित करें यदि वर्तमान उत्पाद के लिए selectedProduct_... विशेषता सेट है। कुछ की तरह:

<c:forEach var="product" items="${products}"> 
    <c:if test="${! empty selectedProduct_${product.id}}"> 
     <div class="productId">${product.id}</div> 
    </c:if> 
</c:forEach> 

लेकिन निश्चित है कि काम नहीं करता है, के रूप में यह ${! empty selectedProduct_${product.id}} पर मर जाता है की।

क्या काम करेंगे अगर मैं अभिव्यक्ति में उत्पाद आईडी को हार्डकोड है की तरह,: ...

${! empty selectedProduct_17}

यह सोचते हैं कि '17' एक मान्य उत्पाद आईडी है। जाहिर है कि यह व्यावहारिक नहीं है, लेकिन उम्मीद है कि यह दिखाता है कि मैं क्या करने की कोशिश कर रहा हूं। मूल रूप से मैं की जरूरत है:

  1. forEach पाश में प्रत्येक यात्रा के लिए उपयोग करने के लिए सही selectedProduct_... मूल्य निर्धारित करें। <c:set var="key" value="selectedProduct_${product.id}"/> जितना सरल होगा, सिवाय इसके कि मुझे यकीन नहीं है कि key कैसे लें और उस नाम के साथ अनुरोध विशेषता का मूल्य प्राप्त करने के लिए इसका उपयोग करें (<% %> ब्लॉक के अंदर शाब्दिक जावा कोड को धोखा देने और चलाने के बिना)।
  2. अनुरोध विशेषता का मान प्राप्त करें जिसका नाम मैंने # 1 में निर्धारित किया है। यह मुश्किल हिस्सा प्रतीत होता है।

क्या यह शुद्ध जेएसपी/जेएसटीएल का उपयोग कर संभव है? मुझे पता है कि मैं हल करने के लिए <% %> के अंदर कुछ जावा कोड चला सकता हूं, लेकिन ऐसा लगता है कि यह बहुत खराब रूप में होगा। निश्चित रूप से एक और सुरुचिपूर्ण समाधान मौजूद है?

उत्तर

17

आप कर सकते हैं implicit objects का उपयोग करके:

वहाँ वस्तुओं है कि स्कोप वस्तुओं का उपयोग करना में वर्णित विभिन्न दायरे वाले चर के उपयोग की अनुमति नहीं है।

  • pageScope: मानचित्र पेज-दायरे वाले उनके मूल्यों को चर नाम
  • requestScope: मानचित्र अनुरोध-दायरे वाले उनके मूल्यों को चर नाम
  • sessionScope: मानचित्र सत्र-दायरे उनके मूल्यों को चर नाम
  • applicationScope: मानचित्र आवेदन के उनके मूल्यों
एक अभिव्यक्ति नाम से इन वस्तुओं में से एक को संदर्भित जब करने के लिए चर नाम scoped, उचित वस्तु इसी विशेषता के बजाय दिया जाता है। उदाहरण के लिए, $ {pageContext} पेजकॉन्टेक्स्ट ऑब्जेक्ट देता है, भले ही कोई मौजूदा पृष्ठ कॉन्टेक्स्ट विशेषता है जिसमें कुछ अन्य मूल्य शामिल है।

तो, उदाहरण के लिए:

<c:set var="selectedProductAttrName" value="selectedProduct_${product.id}"/> 
${requestScope[selectedProductAttrName]} 
संबंधित मुद्दे