2012-04-17 89 views
7

Tôi đang học Spring MVC và tôi đã xem ở khắp mọi nơi để chỉ làm một bộ điều khiển cơ bản để xem ràng buộc dữ liệu nhưng không có gì tôi đã thử làm việc. Tôi có thể ràng buộc xem bài đăng trở lại bộ điều khiển và tôi có thể nhìn thấy các pojo với tài sản ở đó, tuy nhiên bất cứ khi nào tôi đã cố gắng để thêm rằng đối tượng để các mô hình tôi nhận được gì. Dưới đây là những gì tôi có cho đến nay:Basic Spring MVC Data Binding

khiển

@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); 
    } 
} 

Lớp Tôi muốn để ràng buộc

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;} 
} 

View - Controller-to-Form! Làm việc

<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> 

Tôi có thể hoặc cần điều này để làm cho nó liên kết?

Trả lời

7

Thuộc tính mô hình là thứ bạn đang thiếu ở đây.

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

Ý tưởng là phương pháp @ModelAttribute sẽ được gọi trên cả GET và POST, theo yêu cầu GET nó sẽ chỉ được tiếp xúc với quan điểm nơi như trên POST nó sẽ được sử dụng để ràng buộc thông số yêu cầu.

Lưu ý rằng BindingResult được chuyển sang phương thức POST, để bạn có thể làm điều gì đó với lệnh.

1

1) Nội dung của mô hìnhMap là ẩn trong JSP. Bạn không cần phải chỉ định 'mô hình' khi bạn truy cập chúng.

2) JSP-EL truy cập các trường thông qua trình truy cập thuộc tính bean, không gọi phương thức. Bạn không chỉ định 'get' để gọi một phương thức thực tế. Bạn sử dụng tên thuộc tính bean. ví dụ: $ {person.firstName} để nhận kết quả của 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> 
+0

' < loại đầu vào = "gửi" giá trị = "Gửi" /> ' Home.jsp, tôi có thể liên kết từ Xem sang Bộ điều khiển. Đối với hình ảnh đầy đủ. Cảm ơn bạn –

1

Bạn cần thay đổi các đối tượng Person là tốt, các thuộc tính không nên có một "_" trước đó. Thay đổi "_firsName" thành "firstName". Các getter, setter là tốt. Spring binding đi theo các tên thuộc tính cho getter tương ứng và setter của chúng.

Cũng thay đổi cách bạn truy cập trong chế độ xem. Sử dụng như $ {person.firstName}. Bạn không cần "mô hình" trước "person.firstName" và bạn cũng không cần phải đề cập đến getFirstName, mùa xuân sẽ tự động thực hiện điều đó cho bạn.

1

Vui lòng kiểm tra tên biến lớp học, phương thức getter và setter của bạn. Phương thức Getter nên bắt đầu bằng 'get' và chữ cái viết hoa đầu tiên của tên biến và trường hợp tương tự cho thư khác, ví dụ: getFirstName() và phương thức setter cũng giống như phương thức getter. Nếu quy ước đặt tên của các phương thức getter và setter của bạn là khác nhau, ràng buộc không hoạt động đúng. Đây là phiên bản cập nhật của lớp Person của bạn.

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;} 
}