在 Spring MVC 中使用部分 URL 作为控制器的参数
Posted
技术标签:
【中文标题】在 Spring MVC 中使用部分 URL 作为控制器的参数【英文标题】:Use part of the URL as an argument to a controller in Spring MVC 【发布时间】:2010-12-04 19:35:52 【问题描述】:例如,使用 URL
foo.com/bar/99
99 将作为参数直接提供给控制器中的方法。控制器映射到/bar
对于熟悉 ASP.NET MVC 或 Django 的人来说,这类似于前者中的 routes.MapRoute 和后者中的 urlpatterns 中使用 (?P\d+)。
可以直接处理 Http Request 对象中的数据来获取这个,但是我想知道 Spring MVC 是否内置了对此的支持(特别是 2.5 版)。
【问题讨论】:
【参考方案1】:对于使用 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";
【讨论】:
【参考方案2】:不,Spring 不支持开箱即用。但是,您可以使用 @RequestMapping 和适当配置的 InternalPathMethodNameResolver
将路径映射到方法 name:
@Controller
@RequestMapping("/bar/*")
public class MyController
...
public String do99(HttpServletRequest request)
...
您必须将InternalPathMethodNameResolver
的prefix
指定为“do”才能使上述方法起作用,因为方法名称不能以数字开头。如果您使用“foo.com/bar/baz”作为 URL 并调用您的方法 baz
,则无需额外配置。
如果您不想使用方法名称映射,那么获取“99”作为参数就像从您的方法中的request.getPathInfo()
获取它一样简单。
【讨论】:
谢谢。这是我开始相信的,但我希望我只是错过了一些明显的东西。我的示例中的“99”将是一个变量,例如一个项目 id,因此 InternalPathMethodNameResolver 解决方案将不起作用。我可能会尝试创建一个自定义解析器来解析 pathInfo。 自定义解析器的问题是方法参数类型在 Spring 中几乎是预定义的:static.springsource.org/spring/docs/2.5.x/reference/… 有很多选择,但没有一个能满足您的需求。在AnnotationMethodHandlerAdapter
中需要一些繁重的工作才能改变它,而且您可能也在考虑定义自己的注释类型。但是,所有这些都假设您希望保持控制器独立 - 如果您可以使用基类来提供此功能,那么这样做应该很简单。
玩了一会儿我同意了。使用 getPathInfo 并在控制器中处理字符串比编写处理程序更直接。以上是关于在 Spring MVC 中使用部分 URL 作为控制器的参数的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC:如何在 Thymeleaf 中获取当前 url
java spring mvc 怎么在程序内更改url的参数名