【发布时间】:2015-05-10 06:59:09
【问题描述】:
我最近开始在 Spring 框架中使用 JSP,并尝试实现一个表单处理页面。
我创建了一个接受用户输入的基本表单页面,在他们点击提交后,他们会收到一个确认页面,其中包含他们输入的输入。
这是我的控制器类中的两个映射方法:
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 我有两个用户参数(user 和 user2)。我感到困惑的是,当我在 welcome.jsp 中单击提交时,user 和 user2 填充了与Welcome.jsp 中的模型。我不确定为什么会发生这种情况,因为我认为 @ModelAttribute 只会将相应的模型属性分配给指定的参数(即用户将在 commandName 用户表单下接收模型)。
但对我来说,@ModelAttribute 注释似乎没有做任何事情。当@ModelAttributes 具有不同的键(即userform vs userform2)并且我什至删除@ModelAttribute 注释时,user 和user2 参数将填充相同的字段值(我在表单中输入的值),user 和user2 仍将是填充了相同的字段值。
有人可以解释为什么会发生这种情况以及 @ModelAttribute 注释的作用吗?
提前致谢!
编辑
我根据 Alan 的 Hay 的建议创建了一个 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>
【问题讨论】:
标签: jsp spring-mvc model-view-controller