2012-04-17 19 views
7

Estoy aprendiendo Spring MVC y he buscado en todas partes solo un controlador básico para ver el enlace de datos, pero no he intentado nada como trabajo. Puedo vincular la visualización de vistas al controlador y puedo ver el pojo con propiedades allí, sin embargo, cada vez que intento agregar ese objeto al modelo, no obtengo nada. Aquí es lo que tengo hasta ahora:Basic Spring Enlace de datos MVC

controlador

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

Clase quiero unir

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

Vista - Controlador-a-Form! Trabajo

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

¿Qué puedo o necesito para hacer esto para enlazar?

Respuesta

7

El atributo de modelo es lo que te falta aquí.

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

La idea es que el método será invocado @ModelAttribute tanto en el GET y POST, en la solicitud GET que sólo va a estar expuesto a la vista en tanto que en el post se va a utilizar para obligar a la parámetros de solicitud

Tenga en cuenta que el BindingResult se pasa al método POST, para que pueda hacer algo con el comando.

1

1) Los contenidos de modelMap están implícitos en el JSP. No necesita especificar 'modelo' cuando accede a ellos.

2) JSP-EL accede a los campos a través de accesadores de propiedades de bean, sin invocar métodos. No especifica el 'get' para llamar a un método real. Usas el nombre de la propiedad del frijol. por ejemplo, $ {person.firstName} para obtener el resultado de 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

' < input type = "submit" value = "Submit" /> ' Home.jsp, puedo unir desde View al Controller. Para la imagen completa. Gracias –

1

Es necesario cambiar el objeto persona así, los atributos no deben tener un "_" antes de eso. Cambie "_firsName" por "firstName". El captador, el colocador están bien. El enlace de resorte va por los nombres de atributo a su correspondiente getter y setter.

También cambie la forma de acceder en la vista. Use como $ {person.firstName}. No necesita el "modelo" antes de "person.firstName" y tampoco necesita mencionar getFirstName, el resorte lo hace automáticamente por usted.

1

Por favor, compruebe la nomenclatura de las clases de personas, los métodos getter y setter. El método Getter debería comenzar con 'get' y la primera letra mayúscula de su nombre de variable y el mismo caso para otra letra, por ejemplo: getFirstName() y el método setter también debería gustar al método getter. Si la convención de nomenclatura de sus métodos getter y setter es diferente, el enlace no funciona correctamente. Aquí está la versión de actualización de su clase de persona.

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