【问题标题】:Using Spring's @RequestMapping with wildcards使用带有通配符的 Spring 的 @RequestMapping
【发布时间】:2011-08-22 17:24:12
【问题描述】:

这类似于this question,但我仍然对自己的情况感到困惑。我想将这种蚂蚁风格的模式映射到控制器方法:

/results/**

也就是说,我希望任何像 www.hostname.com/MyServlet/results/123/abc/456/def/ 这样的 URL 都可以访问此方法。我有:

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/results/*</url-pattern>
</servlet-mapping>

和:

@RequestMapping(value="/**", method=RequestMethod.GET)
public ModelAndView handleRequest() {...}

这可以将请求引导到我的方法,但会导致我提出几个问题:

  1. 如果我添加另一个 servlet 映射,例如 &lt;url-pattern&gt;/another-mapping/*&lt;/url-pattern&gt;,会怎样?它也将映射到该方法!如何将两者分开?
  2. 为什么 url 模式 /results/* 有效,而 /results/** 无效?根据 ant 路径样式,** 表示包含嵌套的/ 字符,而* 停止在下一个/。因此,它应该只成功映射像 /results/123 这样的 URL,而不是 /results/123/abc/。对吗?

【问题讨论】:

  • 刚刚开始赏金。在第一个答案中看我的 cmets...

标签: spring servlets request-mapping


【解决方案1】:

也许在您的 servlet 映射中,您希望将所有流量定向到“/*”。这样,您可以在控制器中区分不同@RequestMapping 使用什么方法。

<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

@RequestMapping(value="/results/**", method=RequestMethod.GET)
public ModelAndView handleResults() {...}

@RequestMapping(value="/another-mapping/**", method=RequestMethod.GET)
public ModelAndView handleAnotherMapping() {...}

希望以上内容对数字 1 有所帮助。就数字 2 而言,我认为您不能在 web.xml 域描述符中使用“ant-style”模式匹配器(特别是 **)。

【讨论】:

  • 嗯好吧,我以为我读过它使用 Ant 风格,但我想我错了。所以 /* 对应嵌套的 /abc/123/.......
【解决方案2】:

如果我添加另一个 servlet 映射,例如 /another-mapping/* 会怎样?它也将映射到该方法!如何将两者分开?

使用您当前的配置,您不能。如果要将DispatcherServlet 映射到多个URL 模式并加以区分,可以将DefaultAnnotationHandlerMapping 声明为alwaysUseFullPath = "true",并在@RequestMapping 中使用完整路径。

或者,您可以将DispatcherServlet 映射为&lt;url-pattern&gt;/*&lt;/url-pattern&gt; 并在@RequestMapping 中使用完整路径,而无需重新配置DefaultAnnotationHandlerMapping。虽然在这种情况下你需要configre exclusions for static content

为什么 url 模式 /results/* 有效,而 /results/** 无效?根据 ant 路径样式,** 表示包含嵌套的 / 字符,而 * 停止在下一个 / 处。因此,它应该只成功映射像 /results/123 这样的 URL,而不是 /results/123/abc/。对吧?

web.xml 中的 URL 模式不是 ant 样式的模式,因此它们中只允许使用 .../**.xxx 通配符。

【讨论】:

  • 好的,所以我将 添加到我的 DefaultAnnotationHandlerMapping bean 中。 @RequestMapping 值应该是什么?抱歉,我是新手……
  • @Tony:应该是/results/**
  • 好的,我试过了,我得到:“没有为 servlet 请求找到匹配的处理程序方法:路径'/abc/123'”
  • 您是否也将 MyServlet 的 web.xml 域描述符的 servlet 映射更改为“/”?
  • 好的,我将 Dispatcher servlet 映射到“/”,在我的控制器中有一个 @RequestMapping("/results/**") 映射方法,并在我的默认 servlet 上映射“。 html”、“.js”等。除了 URL 像“/results/123/abc”,它会给出 404。任何建议?
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 2018-08-30
  • 2016-10-20
  • 2013-08-25
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
相关资源
最近更新 更多