2011-12-14 13 views
6

के लिए जेएसपी में प्रदर्शन जानकारी संदेश मेरे पास चयनित विषयों की सूची वाला एक मॉडल है। प्रत्येक विषय को कमरे में प्रस्तुत किया जा सकता है और उपलब्धता के आधार पर और अधिक कमरे चुनने की आवश्यकता है। उपयोगकर्ता प्रस्तुत करने के लिए पसंदीदा कमरा सेट कर सकते हैं। यदि यह अनुपलब्ध है, लेकिन कुछ अन्य उपलब्ध है, तो चयनित समय पर एक सूचना संदेश होना चाहिए कि कमरा बदल गया है। की तरह कुछ:स्प्रिंग वेबफ्लो 2.0

<form:errors path="selectedTopics[${loop.index}].room" /> 

पाश ग में एक varStatus विशेषता है: foreach टैग
मैं इस तरह messageContext में संदेश जोड़ने: अगर मैं उन्हें जोड़ने

MessageContext messages = context.getMessageContext(); 
String source= "selectedTopics[" + i + "].room"; 
messages.addMessage(new MessageBuilder().info() 
      .source(source) 
      .code("topic.room.changed") 
      .build()); 

त्रुटि टैग काम करता है त्रुटियों के रूप में, लेकिन वे त्रुटियां नहीं हैं। क्या कोई तरीका है कि मैं उन सूचना संदेशों को त्रुटियों की तरह एक सुरुचिपूर्ण तरीके से प्रदर्शित कर सकता हूं?

उत्तर

5

DefaultMessageContext से मैंने देखा कि सभी संदेशों को जो सरणी पर पाशन मैं क्षेत्र के लिए संदेश जो वर्तमान में प्रदर्शित हो रहा है पा सकते हैं द्वारा संदेश संदर्भ में और अधिक संदेश की एक सरणी देता है के लिए एक गेटर है कि वहाँ:

<c:forEach var="topic" items="${model.selectedTopics}" varStatus="loop"> 
    //omitted displaying of topic details 
    <c:forEach items="${flowRequestContext.messageContext.allMessages}" var="message"> 
    <c:set var="msgSrc" value="selectedTopics[${loop.index}].room"></c:set> 
    <c:if test="${message.source eq msgSrc}"> 
     <c:if test="${message.severity eq 'INFO'}"> 
      <span class="infoText">${message.text}</span> 
     </c:if> 
    </c:if> 
    </c:forEach> 
</c:forEach> 

लेकिन इस तरह सभी संदेशों पर पुनरावृत्ति हर क्षेत्र के लिए किया जाता है जिसे प्रस्तुत किया जाना है और यदि आपके पास बहुत सारे क्षेत्र हैं, तो यह धीमा हो सकता है।

संदेश संदर्भ में संदेशों के मानचित्र को प्राप्त करने के लिए यह एक और तरीका प्राप्त किया जा सकता है। यहाँ संदर्भ jsp में outputed का एक नमूना है, मैं इस्तेमाल किया $ {flowRequestContext.messageContext}:

[[email protected] sourceMessages = map[[null] -> list[[empty]], 'selectedTopics[2].room' -> list[[[email protected] source = 'selectedTopics[2].room', severity = INFO, text = 'Room changed from ALU1-M1 to ALU1-M2']], 'selectedTopics[4].room' -> list[[[email protected] source = 'selectedTopics[4].room', severity = INFO, text = 'Room changed from ALU1-M1 to ALU2-M1']]]] 

वहाँ एक नक्शा है sourceMessages है कि एक क्षेत्र के लिए सभी संदेशों को एक के रूप में स्रोत के साथ प्राप्त किया जा सकता है रखती है कुंजी। लेकिन समस्या यह है कि कार्यान्वयन org.springframework.binding.message.DefaultMessageContext में मानचित्र के लिए कोई गेटर नहीं है। हालांकि, एक विधि है MessagesBySource (java.lang.Object स्रोत) जो निर्दिष्ट स्रोत के लिए संदेशों की एक सरणी देता है। तो हम ईएल अभिव्यक्ति में इसका उपयोग कर सकते हैं।

महत्वपूर्ण! ईएल में पासिंग विधि तर्क केवल ईएल स्पेक द्वारा ईएल स्पेक में समर्थित है। ईएल 2.2 डिफ़ॉल्ट रूप से सर्वलेट 3.0/जेएसपी 2.2 कंटेनरों में भेज दिया गया है। JSTL or JSP 2.0 EL for getter with argument

तो अब जानकारी के साथ प्रदर्शित किया जा सकता देखें:

<c:forEach var="message" items="${flowRequestContext.messageContext.getMessagesBySource(msgSrc)}"> 
    <c:if test="${message.severity eq 'INFO'}"> 
     <span class="info">${message.text}</span></td> 
    </c:if> 
</c:forEach> 

आप सर्वलेट 3.0 की तुलना में पिछले संस्करण का उपयोग करने की आवश्यकता है/JSP 2.2 कंटेनर से मुझे लगता है कि सबसे अच्छा तरीका है फिर से संगठित करने sourceMessages नक्शा है और दृश्य प्रस्तुत करने से पहले इसे फ्लैशस्कोप में डालें।

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