2012-01-21 12 views
35

पर एकाधिक सबमिट बटन मैं एक फॉर्म में 2 सबमिट बटन पोस्ट करने की कोशिश कर रहा हूं, प्रत्येक बटन एक्शन विभिन्न नियंत्रकों के लिए मैप किया गया है।स्प्रिंग एमवीसी - एक फॉर्म

<input type="submit" name="save" class="button" value="Save" /> 
<input type="submit" name="renew" class="button" value="Renew" /> 

तुम मेरे मानचित्रण से, मैं अलग करने के लिए क्या बटन पर क्लिक किया गया पैरामीटर के उपयोग पर निर्भर कर रहा हूँ देख सकते हैं - यहाँ मेरी मैपिंग

@RequestMapping(value="/save", method=RequestMethod.POST, params="save") 
@RequestMapping(value="/save", method=RequestMethod.POST, params="renew") 

और मेरे प्रस्तुत बटन इन की तरह लग रहे हैं। ,

java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8090/myapp/save': {public java.lang.String com.myapp.SaveController.save(MyEntity,javax.servlet.http.HttpSession), public java.lang.String com.myapp.SaveController.saveAndRenew(MyEntity,javax.servlet.http.HttpSession)} 
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:248) 
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:194) 

अजीब जब ऐसा होता है और मैं पेज फिर से जमा कर सब कुछ ठीक बाद में काम करता है, - समस्या यह है कि यह समय के 90% काम करता है, लेकिन कभी कभी मैं नीचे अपवाद है। क्या मैं जो करने की कोशिश कर रहा हूं उसे हासिल करने का एक बेहतर तरीका है?

धन्यवाद! यदि प्रपत्र इन बटनों निर्दिष्ट किया है

@RequestMapping(value="/save", method=RequestMethod.POST) 
public String handlePost(@RequestParam String action){ 

    if(action.equals("save")){ 
     //handle save 
    } 
    else if(action.equals("renew")){ 
     //handle renew 
    } 

} 
+1

यकीन है कि अगर इसकी आपकी समस्या नहीं है, लेकिन यह ध्यान रखें उपयोगकर्ता प्रपत्र सबमिट करता है, तो कुछ ब्राउज़रों अभ्यस्त किसी भी बटन के मुख्य/मान जोड़े भेज बटन पर क्लिक करने के अलावा एंटर कुंजी या कुछ अन्य तरीकों के माध्यम से। इसलिए, एक डिफ़ॉल्ट कार्रवाई मानना ​​सुनिश्चित करें, जो कि ब्राउज़र संगतता के लिए उस फ़ॉर्म के HTML स्रोत में * पहले बटन * की कार्रवाई करने की आवश्यकता है। – goat

उत्तर

6

बस एक विधि के साथ एक नियंत्रक इस

@RequestMapping(value="/save", method=RequestMethod.POST) 
public String handlePost(@RequestParam(required=false , value = "save") String saveFlag , @RequestParam(required=false , value = "renew") String renewFlag){ 

if(saveFlag != null{ 
    //handle save 
} 
else if(renewFlag !=null{ 
    //handle renew 
} 

} 
32

क्यों नहीं के समान बनाने के

input type="submit" class="button" name="save" value="Save" 
input type="submit" class="button" name="delete" value="Delete" 
input type="submit" class="button" name="cancel" value="Cancel" 

आप एक नियंत्रक के साथ दबाए गए बटन के अनुसार विभिन्न यूआरएल अनुरोध को निर्देशित कर सकते हैं।

बटन को रद्द करने के लिए

,

@RequestMapping(params = "cancel", method = RequestMethod.POST) 
public String cancelUpdateUser(HttpServletRequest request) { 
    return "redirect:/users.html"; 
} 

क्या अनुरोध मानचित्रण करता पोस्ट अनुरोध स्कैन करने के लिए अगर यह पैरामीटर का नाम शामिल है = रद्द है।

बटन को बचाने के लिए

,

@RequestMapping(params = "save", method = RequestMethod.POST) 
public String saveUser(HttpServletRequest request, @ModelAttribute User user, BindingResult result, SessionStatus status) { 
    // validate your result 
    // if no errors, save it and redirect to successView. 
} 
+7

थोड़ा खतरनाक लगता है, क्योंकि 'इनपुट' टैग पर 'मान' विशेषता में बटन का टेक्स्ट होता है। मुझे लगता है कि i18n इस विधि के साथ आपका मित्र नहीं होगा। –

+0

मुझे आईई (10) के साथ समस्याएं लगातार पोस्ट नहीं कर रही थीं, और आपके दृष्टिकोण को अपनाया था। जबकि अल्ट्रा-क्लीन नहीं, यह मेरे लिए काम करता था। चीयर्स। –

34

:

<input type="submit" name="action" value="save" /> 

और उसके बाद:

9

आप एक ही @RequestMapping कि केवल params विशेषता में अलग है के साथ और अधिक नियंत्रक तरीकों है, तो आप स्पष्ट रूप से लिखने के लिए है:

  • जो पैरामीटर माना जाता है अनुरोध में उपस्थित, उदाहरण के लिए params="save"
  • अनुरोध में कौन सा पैरामीटर मौजूद नहीं होना चाहिए, उदा। params="!save"

आपका मामले में:

@RequestMapping(value="/save", method=RequestMethod.POST, params={"save", "!renew"}) 
@RequestMapping(value="/save", method=RequestMethod.POST, params={"renew", "!save"}) 

यह त्रुटि अस्पष्ट हैंडलर HTTP पथ के लिए मैप किया तरीकों ठीक करना चाहिए ...

देखें Spring Web API 4.0.x - RequestMapping#params

1

एक और समाधान:

@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"}) 
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"}) 
संबंधित मुद्दे