在 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) 
    ...
  

您必须将InternalPathMethodNameResolverprefix 指定为“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

带有 JSON 的 Spring MVC 多部分请求

如何在 Spring MVC 中使用 AJAX 渲染视图

java spring mvc 怎么在程序内更改url的参数名

如何在 Spring MVC 中基于控制器和操作方法创建 URL?

Spring MVC:复杂对象作为 GET @RequestParam