2012-01-21 16 views
35

Bir formda, her düğmenin eylemi farklı denetleyicilere eşlendiğinde, 2 gönderme düğmesinin gönderilmesini sağlamaya çalışıyorum.Spring MVC - Bir form için birden çok gönderme düğmesi

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

sen benim haritalama gelen, ben tıkladım ne düğmesine ayırt etmek params kullanımına dayanarak am görebileceğiniz gibi - İşte benim eşleştirmeleri

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

Ve teslim düğmeleri bu gibi bakmak vardır. Bu olduğunda, Garip

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) 

ve sayfayı yeniden gönderin herşey yolunda sonradan çalışıyor - bu zaman% 90 çalışır ama bazen aşağıda istisna almak sorundur. Yapmaya çalıştığım şeyi başarmanın daha iyi bir yolu var mı?

Teşekkürler! Form bu düğmeler belirtilmişse

@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

bu senin sorunun emin, ama akılda tutmak değil tuşunu veya tuşa basmanın yanında başka yöntemleri de girebilirsiniz. Bu nedenle, tarayıcı uyumluluğunun bu formun html kaynağındaki * ilk düğmenin * eylemi olması gereken bir varsayılan eylemi gerçekleştirdiğinizden emin olun. – goat

cevap

6

Sadece bu

@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

Neden benzer bir yöntemle tek bir denetleyici oluşturmak

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" 

Tek bir kontrolör ile basılan düğmeye göre farklı URL isteğine yönlendirebilirsiniz.

iptal düğmesi için

,

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

neyi talep haritalama yapar o parametreler adını içeriyorsa iptal = sonrası isteği taramak etmektir. tasarrufu düğmesini için

,

@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

"input" etiketindeki "value" özniteliğinin düğmenin metnini içerdiği için biraz tehlikeli görünüyor. Sanırım i18n bu yöntemle arkadaşın olmayacak. –

+0

IE (10) ile tutarlı bir şekilde değerler göndermediğim için problemlerim vardı ve yaklaşımınızı kabul ettim. Çok temiz olmasa da, benim için çalıştı. Şerefe. –

34

: o zaman

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

ve:

9

Yalnızca params Özellikte farklılık aynı @RequestMapping daha denetleyici yöntemleri varsa, açıkça yazmak zorunda:

  • parametre olması gerekiyordu hangi istekte bulunan, örneğin params="save"
  • talepte hangi parametrenin olmaması gerekiyorsa, örn. Sizin durumda params="!save"

:

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

Bu hatayı HTTP yolu için eşlenen Muğlak işleyici yöntemleri düzeltmek gerekir ...

görün Spring Web API 4.0.x - RequestMapping#params

1

Bir daha çözüm: kullanıcı formu gönderdiğinde eğer bazı tarayıcılar alışkanlık herhangi düğmelerin anahtar/değer çifti göndermek

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