使用Spring的@RequestMapping和通配符

时间:2011-05-10 18:41:22

标签: spring servlets request-mapping

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

/results/**

也就是说,我希望像www.hostname.com/MyServlet/results/123/abc/456/def/这样的网址可以转到此方法。我有:

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

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

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

  1. 如果我添加另一个servlet映射,如<url-pattern>/another-mapping/*</url-pattern>,该怎么办?它也会映射到该方法!我该如何分开两个?
  2. 为什么网址格式/results/*有效,而/results/**则不然?根据蚂蚁路径样式,**表示包含嵌套的/字符,而*则在下一个/处停止。因此,它应该只能成功映射像/results/123这样的网址,而不是/results/123/abc/。正确?

2 个答案:

答案 0 :(得分:6)

也许在您的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'模式匹配器(特别是**)。

答案 1 :(得分:5)

  

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

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

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

  

为什么url-pattern / results / *有效,而/ results / **却没有?根据ant路径样式,**表示包含嵌套/字符,而*表示在下一个/。因此,它应该只能成功映射像/ results / 123,bot NOT / results / 123 / abc /这样的URL。正确?

web.xml中的网址格式不是蚂蚁风格模式,因此只允许使用.../**.xxx个通配符。