我正在学习Spring MVC,我到处寻找一个基本的控制器来查看数据绑定,但我没有尝试过任何工作。我可以将视图发布回控制器,我可以在那里看到带有属性的pojo,但每当我尝试将该对象添加到模型时,我什么也得不到。以下是我到目前为止的情况:
控制器
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model model) {
model.addAttribute(new Person());
return "home";
}
@RequestMapping(value="/about", method=RequestMethod.POST)
public void about(Person person, Model model)
{
model.addAttribute("person", person);
}
}
我要绑定的类
public class Person {
private String _firstName;
private String _lastName;
private Date _Birthday;
//Set
public void setFirstName(String FirstName){this._firstName = FirstName; }
public void setLastName(String LastName){this._lastName= LastName; }
public void setBirthDate(Date BirthDate){ this._Birthday = BirthDate;}
//get
public String getFirstName(){return _firstName;}
public String getLastName(){return _lastName;}
public Date getBirthDate(){return _Birthday;}
}
查看 - 控制器到表单!工作
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<html>
</head>
<body>
FirstName: ${model.person.getFirstName}
LastName: ${model.person.getLastName}
</body>
</html>
我可以或需要做什么才能让它绑定?
答案 0 :(得分:8)
模型属性是你在这里缺少的东西。
@Controller
public class HomeController {
@ModelAttribute("person")
public Person getPerson(){
return new Person();
}
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}
@RequestMapping(value="/about", method=RequestMethod.POST)
public void about(@ModelAttribute("person") Person person, BindingResult result, Model model)
{
if( ! result.hasErrors() ){
// note I haven't compiled this code :)
}
}
}
我们的想法是在GET和POST上都会调用@ModelAttribute方法,在GET请求中它将只暴露给视图,在POST上它将用于绑定请求参数。< / p>
请注意,BindingResult
会传递给POST方法,以便您可以对命令执行某些操作。
答案 1 :(得分:1)
1)modelMap的内容隐含在JSP中。您在访问它们时无需指定“模型”。
2)JSP-EL通过bean属性访问器访问字段,而不是调用方法。您没有指定'get'来调用实际方法。您使用bean属性名称。例如,$ {person.firstName}来获取person.getFirstName();
的结果@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model model) {
Person person = new Person();
person.setFirstName("Kai");
person.setLastName("Cooper");
model.addAttribute("person", person);
return "home";
}
`
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<html>
</head>
<body>
FirstName: ${person.firstName}
LastName: ${person.lastName}
</body>
</html>
答案 2 :(得分:1)
您还需要更改Person对象,之前属性不应该有“_”。将“_firsName”更改为“firstName”。吸气剂,二传手很好。 Spring绑定通过属性名称传递给相应的getter和setter。
同时更改您在视图中的访问方式。像$ {person.firstName}一样使用。你不需要“person.firstName”之前的“模型”,也不需要提及getFirstName,spring会自动为你做这个。
答案 3 :(得分:1)
请检查您的Person类变量,getter和setter方法命名。 Getter方法应该从&#39; get&#39;开始。你的变量名的第一个大写字母和其他字母的大小写相同,例如:getFirstName()
和setter方法也应该像getter方法一样。如果getter和setter方法的命名约定不同,则绑定无法正常工作。这是Person类的更新版本。
public class Person {
private String firstName;
private String lastName;
private Date Birthday;
//Set
public void setFirstName(String FirstName){this.firstName = FirstName; }
public void setLastName(String LastName){this.lastName= LastName; }
public void setBirthDate(Date BirthDate){ this.Birthday = BirthDate;}
//get
public String getFirstName(){return firstName;}
public String getLastName(){return lastName;}
public Date getBirthDate(){return Birthday;}
}