7

我正在学习 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>

我可以或需要做什么才能使其绑定?

4

4 回答 4

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 :)
        } 
    }   
 }

这个想法是 @ModelAttribute 方法将在 GET 和 POST 上被调用,在 GET 请求上,它只会暴露给视图,而在 POST 上它将用于绑定请求参数。

请注意,将BindingResult传递给 POST 方法,以便您可以使用命令执行某些操作。

于 2012-04-17T20:16:19.093 回答
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>
于 2012-04-17T20:34:33.460 回答
1

您还需要更改 Person 对象,在此之前属性不应有“_”。将“_firsName”更改为“firstName”。吸气剂,二传手的很好。Spring 绑定通过属性名称传递给它们相应的 getter 和 setter。

还要更改您在视图中的访问方式。像 ${person.firstName} 一样使用。您不需要在“person.firstName”之前使用“model”,也不需要提及 getFirstName,spring 会自动为您完成。

于 2012-04-17T20:34:38.653 回答
1

请检查您的 Person 类变量、getter 和 setter 方法命名。Getter 方法应该以 'get' 和变量名的第一个大写字母开头,其他字母的大小写相同,例如: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;}
}
于 2015-04-17T09:08:38.010 回答