2012-12-15 139 views
6

Tôi khá mới trong Spring MVC. Hiện tại tôi đang nghiên cứu Spring MVC Showcase, thể hiện các tính năng của khung công tác web MVC Spring.Hiểu việc sử dụng các chú thích @ModelAttribute và @RequestAttribute trong Spring MVC

Tôi có một số vấn đề để hiểu cách đối số Web có thể giải quyết tùy chỉnh được xử lý trong ví dụ này.

Trong thực tế, tôi có tình huống sau. Trong home.jsp quan điểm của tôi tôi có đường dẫn sau:

<a id="customArg" class="textLink" href="<c:url value="/data/custom" />">Custom</a> 

Liên kết này tạo ra một yêu cầu HTTP về phía URL: "/ data/tùy chỉnh"

Lớp điều khiển có chứa phương pháp để xử lý yêu cầu này có đoạn mã sau:

@Controller 
public class CustomArgumentController { 

    @ModelAttribute 
    void beforeInvokingHandlerMethod(HttpServletRequest request) { 
     request.setAttribute("foo", "bar"); 
    } 

    @RequestMapping(value="/data/custom", method=RequestMethod.GET) 
    public @ResponseBody String custom(@RequestAttribute("foo") String foo) { 
     return "Got 'foo' request attribute value '" + foo + "'"; 
    } 

} 

phương pháp xử lý HTTP Request đây là tùy chỉnh(). Vì vậy, khi liên kết trước được nhấp vào, Yêu cầu HTTP được xử lý theo phương thức tùy chỉnh.

Tôi có một số vấn đề để hiểu chính xác chú thích @RequestAttribute là gì. Tôi nghĩ rằng, trong trường hợp này, nó liên kết thuộc tính yêu cầu có tên là foo với biến String foo mới. Nhưng nơi mà thuộc tính này được lấy từ đâu? Biến này có được thực hiện bởi Spring không?

OK, ý tưởng của tôi là thuộc tính yêu cầu này được lấy từ một đối tượng HttpServletRequest. Tôi nghĩ vì vậy, trong lớp này, tôi cũng có phương thức beforeInvokingHandlerMethod() có tên nói, vì vậy có vẻ như phương pháp này đặt thuộc tính, có name = foogiá trị = bar, bên trong một đối tượng HttpServletRequest, và sau đó phương thức custom() có thể sử dụng giá trị này.

Trong thực tế sản lượng của tôi là:

Got 'foo' yêu cầu thuộc tính giá trị 'bar'

Tại sao beforeInvokingHandlerMethod() được gọi trước khi tùy chỉnh() phương pháp?

Và tại sao beforeInvokingHandlerMethod() được chú thích bởi @ModelAttribute chú thích? Nó có ý nghĩa gì trong trường hợp này?

Trả lời

1

RequestAttribute không là gì ngoài các thông số bạn đã vượt qua trong quá trình gửi biểu mẫu. Cho phép hiểu với một ví dụ mẫu

Giả sử tôi có các hình thức dưới đây

<form action="..."> 
<input type=hidden name=param1 id=param1 value=test/> 
</form> 

Bây giờ, nếu tôi có bộ điều khiển bên dưới mà là ánh xạ với địa chỉ yêu cầu đó được ánh xạ với việc nộp hình thức như dưới đây.

@Controller 
public class CustomArgumentController { 

@ModelAttribute 
void beforeInvokingHandlerMethod(HttpServletRequest request) { 
    request.setAttribute("foo", "bar"); 
} 


@RequestMapping(value="/data/custom", method=RequestMethod.GET) 
public @ResponseBody String custom(@RequestAttribute("param1") String param1) { 
    // Here, I will have value of param1 as test in String object which will be mapped my Spring itself 
} 
+0

mmm cho tôi hiểu rõ điều này: vì vậy khi tôi annote() phương pháp beforeInvokingHandlerMethod của tôi bằng cách @ModelAttribute chú thích là điều tương tự nếu tôi đã trôi qua một cách chính xác một hình thức với "foo", "thanh" giá trị? và bên trong phương thức này tôi làm request.setAttribute ("foo", "bar"); ? – AndreaNobili

+0

Excatly, bạn có một số thứ để hiểu rõ hơn về ModelAttribute, bạn có thể truy cập tài liệu chính thức của Spring MVC http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web /bind/annotation/ModelAttribute.html và cũng từ http://blog.trifork.nl/2009/05/14/simple-forms-with-spring-mvc-2-5/ –

+0

Tôi đã đọc tài liệu này nhưng tôi đã có Trong thực tế bạn đang sayng tôi rằng khi tôi có một phương thức được chú thích bởi chú giải ModelAttribute, tôi ràng buộc một tham số phương thức cho một thuộc tính mô hình có tên và sau đó tôi có thể sử dụng nó trong một số khác phương pháp bằng cách sử dụng chú thích RequestAttribute? Nhưng trong trường hợp của tôi tham số mà tôi đang ràng buộc là gì? nó là tham số có tên "foo" có "thanh" là giá trị? Cảm ơn bạn rất nhiều bạn rất tử tế :-) – AndreaNobili

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