2011-12-31 52 views
31

phép nói rằng chúng ta có một thực thể Person, một bộ điều khiển PersonController và một trang edit.jsp (tạo mới hoặc chỉnh sửa một người hiện có)@ModelAttribute chú thích, khi sử dụng nó?

khiển

@RequestMapping(value = "/edit", method = RequestMethod.POST) 
public String editPerson(@RequestParam("fname") String fname, Model model) { 
    if(fname == null || fname.length() == 0){ 
     model.addAttribute("personToEditOrCreate", new Person()); 
    } 
    else{ 
     Person p = personService.getPersonByFirstName(fname); 
     model.addAttribute("personToEditOrCreate", p); 
    } 

    return "persons/edit"; 
} 

@RequestMapping(value = "/save", method = RequestMethod.POST) 
public String savePerson(Person person, BindingResult result) { 

    personService.savePerson(person); 
    return "redirect:/home"; 
} 

edit.jsp

<form:form method="post" modelAttribute="personToEditOrCreate" action="save"> 
    <form:hidden path="id"/> 
    <table> 
     <tr> 
      <td><form:label path="firstName">First Name</form:label></td> 
      <td><form:input path="firstName" /></td> 
     </tr> 
     <tr> 
      <td><form:label path="lastName">Last Name</form:label></td> 
      <td><form:input path="lastName" /></td> 
     </tr> 
     <tr> 
      <td><form:label path="money">Money</form:label></td> 
      <td><form:input path="money" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <input type="submit" value="Add/Edit Person"/> 
      </td> 
     </tr> 
    </table> 

</form:form> 

Tôi đang cố gắng mã ở trên (không sử dụng chú thích @ModelAttribute trong phương thức savePerson và nó hoạt động chính xác. Tại sao và khi nào tôi cần thêm chú thích vào đối tượng người:

@RequestMapping(value = "/save", method = RequestMethod.POST) 
public String savePerson(@ModelAttribute("personToEditOrCreate") Person person, BindingResult result) { 

    personService.savePerson(person); 
    return "redirect:/home"; 
} 

Trả lời

2

Câu hỏi của bạn dường như được trả lời đã:

What is @ModelAttribute in Spring MVC?

Để tóm tắt câu trả lời và blog post: khi bạn muốn của bạn đối tượng hình thức ủng hộ (thể hiện của Người) để được tiếp tục tồn trên yêu cầu.

Nếu không, không có chú giải, phương thức ánh xạ yêu cầu sẽ giả định Person là đối tượng mới và không được liên kết với đối tượng sao lưu biểu mẫu của bạn. Bài đăng trên blog áp phích tham chiếu thực sự tuyệt vời bằng cách này, chắc chắn là phải đọc.

+0

... nhưng các giá trị trong Mô hình không được duy trì trong các yêu cầu trừ khi bạn đang sử dụng RedirectAttributesModelMap? trong đó? – dade

51

Bạn không cần @ModelAttribute (tham số) chỉ sử dụng một Bean như một tham số

Ví dụ, những phương pháp xử lý làm việc tốt với những yêu cầu này:

@RequestMapping("/a") 
void pathA(SomeBean someBean) { 
    assertEquals("neil", someBean.getName()); 
} 

GET /a?name=neil 

@RequestMapping(value="/a", method=RequestMethod.POST) 
void pathAPost(SomeBean someBean) { 
    assertEquals("neil", someBean.getName()); 
} 

POST /a 
name=neil 

Sử dụng @ModelAttribute (phương pháp) để tải dữ liệu mặc định vào mô hình của bạn theo mọi yêu cầu - cho kỳ thi ple từ một cơ sở dữ liệu, đặc biệt là khi sử dụng @SessionAttributes.Điều này có thể được thực hiện trong một Controller hoặc trong một ControllerAdvice:

@Controller 
@RequestMapping("/foos") 
public class FooController { 

    @ModelAttribute("foo") 
    String getFoo() { 
    return "bar"; // set modelMap["foo"] = "bar" on every request 
    } 

} 

Bất kỳ JSP chuyển tiếp đến bởi FooController:

${foo} //=bar 

hoặc

@ControllerAdvice 
public class MyGlobalData { 

    @ModelAttribute("foo") 
    String getFoo() { 
    return "bar"; // set modelMap["foo"] = "bar" on every request 
    } 

} 

Bất kỳ JSP:

${foo} //=bar 

Sử dụng @ModelAttribute (tham số) nếu bạn muốn sử dụng kết quả của @ModelAttribute (phương pháp) như là một mặc định:

@ModelAttribute("attrib1") 
SomeBean getSomeBean() { 
    return new SomeBean("neil"); // set modelMap["attrib1"] = SomeBean("neil") on every request 
} 

@RequestMapping("/a") 
void pathA(@ModelAttribute("attrib1") SomeBean someBean) { 
    assertEquals("neil", someBean.getName()); 
} 

GET /a 

Sử dụng @ModelAttribute (tham số) để có được một đối tượng được lưu trữ trong thuộc tính flash :

@RequestMapping("/a") 
String pathA(RedirectAttributes redirectAttributes) { 
    redirectAttributes.addFlashAttribute("attrib1", new SomeBean("from flash")); 
    return "redirect:/b"; 
} 

@RequestMapping("/b") 
void pathB(@ModelAttribute("attrib1") SomeBean someBean) { 
    assertEquals("from flash", someBean.getName()); 
} 

GET /a 

Sử dụng @ModelAttribute (tham số) để có được một đối tượng được lưu trữ bởi @SessionAttributes

@Controller 
@SessionAttributes("attrib1") 
public class Controller1 { 

    @RequestMapping("/a") 
    void pathA(Model model) { 
     model.addAttribute("attrib1", new SomeBean("neil")); //this ends up in session due to @SessionAttributes on controller 
    } 

    @RequestMapping("/b") 
    void pathB(@ModelAttribute("attrib1") SomeBean someBean) { 
     assertEquals("neil", someBean.getName()); 
    } 
} 

GET /a 
GET /b 

+0

Cách sử dụng '@ ModelAttribute' trong phương thức' PUT' – viper

+1

Chỉ cần Wow. Vì vậy, hữu ích –

+0

Làm cách nào bạn thiết lập giá trị mặc định cho @ModelAttribute khi sử dụng nó làm tham số? Ví dụ: (@RequestParam (value = "studentName", defaultValue = "Alexa") – Jesse

0

Một @ModelAttribute vào một cuộc tranh luận phương pháp chỉ ra lập luận sẽ được lấy ra từ mô hình. Nếu không có trong mô hình, đối số sẽ được khởi tạo trước và sau đó được thêm vào mô hình.

Các vấn đề liên quan