2012-02-17 12 views
6

इस समय मैं स्प्रिंग एमवीसी 3.1 के साथ पोस्ट/रीडायरेक्ट/पैटर्न प्राप्त करने की कोशिश कर रहा हूं। मॉडल डेटा + सत्यापन त्रुटियों को संरक्षित और पुनर्प्राप्त करने का सही तरीका क्या है? मुझे पता है कि मैं अपने POST विधि में RedirectAttributes के साथ मॉडल और बाइंडिंग रीसेट को संरक्षित कर सकता हूं। लेकिन फ्लैश स्कोप से जीईटी विधि में उन्हें पुनर्प्राप्त करने का सही तरीका क्या है?पोस्ट/रीडायरेक्ट के साथ मॉडल स्थिति को संरक्षित करना/पैटर्न

@RequestMapping(value = "/user/create", method = RequestMethod.POST) 
public String doCreate(@ModelAttribute("user") @Valid User user, BindingResult result, RedirectAttributes rA){ 

    if(result.hasErrors()){ 
     rA.addFlashAttribute("result", result); 
     rA.addFlashAttribute("user", user); 

     return "redirect:/user"; 
    } 

    return "redirect:/user/success"; 
} 

और उपयोगकर्ता निर्माण प्रपत्र प्राप्त करने के लिए निम्नलिखित:

@RequestMapping(value = "/user", method = RequestMethod.GET) 
public ModelAndView showUserForm(@ModelAttribute("user") User user, ModelAndView model){ 

    model.addObject("user", user); 
    model.setViewName("userForm"); 

    return model; 
} 

यह मैं एक के मामले में दिए गए उपयोगकर्ता डेटा को सुरक्षित करने की अनुमति देता

मैं पोस्ट करने के लिए निम्नलिखित कर लिया है त्रुटि। लेकिन क्या त्रुटियों उबरने का सही तरीका (BindingResult) है मैं वसंत प्रपत्र टैग के साथ के रूप में उन्हें दिखाने के लिए करना चाहते हैं:?

<form:errors path="*" /> 

इसके अलावा यह कैसे से फ्लैश दायरे तक पहुँचने के लिए दिलचस्प हो जाएगा विधि प्राप्त करें?

उत्तर

3
public class BindingHandlerInterceptor extends HandlerInterceptorAdapter { 

    public static final String BINDING_RESULT_FLUSH_ATTRIBUTE_KEY = BindingHandlerInterceptor.class.getName() + ".flashBindingResult"; 

    private static final String METHOD_GET = "GET"; 
    private static final String METHOD_POST = "POST"; 


    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 


     if(METHOD_POST.equals(request.getMethod())) { 

      BindingResult bindingResult = getBindingResult(modelAndView); 

      FlashMap outFlash = RequestContextUtils.getOutputFlashMap(request); 

      if(bindingResult == null || ! bindingResult.hasErrors() || outFlash == null) { 
       return; 
      } 

      outFlash.put(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY, bindingResult); 

     } 

     Map<String, ?> inFlash = RequestContextUtils.getInputFlashMap(request); 

     if(METHOD_GET.equals(request.getMethod()) && inFlash != null && inFlash.containsKey(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY)) { 

      BindingResult flashBindingResult = (BindingResult)inFlash.get(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY); 

      if(flashBindingResult != null) { 

       BindingResult bindingResult = getBindingResult(modelAndView); 

       if(bindingResult == null) { 
        return; 
       } 

       bindingResult.addAllErrors(flashBindingResult); 

      } 

     } 

    } 

    public static BindingResult getBindingResult(ModelAndView modelAndView) { 

     if(modelAndView == null) { 
      return null; 
     } 

     for (Entry<String,?> key : modelAndView.getModel().entrySet()) { 
      if(key.getKey().startsWith(BindingResult.MODEL_KEY_PREFIX)) { 
       return (BindingResult)key.getValue(); 
      } 
     } 

     return null; 
    } 


} 
1

बाइंडिंग विफल होने के बाद आप अपडेट फॉर्म क्यों नहीं दिखाते हैं, तो उपयोगकर्ता फॉर्म को पुनः सबमिट करने का प्रयास कर सकता है?

इसके लिए मानक दृष्टिकोण POST हैंडलर विधि से अद्यतन फ़ॉर्म दृश्य को वापस करना प्रतीत होता है।

if (bindingResult.hasErrors()) { 
    uiModel.addAttribute("user", user); 
    return "user/create"; 
} 

फिर आप फ़ॉर्म के साथ त्रुटियों को प्रदर्शित कर सकते हैं: त्रुटियां टैग।

+5

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

0

क्या फ़्लैश गुंजाइश

से GET पद्धति में उन्हें उबरने का सही तरीका मुझे यकीन है कि मैं समझता हूँ कि आप उन्हें उबरने द्वारा क्या मतलब है नहीं कर रहा हूँ है। रीडायरेक्ट के बाद रीडायरेक्ट के बाद मॉडल में फ्लैश एट्रिब्यूट्स के रूप में आप जो जोड़ते हैं, वह मॉडल में होगा। इसके लिए कुछ खास नहीं है जिसे इसके लिए करने की ज़रूरत है। मैं इकट्ठा करता हूं कि आप कुछ और पूछने की कोशिश कर रहे हैं लेकिन मुझे यकीन नहीं है कि वह क्या है।

जैसा कि फ़ान ने बताया कि आप त्रुटि पर रीडायरेक्ट क्यों करते हैं? इसे संभालने का सामान्य तरीका सफलता पर पुनर्निर्देशित करना है।

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