2013-07-29 5 views
6

मैं स्प्रिंग एमवीसी सरल सीआरयूडी नियंत्रक के लिए एक सर्वोत्तम अभ्यास दृष्टिकोण खोजने की कोशिश कर रहा हूं। दोनों वेब पर हैं और इस मंच पर CRUD नियंत्रकों के उदाहरण के एक बहुत हैं, लेकिन उनमें से ज्यादातर एक से दो समस्याओं के पीड़ित:स्प्रिंग एमवीसी सीआरयूडी नियंत्रक सर्वश्रेष्ठ पेक्टिस

  1. बचत/या अपडेट करने या हटाने से वे संदेश मिलता है कि बचाने के लिए और अद्यतन दिखाने के बाद हुआ, लेकिन वे जिस यूआरएल पर मार रहे हैं, उसमें अभी भी "/ update/{id}" या "/ delete/{id}" है। यह "गलत" है, क्योंकि आमतौर पर दिखाई गई सामग्री वस्तुओं की एक सूची है।

या

  1. नियंत्रक "showAll" दृश्य पर रीडायरेक्ट, लेकिन फिर कोई संदेश है कि एक कार्रवाई जगह है, जो उपयोगकर्ता के अनुकूल नहीं है ले लिया है।

क्या किसी के पास क्रूड नियंत्रक का उदाहरण है जिसमें इन दो समस्याएं नहीं हैं?

धन्यवाद,

हेनरी

@Controller 
@RequestMapping(value="/role") 
public class RoleController { 
    private static final Logger log = Logger.getLogger(RoleController.class); 

    @Autowired 
    private RoleValidator validator = null; 
    @Autowired 
    private RoleService service = null; 


    public void setService(RoleService service) { 
     this.service = service; 
    } 

    public void setValidator(RoleValidator validator) { 
     this.validator = validator; 
    } 


    @RequestMapping(method=RequestMethod.GET) 
    public String showForm(ModelMap model){ 
     List<Role> domainObjectList = service.getRoles(); 
     model.addAttribute("domainObjectList", domainObjectList); 
     return "role"; 
    } 

    @RequestMapping(value="/add", method=RequestMethod.GET) 
    public String preAdd(ModelMap model){ 
     Role domainObject = new Role(); 
     model.addAttribute("domainObject", domainObject); 
     addConstrainedFields(model); 
     return "roleEdit"; 
    } 

    @RequestMapping(value="/add", method=RequestMethod.POST) 
    public ModelAndView add(@ModelAttribute(value="domainObject") Role domainObject, BindingResult result) { 
     validator.validate(domainObject, result); 
     ModelAndView mv = new ModelAndView("role"); 
     if(result.hasErrors()){ 
      mv = new ModelAndView("roleEdit"); 
      mv.addObject("domainObject", domainObject); 
      return mv; 
     } 
     service.insertRole(domainObject); 
     mv.addObject("domainObjectList", service.getRoles()); 
     mv.addObject("messageKey","label.form.item.added"); 
     //PROBLEM: the URL will remain "/add", but the content will be one of showing all roles + message that role was added. 
     return mv; 
    } 

    @RequestMapping(value="/update/{id}") 
    public String preUpdate(@PathVariable Integer id, ModelMap model) { 
     Role domainObject = service.getRole(id); 
     model.addAttribute("domainObject", domainObject); 
     return "roleEdit"; 
    } 


    @RequestMapping(value="/update", method=RequestMethod.POST) 
    public String update(@ModelAttribute(value="domainObject") Role domainObject, ModelMap model, BindingResult result){ 
     validator.validate(domainObject, result); 
     ModelAndView mv = new ModelAndView("role"); 
     if(result.hasErrors()){   
      model.addAttribute("domainObject", domainObject); 
      return "roleEdit"; 
     } 
     service.insertRole(domainObject); 
     model.addAttribute("messageKey","label.form.item.added"); 
     model.addAttribute("domainObjectList", service.getRoles()); 
     //PROBLEM: the message that the object was updated will be lost, but the URL will be /role and we will show all roles. 
     return "redirect:/role"; 
    } 

    @RequestMapping(value="/delete/{id}") 
    public String delete(@PathVariable Integer id, ModelMap model) { 
     Role domainObject = service.getRole(id); 
     if (domainObject == null) { 
      model.addAttribute("messageKey","label.form.item.notfound"); 
      return showForm(model); 
     } 
     service.deleteRole(domainObject); 
     model.addAttribute("messageKey","label.form.item.deleted"); 
     return showForm(model); 
    } 

    @RequestMapping(value="/delete", method=RequestMethod.POST) 
    public ModelAndView delete(@ModelAttribute(value="domainObject") Role domainObject, BindingResult result){ 
     validator.validate(domainObject, result); 
     ModelAndView mv = new ModelAndView("role"); 
     if(!result.hasErrors()){ 
      service.deleteRole(domainObject); 
      mv.addObject("messageKey","label.form.item.deleted"); 
      domainObject = new Role(); 
      mv.addObject("domainObject", domainObject); 
     } 
     mv.addObject("domainObjectList", service.getRoles()); 
     return mv; 
    } 

} 
+1

के बारे में क्या आप एक '/ हटाना/{आईडी}' यूआरएल बुलाने की पर '/ {आईडी}' URL हटाने के संचालन के लिए ResquestMethod.DELETE' का उपयोग 'और एक नया मॉडल मैप मान बजाय ?? अद्यतन के लिए वही, कि आप 'RequestMethod.PUT' –

+0

का उपयोग कर सकते हैं ठीक है, इन दो मामलों में आप या तो विधि निष्पादित करने के बाद URL में/{id} के साथ समाप्त हो जाएंगे (और आप बताए गए आउटपुट में संदेश जोड़ सकते हैं कि क्या हुआ) लेकिन आप ऑब्जेक्ट्स की सूची दिखाएंगे, या यदि आप अनुरोध को रीडायरेक्ट करेंगे, तो यूआरएल सही होगा (नहीं/{आईडी} (उदाहरण/5), लेकिन कार्रवाई के बारे में क्या हुआ? –

+0

समझें। और यदि आप नियंत्रक पर 'संदेश' की कुछ सूची के साथ '@ ModelAttribute' का उपयोग करते हैं और मॉडल को अपडेट करते हैं? इस दृष्टिकोण के साथ आप संदेश को मॉडल पर रखते हैं। यहां और [उदाहरण] (http://krams915.blogspot.com.br/2010 /12/spring-3-mvc-using-modelattribute-in.html) –

उत्तर

10
  1. आप RESTful यूआरएल डिजाइन का उपयोग करना चाहिए, और प्रयोग पढ़ने के लिए, बनाने के लिए पोस्ट, अद्यतन करने के लिए रखा मिलता है, और हटाने के लिए हटाएँ। उपयोगकर्ता एजेंटों के लिए HiddenHttpMethodFilter का उपयोग करें जो PUT या DELETE नहीं करते हैं।

  2. पुन: पोस्ट से बचने के लिए Post-Redirect-Get पैटर्न का उपयोग करें।

  3. बाद के पृष्ठों पर सफलता/विफलता संदेश दिखाने के लिए Flash Attributes का उपयोग करें।

+0

धन्यवाद, यही वह जवाब है जिसे मैं ढूंढ रहा था !! –

+0

+1 उत्कृष्ट अभ्यास। जिस तरह से पहला लिंक मर चुका है – abiieez

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