2012-01-21 23 views
35

Tôi đang cố gắng có 2 nút gửi bài đăng lên biểu mẫu, với mỗi thao tác nút được ánh xạ tới các bộ điều khiển khác nhau. Dưới đây là ánh xạ của tôiSpring MVC - Nút gửi nhiều biểu mẫu tới một Hình thức

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

Và gửi các nút của tôi trông như thế này -

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

Như bạn có thể nhìn thấy từ bản đồ của tôi, tôi đang dựa vào việc sử dụng các params để phân biệt nút gì được nhấp vào. Vấn đề là nó hoạt động 90% thời gian nhưng đôi khi tôi có được ngoại lệ dưới đây -

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) 

Kỳ lạ thay, khi điều này xảy ra và tôi nộp lại trang, tất cả mọi thứ hoạt động tốt sau đó. Có cách nào tốt hơn để đạt được những gì tôi đang cố gắng làm không?

Cảm ơn!

+1

không chắc chắn nếu vấn đề của bạn mình, nhưng phải ghi nhớ một số trình duyệt sẽ không gửi các cặp khóa/giá trị của bất kỳ nút nếu người dùng gửi các hình thức thông qua phím enter hoặc một số phương pháp khác ngoài việc nhấp vào nút. Vì vậy, hãy đảm bảo giả định hành động mặc định, trong đó, đối với khả năng tương thích của trình duyệt cần phải là hành động của nút * đầu tiên * trong nguồn html của biểu mẫu đó. – goat

Trả lời

6

Chỉ cần tạo một điều khiển với một phương pháp tương tự như sau

@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

Tại sao không:

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

và sau đó:

@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

Có vẻ hơi nguy hiểm, vì thuộc tính 'value' trên thẻ' input' chứa văn bản của nút. Tôi nghĩ rằng i18n sẽ không phải là bạn của bạn với phương pháp này. –

+0

Tôi gặp sự cố với IE (10) không đăng các giá trị một cách nhất quán và đã áp dụng cách tiếp cận của bạn. Trong khi không cực kỳ sạch sẽ, nó làm việc cho tôi. Chúc mừng. –

34

nếu hình thức đã các nút này quy định:

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" 

bạn có thể chuyển đến yêu cầu url khác nhau theo nút được nhấn bằng một bộ điều khiển.

cho nút hủy,

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

những gì yêu cầu lập bản đồ không có gì để quét bài yêu cầu nếu nó có chứa tên params = hủy.

cho nút tiết kiệm,

@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

Nếu bạn có phương pháp điều khiển hơn với cùng @RequestMapping mà chỉ khác ở params thuộc tính, Bạn phải viết một cách rõ ràng:

  • mà tham số được coi là có mặt trong yêu cầu, ví dụ params="save"
  • thông số nào KHÔNG được trình bày trong yêu cầu, ví dụ: params="!save"

Trong trường hợp của bạn:

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

này cần khắc phục lỗi phương pháp xử lý nhập nhằng ánh xạ cho con đường HTTP ...

Xem Spring Web API 4.0.x - RequestMapping#params

1

Thêm một giải pháp:

@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"}) 
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"}) 
Các vấn đề liên quan