в спринге?
Есть postmapping метод и 2 формы в jsp. При submit хотя бы одной из форм, выполняются обе. Формы привязаны через modelattribute
По идее тут проблема на стороне этих форм Может быть вы указали для них одинаковые айди?
Нет. Айди разные. Вот код хтмл: <form:form id="form2" method="post" modelAttribute="salary1" > <form:select path="cityUSA"> <form:option value="0" label="ovwc"/> <form:option value="1" label="ges"/> <form:option value="2" label="eac "/> <form:option value="3" label=" rhc "/> </form:select> <br> <input type="submit" form="form2" value="ok"/> ${c} </form:form> <form:form id="form1" method="post" modelAttribute="salary"> <label for="salary">Введите заработную плату</label> <input name="salary" type="text" id="salary"/> <br> Выберите Ваш регион из списка <form:select path="city"> <form:option value="0" label="Адыгея"/> <form:option value="1" label="Алтай"/> <form:option value="2" label="Алтайский край"/> <form:option value="3" label="Амурская обл."/> </form:select> <br> <input type="submit" form="form1" value="ok"/> ${isLoss} ${salaryOfYear} ${isMore} </form:form> Вот методы контроллера. Логика там другая. Это просто пример сигнатуры @GetMapping("/twoPage") String doGe(Model model){ model.addAttribute("salary",new Salary()); model.addAttribute("salary1",new Salary1()); return "twoPage"; } @PostMapping("/twoPage") String doPos(@ModelAttribute("salary")Salary salary, @ModelAttribute("salary1")Salary1 salary1){ System.out.println("this s1 "+ salary1); System.out.println("this s "+salary); return null; }
То есть, после отправки одной из форм приходит два пост запроса в метод doPos, я правильно понимаю?
Как бы да. В оригинале кода в одной форме вводится 2 значения, в методе для них логика, потом посредством модельатрибут результат логики выводится в той же форме после нажатия сабмит. То же самое для второй формы. Но при нажатии, допустим сабмит второй формы, выполняется вторая форма и первая (с дефолтными нулевыми значениями. Возможно это из-за того, что логика для обеих форм написано в одном методе с аннотацией постмапинг. Но вторую такую спринг создать не даёт. Пишет что-то вроде: пост метод уже есть
Можно создать второй метод, если в нем будут другие аргументы Спринг автоматически выберет подходящий метод, и направит туда запрос По поводу проблемы, видимо нашел отгадку. В методе указаны аргументы типов Salary и Salary1, которые, видимо, спринг инициализирует с нулевыми значениями. Поэтому тут не два запроса, просто отсутствующий аргумент заполняется нулевыми значениями Можно обернуть аргументы в Option, и проверять, есть ли нужный аргумент. Или, как я писал выше, создать два метода с разными аргументами
Сейчас попробую 👌
Сделать 2 метода не получилось. Как я и говорил, не даёт создать, выбрасывает 500 статус. Говорит уже есть пост метод, хоть и аргументы разные. С оберткой не совсем понял, не получается обернуть. В самом параметре метода обернуть? И как проверку сделать. Точнее что должен будет вернуть метод по результатам проверки
Видимо несколько методов можно создавать только с рест контроллерами Нужно обернуть типы аргументов в Optional. Это будет выглядеть как Optional<Salary> Для проверки, есть ли значение в Optional можете использовать метод isPresent(), а для того, чтобы получить само значение- get() Ваш метод-контроллер будет возвращать то же самое, изменится только логика его работы. Например, не будет добавляться один из аттрибутов в model, тут уже на ваше усмотрение.
В общем я так понял предложение было в том, что бы делать проверку на ноль или пустоту. Понял, сделал. В принципе работает. Но что если я хочу сделать на странице 7 или 10 отдельно работающих форм? Получается для логики каждой формы я должен буду делать проверку в одном методе. И она будет становиться все больше. Я к тому, что это решение проблемы, но оно работает не так как должно быть. То есть формы ведь должны отправлять данные ТЕКУЩЕЙ формы, а не всех. Вот. Есть еще какие-то мысли? Стремлюсь к правильности, а не к "фух, заработало". Хочу потом что-то показать на собесе
Вы наверное их на один и тот же path вешаете, поэтому и не даёт
Сделать для каждой формы свой урл
Обсуждают сегодня