2012-04-17 14 views
7

Uczę się Spring MVC i szukałem wszędzie, aby zrobić tylko podstawowy kontroler, aby zobaczyć powiązanie danych, ale nic, co próbowałem jako pracy. Mogę powiązać widok wysyłania z powrotem do kontrolera i widzę tam pojo z właściwościami, jednak za każdym razem, gdy próbowałem dodać ten obiekt do modelu, nic nie otrzymuję. Oto co mam do tej pory:Podstawowe wiązanie danych MVC

Controller

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

Klasa I chcą wiązać

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 do formularza! Pracując pod numerem

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

Co mogę zrobić lub potrzebuję, aby to powiązać?

Odpowiedz

7

Atrybut modelu jest tym, czego tu brakuje.

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

Chodzi o to, że metoda @ModelAttribute zostanie wywołany zarówno GET i POST, na żądanie GET będzie po prostu być narażone na widoku, w którym jak na stanowisku będzie używany w celu związania żądaj parametrów.

Należy pamiętać, że BindingResult jest przekazywana do metody POST, dzięki czemu można coś zrobić za pomocą tego polecenia.

1

1) Zawartość mapy modelu jest niejawna na stronie JSP. Nie musisz określać "modelu", gdy uzyskujesz do nich dostęp.

2) JSP-EL uzyskuje dostęp do pól za pośrednictwem obiektów typu bean, które nie wywołuje metod. Nie określa się "get", aby wywołać właściwą metodę. Używasz nazwy właściwości komponentu bean. np. $ {person.firstName}, aby uzyskać wynik osoby.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

' < input type = "submit" value = "Submit" /> ' Home.jsp, mogę powiązać widok z kontrolerem. Dla pełnego obrazu. Dziękuję Ci –

1

trzeba zmienić obiekt Person, jak również atrybuty nie powinien mieć "_" wcześniej. Zmień "_firsName" na "firstName". Getter, seter jest w porządku. Wiązanie sprężyny przechodzi przez nazwy atrybutów do odpowiadających im programów pobierających i ustawiających.

Zmień również sposób dostępu do widoku. Użyj jak $ {person.firstName}. Nie potrzebujesz "modelu" przed "person.firstName", a także nie potrzebujesz mentione getFirstName, wiosna automatycznie robi to za ciebie.

1

Prosimy o sprawdzenie nazw metod klasy osoby, gettera i settera. Metoda Getter powinna rozpoczynać się od "get" i pierwsza wielka litera twojej zmiennej nazwy i tego samego przypadku dla innej litery, na przykład: getFirstName() i metoda setera również powinna być podobna do metody getter. Jeśli konwencja nazewnictwa metod pobierających i ustawiających jest różna, powiązanie nie działa poprawnie. Oto wersja aktualizacji Twojej klasy 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;} 
} 
Powiązane problemy