복붙노트

[SPRING] Spring MVC - 폼에 여러 제출 버튼

SPRING

Spring MVC - 폼에 여러 제출 버튼

각 단추 작업이 다른 컨트롤러에 매핑 된 폼에 2 개의 단추 게시 단추를 보내려고합니다. 내 매핑은 다음과 같습니다.

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

그리고 제출 버튼은 다음과 같습니다.

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

내 매핑에서 알 수 있듯이 매개 변수를 사용하여 클릭 한 버튼을 구분할 수 있습니다. 문제는 시간의 90 %가 작동하지만 때때로 예외가 발생한다는 것입니다.

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)

이상하게도이 일이 발생하고 페이지를 다시 제출하면 모든 것이 잘됩니다. 내가하려는 일을 성취 할 수있는 더 좋은 방법이 있습니까?

감사!

해결법

  1. ==============================

    1.양식에 다음 버튼이 지정되어있는 경우 :

    양식에 다음 버튼이 지정되어있는 경우 :

    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"
    

    하나의 컨트롤러로 버튼을 누르면 다른 URL 요청을 할 수 있습니다.

    취소 버튼,

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

    요청 매핑이 수행하는 작업은 params name = cancel이 포함 된 게시물 요청을 검색하는 것입니다.

    저장 버튼,

    @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.
    }
    
  2. ==============================

    2.왜 안돼 :

    왜 안돼 :

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

    그리고:

    @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
        }
    
    } 
    
  3. ==============================

    3.params 속성에서만 다른 @RequestMapping과 함께 더 많은 컨트롤러 메소드가있는 경우 명시 적으로 다음을 작성해야합니다.

    params 속성에서만 다른 @RequestMapping과 함께 더 많은 컨트롤러 메소드가있는 경우 명시 적으로 다음을 작성해야합니다.

    귀하의 경우 :

    @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를 참조하십시오.

  4. ==============================

    4.이 방법과 비슷한 방법으로 하나의 컨트롤러를 만드십시오.

    이 방법과 비슷한 방법으로 하나의 컨트롤러를 만드십시오.

    @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
    }
    
    } 
    
  5. ==============================

    5.하나 더 솔루션 :

    하나 더 솔루션 :

    @RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"})
    @RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"})
    
  6. from https://stackoverflow.com/questions/8954426/spring-mvc-multiple-submit-button-to-a-form by cc-by-sa and MIT license