2009-04-07 10 views
6

जावा दुनिया में रेल अपडेट जैसे फ्लैश संदेश जैसे "अपडेट सफल" http://api.rubyonrails.org/classes/ActionController/Flash.html) प्राप्त करने का सबसे अच्छा तरीका क्या है? मैं वसंत एमवीसी का उपयोग कर रहा हूँ।जावा में रेल फ्लैश संदेश

उत्तर

5

मैं इसे कस्टम फ्लैशइटम ऑब्जेक्ट्स पर स्ट्रिंग कुंजियों के साथ मैपिंग के साथ सत्र-व्यापी हैशटेबल के रूप में कार्यान्वित करने की अनुशंसा करता हूं। FlashItem में केवल उस ऑब्जेक्ट या स्ट्रिंग को शामिल किया जाएगा जिसे आप स्टोर कर रहे हैं और साथ ही एक बूलियन मान, जिसे संभवतः IsNew कहा जाता है, जिसे जब आप हैशटेबल में कोई नया आइटम डालते हैं तो सत्य पर सेट किया जाना चाहिए।

प्रत्येक पृष्ठ पर लोड करने के बाद आप हैशटेबल को फिर से सेट करें, किसी भी ISNew = true आइटम्स को झूठी पर सेट करें, और किसी भी आइटम को हटाएं जहां IsNew पहले से ही गलत है। इससे आपको रेल की फ्लैश फीचर के समान काम मिलना चाहिए।

0

यदि आपने अपने वसंत जावा ऐप में बड़ी मात्रा में काम नहीं किया है, तो आप जर्बी पर चल रहे रेलों को देख सकते हैं। रेल पर jRuby चलने की सुंदरता यह है कि आप रूबी रत्न और जावा libs मिश्रण और मिलान कर सकते हैं।

यदि आप पहले से ही अपने आवेदन में उचित मात्रा में काम कर चुके हैं तो यह संभवतः एक विकल्प नहीं है।

+3

दुर्भाग्य से मैं काफी वसंत के लिए प्रतिबद्ध हूँ। – wachunga

6

मैंने बस किया है कि स्प्रिंग एमवीसी में सत्र बीन स्कॉप्ड किया गया है।

public class FlashImpl implements Flash, Serializable{ 

private static final long serialVersionUID = 1L; 

private static final String ERROR = "error"; 
private static final String WARNING = "warning"; 
private static final String NOTICE = "notice"; 

private String message; 
private String klass; 

public void message(String klass, String message) { 
    this.klass = klass; 
    this.message = message; 
} 

public void notice(String message) { 
    this.message(NOTICE, message); 
} 

public void warning(String message) { 
    this.message(WARNING, message); 
} 

public void error(String message) { 
    this.message(ERROR, message); 
} 

public boolean isEmptyMessage() { 
    return message == null; 
} 

public void clear() { 
    this.message = null; 
    this.klass = null; 
} 

public String getMessage() { 
    String msg = message; 
    this.clear(); 
    return msg; 
} 

public void setMessage(String message) { 
    this.message = message; 
} 

public String getKlass() { 
    return klass; 
} 

public void setKlass(String klass) { 
    this.klass = klass; 
}} 

यह चाल पहली बार पढ़ने के बाद संदेश को समाहित करने में है। इस तरह यह पोस्ट के बाद एक रीडायरेक्ट में जीवित रह सकता है।

मुझे लगता है कि अनुरोध के लिए केवल एक ही प्रकार का संदेश होगा! यदि आप यह नहीं चाहते हैं तो आप पहले से सुझाए गए एक हैशपैप बना सकते हैं।

मैं अपने नियंत्रकों में इस बीन को इंजेक्ट करता हूं (वास्तव में मैं इसे अन्य सभी द्वारा विरासत में बेस नियंत्रक में इंजेक्ट करता हूं)।

अपने JSP में आप इस तरह की कुछ कोड जोड़ने के लिए:

<c:if test="${!flash.emptyMessage}" > 
    <div class="${flash.klass}">${fn:escapeXml(flash.message)}</div> 
</c:if> 
2

मैं इस प्रकार वसंत MVC के साथ साथ Manolo सांटोस का उदाहरण उपयोग किया है: @Component साथ

एन्नोटेट फ्लैश वर्ग, और यह इंगित करने के लिए एक बूलियन चर जोड़ें कि संदेश को एक और अनुरोध के लिए जीना चाहिए या नहीं।

 

@Component 
public class Flash { 

    private static final String INFO = "info"; 
    private static final String SUCCESS = "success"; 
    private static final String ERROR = "error"; 
    private static final String WARNING = "warning"; 
    private static final String NOTICE = "notice"; 

    private final Map msgs = new HashMap(); 

    private boolean isKept; // keep msg for one more request (when the controller method redirects to another) 

    private void message(String severity, String message) { 
     msgs.put(message, severity); 
    } 

    public void info(String message) { 
     this.message(INFO, message); 
    } 

    public void success(String message) { 
     this.message(SUCCESS, message); 
    } 

    public void notice(String message) { 
     this.message(NOTICE, message); 
    } 

    public void warning(String message) { 
     this.message(WARNING, message); 
    } 

    public void error(String message) { 
     this.message(ERROR, message); 
    } 

    public boolean isEmptyMessage() { 
     return msgs.isEmpty(); 
    } 

    public void clear() { 
     msgs.clear(); 
     isKept = false; 
    } 

    public Map getMessage() { 
     return msgs; 
    } 

    public boolean isKept() { 
     return isKept; 
    } 

    public void keep() { 
     isKept = true; 
    } 

    public void unKeep() { 
     isKept = false; 
    } 
} 

मॉडल ऑब्जेक्ट में फ़्लैश संदेश जोड़ने के लिए एक इंटरसेप्टर का उपयोग करें।

 

public class FlashMessageInterceptor extends HandlerInterceptorAdapter { 

    @Resource 
    Flash flash; 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
     if (!flash.isKept()) { 
      modelAndView.addObject("flash", flash); 
     } 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
     if (flash.isKept()) { 
      flash.unKeep(); 
     } 
     else { 
      flash.clear(); 
     } 
    } 
} 

आपके नियंत्रक में, यदि आपके पास कोई तरीका है जो किसी अन्य विधि पर रीडायरेक्ट करता है तो आप बस कह सकते हैं; flush.keep(), फ़्लैश संदेश प्रदर्शित करने के लिए।

 

@Controller 
public class ComputerCampLove { 

    @Resource 
    private Flash flash; 

    @RequestMapping(method = RequestMethod.GET) 
    public String takeMeToAnotherPlace(Model model) { 

     flash.info("Fa-fa-fa!"); 
     flash.keep(); 

     return "redirect:somewhere"; 
    } 
} 
4

यह वसंत MVC 3.1.RC1 में जोड़ा गया है:

3.1.15 Flash Attributes and RedirectAttributes

फ्लैश अब विशेषताओं एक FlashMap में जमा हो जाती है और HTTP सत्र में बचाया एक रीडायरेक्ट जीवित रहने के लिए किया जा सकता है। स्प्रिंग एमवीसी में फ्लैश विशेषताओं के सामान्य समर्थन के अवलोकन के लिए Section 16.6, “Using flash attributes” देखें।

एनोटेटेड नियंत्रकों में, @RequestMapping विधि RedirectAttributes प्रकार की विधि तर्क घोषित करके फ़्लैश विशेषताओं को जोड़ सकती है। इस विधि तर्क का उपयोग अब रीडायरेक्ट परिदृश्य में उपयोग किए गए विशेषताओं पर सटीक नियंत्रण प्राप्त करने के लिए भी किया जा सकता है। अधिक जानकारी के लिए Section 16.3.3.10, “Specifying redirect and flash attributes” देखें।

(JIRA मुद्दा: SPR-6464)

+0

गंभीरता से, लेकिन यह देर से रास्ता है! – momomo

+0

बढ़िया! इसने यहां वर्णित मेरी समस्याओं का हल किया: http://stackoverflow.com/questions/11216550/how-should-i-send-resourcebundle-messages-across-controllers-in-spring-mvc – Tommy

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