Я недавно начал работать с JSP в Spring Framework, и я попытался реализовать страницу обработки формы.Spring Framework JSP Обработка формы: @ModelAttribute
Я создал базовую страницу формы, которая вводит пользователя, и после того, как они попали в submit, они получают страницу подтверждения с введенным им вводом.
Эти два отображенные методы, которые я имею в своем классе контроллера:
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.redcup.model.Person;
import com.redcup.model.User;
import com.redcup.test.ServletTestBean;
import javax.annotation.PostConstruct;
@Controller
public class RedCupController {
private final Logger logger = LoggerFactory.getLogger(RedCupController.class);
@PostConstruct
public void intializeComplete() {
logger.info("Controller initialized");
}
@RequestMapping(method=RequestMethod.GET, value="/health")
@ResponseBody
public String getHealth()
{
logger.info("GET /health invoked.");
return "hello world!";
}
@RequestMapping(method=RequestMethod.GET, value="/welcome")
public String getWelcome(Model model) {
User user = new User();
model.addAttribute("userform", user);
return "welcome";
}
@RequestMapping(method=RequestMethod.POST, value="/confirmation")
public String getConfirmation(@ModelAttribute("userform") User user, @ModelAttribute("pew") User user2,
@ModelAttribute("whomp")Person person, Model model) {
user = getUserForm();
user2 = getUserForm2();
System.out.println("hello: " + user);
System.out.println("goodbye: " + user2);
System.out.println("user: " + user.getFirstName());
System.out.println("user: " + user.getLastName());
System.out.println("user: " + user.getEmail());
System.out.println("user: " + user.getAge());
System.out.println("user2: " + user2.getFirstName());
System.out.println("user2: " + user2.getLastName());
System.out.println("user2: " + user2.getEmail());
System.out.println("user2: " + user2.getAge());
System.out.println("person: " + person.getName());
System.out.println("person: " + person.getNum2());
model.addAttribute("user", user);
model.addAttribute("user2", user2);
model.addAttribute("person", person);
return "confirmation";
}
@ModelAttribute("userform")
public User getUserForm() {
return new User();
}
@ModelAttribute("userform2")
public User getUserForm2() {
return new User();
}
}
Класс пользователя для модели:
общественного класса пользователя {
private String firstName;
private String lastName;
private String email;
private int age;
public User() {
firstName = "John";
lastName = "Smith";
email = "default email";
age = 1;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getLastName() {
return lastName;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public void setAge (int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
И ниже - страница с информацией о форме welcome.jsp:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<form:form action="confirmation" method="post" commandName="userform">
<form:input path="firstName"/>
<form:input path="lastName"/>
<form:input path="email"/>
<form:input path="age"/>
<input type="submit" value="Press this to submit"/>
</form:form>
</div>
</body>
</html>
В моем обработчике контроллера: getConfirmation У меня есть два параметра (пользователь и user2) .Отель часть я путать о том, что когда я нажимаю представить в моем welcome.jsp, пользователь и user2 заполняются точно такой же значения из модели в welcome.jsp. Я не уверен, почему это происходит, поскольку я думал, что @ModelAttribute присваивает соответствующий атрибут модели указанному параметру (т. Е. Пользователь получит модель под пользовательской формой commandName).
Но мне кажется, что аннотация @ModelAttribute ничего не делает. Параметры пользователя и пользователя2 будут заполнены теми же значениями поля (что я ввел в форму), когда @ModelAttributes имеют разные ключи (т.е. пользовательскую форму vs userform2), и когда я даже удаляю аннотации @ModelAttribute, пользователь и пользователь2 будут STILL быть с теми же значениями поля.
Может кто-нибудь объяснить, почему это происходит и что именно делает аннотация @ModelAttribute?
Заранее благодарен!
EDIT
Я создал класс UserWrapper за предложение Алана Хэя:
общественного класса UserWrapper {
private User user1;
private User user2;
public User getUser1() {
return user1;
}
public User getUser2() {
return user2;
}
public void setUser1(User user) {
user1 = user;
}
public void setUser2(User user) {
user2 = user;
}
public void setUser1FirstName(String firstName) {
user1.setFirstName(firstName);
}
public String getUser1FirstName() {
return user1.getFirstName();
}
public void setUser2FirstName(String firstName) {
user2.setFirstName(firstName);
}
public String getUser2FirstName() {
return user2.getFirstName();
}
}
и обновил свой welcome.jsp с помощью следующей формы:
<form:form action="confirmation" method="post" commandName="userform">
<form:input path="user1.firstName"/>
<form:input path="user1.lastName"/>
<form:input path="user1.email"/>
<form:input path="user1.age"/>
<input type="submit" value="Press this to submit"/>
</form:form>
Да, конечно. Сожалею. –
Должен ли возвращаемый тип getUserForm() и getUserForm2() быть пользователем? Я изменил тип возврата на User и в getConfirmation я добавил эти две строки: user = getUserForm(); user2 = getUserForm2(); Я все еще получал одинаковые значения полей для обоих объектов, а объекты user и user2 не отражают вход, который я сделал в welcome.jsp; они просто показывают значения по умолчанию из конструктора User. – user7702
Вам нужно будет опубликовать полный контроллер и ваш пользовательский класс. –