Nano Hash - криптовалюты, майнинг, программирование

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

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

<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. Есть ли другой способ создать одно действие для каждой кнопки в форме?


  • URL-адрес действия формы — @{/action/edit}, но в вашем контроллере /edit, не могли бы вы рассказать мне, как вы связываете свой html и контроллер. 09.08.2018
  • Пранеш Саху, может префикс @RequestMapping(value="action") в классе контроллера? 07.01.2020

Ответы:


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() {}
14.07.2015

2

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

@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;
    }
}
14.07.2015
  • Довольно поздно заметить, но break; в default сильно избыточен (поскольку оператор switch все равно завершает работу). 22.03.2021

  • 3

    это работает в моей проблеме. используйте th:formaction для кнопки отправки, это зависит от того, сколько у вас есть кнопок отправки, и это также полезно для предоставления большего количества ссылок на одну форму с другой кнопкой отправки.

    <form action="#"  class="form" th:action="@{'/publish-post/'+${post.id}}" method="post">
    <input class="savebtn" type="submit" value="Save" th:formaction="'/save-post/'+${post.id}">
    <input class="publish" type="submit" value="Publish Article">
    </form>
    
    03.04.2020

    4

    Для нескольких кнопок отправки у меня сработало следующее. Обратите внимание: th:formaction в кнопке отмены.

    <form action="#" th:action="@{/saveProducts}" th:object="${model}" method="post">
      <button type="submit" name="action" value="cancel" th:formaction="@{/cancelProducts}">CANCEL</button>
      <button type="submit" name="action" value="save">SAVE</button>
    </form>
    

    Для контроллера:

       @RequestMapping(value="/saveProducts", method= RequestMethod.POST)
        public String save(@ModelAttribute SomeModel model) {
          *//Do something*
        }
    
        @RequestMapping(value="/cancelProducts", method=RequestMethod.POST)
        public String cancel(@ModelAttribute SomeModel model) {
          *//Do something*
    
        }
    
    29.06.2021

    5

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

    String btnName = request.getParameter("action");
    
    if(btnName.equals("save"))
        // you code....
    else if(btnName.equals("cancel"))
        // you code....
    
    27.04.2016
  • Чтобы прояснить отрицательные голоса: это не только полностью отличается от сути вопроса (поиск способов избежать конструкции if в этой ситуации), но также использование request.getParameter(...) намного хуже, чем подключение его напрямую к параметру метода с использованием @RequestParam ( как это сделано в коде вопроса). 22.03.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..