2012-01-21 15 views
35

Sto cercando di inviare 2 pulsanti di invio a un modulo, con ogni azione di pulsante associata a diversi controller. Qui sono i miei mappatureSpring MVC - Pulsante di invio multiplo a un modulo

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

E i miei bottoni presentare guardare come questi -

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

Come si può vedere dalla mia mappatura, sto contando sulla uso di params per differenziare ciò che il pulsante è stato cliccato. Il problema è che funziona il 90% del tempo, ma a volte ho l'eccezione qui sotto -

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) 

Stranamente, quando questo accade ed io pagina ri-presentare, tutto funziona bene in seguito. C'è un modo migliore per ottenere ciò che sto cercando di fare?

Grazie!

+1

non è sicuro se il tuo problema, ma di tenere presente alcuni browser solito inviare la coppia chiave/valore dei pulsanti se l'utente invia il modulo tramite tasto invio o altri metodi oltre a fare clic sul pulsante. Quindi, assicurati di assumere un'azione predefinita, che, per la compatibilità del browser, deve essere l'azione del * primo pulsante * nel sorgente html di quel modulo. – goat

risposta

6

Basta creare un regolatore con un metodo simile a questo

@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

Perché non:

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

e poi:

@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 
    } 

} 
+7

Sembra un po 'pericoloso, poiché l'attributo 'value' sul tag' input' contiene il testo del pulsante. Penso che i18n non sarà tuo amico con questo metodo. –

+0

Ho avuto problemi con IE (10) non pubblicare i valori in modo coerente e ho adottato il tuo approccio. Anche se non ultra pulito, ha funzionato per me. Saluti. –

34

se il modulo è questi pulsanti specificato:

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" 

si può indirizzare a richiesta url diversa in base al pulsante premuto con un controller.

per pulsante di annullamento,

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

quello mappatura richiesta non è quello di eseguire la scansione di richiesta POST se contiene il nome params = annullare.

per pulsante Salva,

@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. 
} 
9

Se si dispone di più metodi di controller con lo stesso @RequestMapping che differisce solo in attributo params, si deve scrivere in modo esplicito:

  • quale parametro dovrebbe essere presente nella richiesta, ad es params="save"
  • quale parametro NON deve essere presente nella richiesta, ad es. params="!save"

Nel tuo caso:

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

Questo dovrebbe risolvere l'errore metodi del gestore ambigui mappati per il percorso HTTP ...

Vedi Spring Web API 4.0.x - RequestMapping#params

1

Un'altra soluzione:

@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"}) 
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"}) 
Problemi correlati