Как в одну форму передать 2 модели аттрибута?
Есть контроллер, который отправляет модели в форму:
@RequestMapping("/transferPlanet")
public String transferPlanet(Model model) {
Planet planet=new Planet();
Lord lord=new Lord();
model.addAttribute("planetTr",planet);
model.addAttribute("lordTr",lord);
return "/transfer-planet";
}
И контроллер который получает эти 2 модели из формы:
@RequestMapping("/saveTransfer")
public String saveTransfer(@ModelAttribute("planet") Planet planet, @ModelAttribute("lord") Lord lord) {
planetService.saveTransferPlanet(planet,lord);
return "redirect:/showInterface";
}
Вопрос в том, как правильно прописать саму view, чтобы я мог в одной форме получить 2 модели разных объектов и по нажатию кнопки "ок" отправить эти формы в контроллер c адресом /saveTransfer.
моя view, но она корявая
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<title> Transfer </title>
<body>
<h2> Transfer </h2>
<form:form action="/saveTransfer" modelAttribute="planetTr" >
Planet name: <form:input path="planetName"/>
<input type="submit" value="OK">
</form:form>
<form:form action="/saveTransfer" modelAttribute="lordTr">
Lord name: <form:input path="lordName"/>
<input type="submit" value="OK">
</form:form>
</body>
</html>
Ответы (1 шт):
Тут на самом деле все просто:
- Вы не можете связать форму с несколькими моделями.
- Также Вы не можете одновременно отправить две формы
Что вы можете?
Вы можете создать модель для вашей формы, которая будет содержать нужные Вам поля.
Данная модель не обязательно должна быть сущностью, связанной с базой данных.
Достаточно просто создать класс с двумя полями lord и planet
public class TransferForm {
private Lord lord;
private Planet planet;
public Lord getLord() {
return lord;
}
public void setLord(Lord lord) {
this.lord = lord;
}
public Planet getPlanet() {
return planet;
}
public void setPlanet(Planet planet) {
this.planet = planet;
}
}
В методе выводящим форму создадим объект созданного класса(вместо Planet и Lord) и поместим его в модель отображения:
@RequestMapping("/transferPlanet")
public String transferPlanet(Model model) {
TransferForm transferForm = new TransferForm();
model.addAttribute("transferForm", transferForm);
return "/transfer-planet";
}
На странице:
- Поместим оба поля в одну форму
- Свяжем эту форму с атрибутом модели
modelAttribute="transferForm" - Свяжем поля формы с нужными полями объектов
lordиplanetвнутриtransferForm
Будет что-то вроде того:path="lord.lordName"path="planet.planetName"
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<title> Transfer </title>
<body>
<h2> Transfer </h2>
<form:form action="/saveTransfer" modelAttribute="transferForm" >
<div class="field_wrapper">
Planet name: <form:input path="planet.planetName"/>
</div>
<div class="field_wrapper">
Lord name: <form:input path="lord.lordName"/>
</div>
<input type="submit" value="OK">
</form:form>
</body>
</html>
В принимающем методе:
- в параметрах перехватим прилетевший объект
@ModelAttribute("transferForm") TransferForm transferForm - в метод
saveTransferPlanetпрокинем объектыplanetиlordизtransferForm
saveTransferPlanet(transferForm.getPlanet(), transferForm.getLord())
@RequestMapping("/saveTransfer")
public String saveTransfer(@ModelAttribute("transferForm") TransferForm transferForm) {
planetService.saveTransferPlanet(transferForm.getPlanet(),transferForm.getLord());
return "redirect:/showInterface";
}
Если данный метод работал раньше, значит все должно работать.
Во всяком случае в дебагере объект прилетает с введенными полями
А дальше уже разберетесь сами:
- Можете вообще вынести поля с названиями в
TransferForm - Можете наоборот связать данный объект с базой данных
- Можете вывести в форму дополнительные поля из
LordилиPlanetили добавить их вTransferForm
Но саму суть, я надеюсь, вы поняли.
