例如,與所述URL使用部分作爲參數傳遞給控制器在Spring MVC
foo.com/bar/99
99將可直接在控制器作爲一個參數的方法。控制器映射到/ bar
對於任何熟悉ASP.NET MVC或Django的人來說,這與前者的routes.MapRoute類似,後者在urlpatterns中使用(?P \ d +)。
可以直接處理Http Request對象中的數據來獲取這個數據,但是我想知道Spring MVC是否有內置的支持(特別是版本2.5)。
例如,與所述URL使用部分作爲參數傳遞給控制器在Spring MVC
foo.com/bar/99
99將可直接在控制器作爲一個參數的方法。控制器映射到/ bar
對於任何熟悉ASP.NET MVC或Django的人來說,這與前者的routes.MapRoute類似,後者在urlpatterns中使用(?P \ d +)。
可以直接處理Http Request對象中的數據來獲取這個數據,但是我想知道Spring MVC是否有內置的支持(特別是版本2.5)。
不,彈簧不支持開箱即用。你可以,但是,使用@RequestMapping和適當的方法名地圖路徑配置InternalPathMethodNameResolver
:
@Controller
@RequestMapping("/bar/*")
public class MyController {
...
public String do99(HttpServletRequest request) {
...
}
}
你必須爲InternalPathMethodNameResolver
指定prefix
對於上述的「做」的工作,因爲方法的名稱不能從數字開始。如果您使用「foo.com/bar/baz」作爲URL並調用您的方法baz
,則無需其他配置。
如果您不想使用方法名稱映射,那麼獲得'99'作爲參數就像在您的方法中從request.getPathInfo()
中獲取一樣簡單。
對於使用Spring 3人,我已經學會了這個可以使用新的@PathVairable註釋
做下面是http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/
@RequestMapping("/hotels/{hotelId}")
public String getHotel(@PathVariable String hotelId, Model model) {
List<Hotel> hotels = hotelService.getHotels();
model.addAttribute("hotels", hotels);
return "hotels";
}
感謝您的例子。這是我開始相信的,但我希望我錯過了一些明顯的東西。我的例子中的「99」將是一個變量,例如一個項目ID,所以InternalPathMethodNameResolver解決方案將無法工作。我可能會嘗試創建一個自定義解析器來解析pathInfo。 – 2009-10-08 05:04:32
自定義解析器的問題在於,方法參數類型在Spring中幾乎是預定義的:http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-requestmapping-arguments那裏有很多選擇,但他們都不會做你想做的。這需要在'AnnotationMethodHandlerAdapter'中進行一些繁重的工作才能改變這一點,並且您可能也在尋找自己的註釋類型。儘管如此,假設你想保持你的控制器獨立,如果你有一個基類來提供這個功能,那麼這樣做應該是微不足道的。 – ChssPly76 2009-10-08 05:46:14
玩了一會之後,我同意了。使用getPathInfo並處理控制器中的字符串比編寫處理程序更直接。 – 2009-10-09 17:22:19