Несколько кнопок отправки Thymeleaf в одной форме

У меня есть фрагмент страницы HTML с одной формой и кнопкой 2:

<form action="#" data-th-action="@{/action/edit}" data-th-object="${model}" method="post">
     <button type="submit" name="action" value="save">save</button>
     <button type="submit" name="action" value="cancel">cancel</button>
</form>

И контроллер:

@RequestMapping(value="/edit", method=RequestMethod.POST)
public ModelAndView edit(@ModelAttribute SomeModel model, 
        @RequestParam(value="action", required=true) String action) {

    if (action.equals("save")) {
        // do something here     
    }

    if (action.equals("cancel")) {
       // do another thing
    }
    return modelAndView;
}

Эта работа хорошая, но если у меня больше кнопки, я должен добавить инструкцию if, чтобы проверить строку action. Есть ли другой способ создать одно действие для каждой кнопки в форме?

Ответ 1

Вы можете создавать отдельные методы с разными @RequestMappings с помощью переменной params.

@RequestMapping(value="/edit", method=RequestMethod.POST, params="action=save")
public ModelAndView save() {}


@RequestMapping(value="/edit", method=RequestMethod.POST, params="action=cancel")
public ModelAndView cancel() {}

Ответ 2

Вместо if-case у вас может быть случай с переключателем, если вы не хотите использовать каждый параметр в качестве нового сопоставления запросов.

@RequestMapping(value="/edit", method=RequestMethod.POST)
public ModelAndView edit(@ModelAttribute SomeModel model, 
        @RequestParam(value="action", required=true) String action) {
    switch(action) {
        case "save":
            // do stuff
            break;
        case "cancel":
            // do stuff
            break;
        case "newthing":
            // do stuff
            break;
        default:
            // do stuff
            break;
    }
}

Ответ 3

Вы можете узнать, какая кнопка отправки нажата, а затем действовать по кнопке Вот код

String btnName = request.getParameter("action");

if(btnName.equals("save"))
    // you code....
else if(btnName.equals("cancel"))
    // you code....