2011-04-21 30 views
5

Tôi đang bối rối về cách hoạt động của DefaultAnnotationHandlerMapping.Cách DefaultAnnotationHandlerMapping hoạt động

Trong web.xml của tôi, tôi có

<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>/somePath/someWork</url-pattern> 

    <url-pattern>/users</url-pattern> 
    <url-pattern>/user/*</url-pattern> 
    </servlet-mapping> 

Tôi có bộ điều khiển như thế này,

@RequestMapping(value="/user/adduser", method={RequestMethod.POST}) 
    public void addAdmin(@ModelAttribute("myData") myData data) { 

     System.out.println("We reached adduser controller"); 

    } 

Và trong file jsp tôi có

<form:form id="adduser" method="post" action="/user/adduser" commandName="myData"> 

này không hoạt động . Tôi nhận được lỗi không có bản đồ handler tìm thấy cho "/ adduser" và 404 cho trang "/ user/adduser"

Nhưng trong file .xml nếu tôi đề cập đến

<url-pattern>/user/adduser</url-pattern> 

nó hoạt động, hoặc nếu tôi đặt bộ điều khiển như,

@RequestMapping(value="/adduser", method={RequestMethod.POST}) 

cũng hoạt động. Khi gửi trang, nó sẽ đến đúng bộ điều khiển.

Tôi hiện đang nhầm lẫn cách hoạt động của @ReuqestMapping. Khi một yêu cầu đến như "/ user/adduser" từ nơi nó sẽ bắt đầu tìm kiếm đúng class và đúng method?

Trả lời

9

Mùa xuân sẽ khớp với thuộc tính pathInfo của số HttpServletRequest.

Nếu bạn web.xml định <url-pattern>/user/*</url-pattern> thì pathInfo sẽ là con đường với /user tiền tố loại bỏ, do đó @RequestMapping phải là /adduser.

Nếu web.xml chỉ định <url-pattern>/user/adduser</url-pattern>, thì pathInfo sẽ là đường dẫn đầy đủ /user/adduser, vì vậy @RequestMapping phải khớp với điều đó.

Điều này không được thực hiện bởi Spring, nhưng bởi thùng chứa servlet, và đôi khi có thể hơi khó hiểu.

Bạn có thể giảm thiểu điều này bằng cách sử dụng các ký tự đại diện trong @RequestMapping, ví dụ:

@RequestMapping(value="**/adduser", method={RequestMethod.POST}) 
+0

Cảm ơn bạn đã trả lời skaffman. Điều này mang lại cho tôi cái nhìn sâu sắc. Một câu hỏi khác có liên quan. Trong môi trường sản xuất, mọi người thực sự thực hiện các ánh xạ như * .do? Tôi đã không thấy bất kỳ ví dụ thực sự nào như thế này. – kalyan

+1

@ kalyan: '* .do' là một sự nôn nao từ những ngày xưa cũ của Struts. Tuy nhiên, bạn vẫn thấy nó trên các trang web "thực sự". – skaffman

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