这类似于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() {...}
这可以将请求引导到我的方法,但引出了几个问题:
<url-pattern>/another-mapping/*</url-pattern>
,该怎么办?它也会映射到该方法!我该如何分开两个?/results/*
有效,而/results/**
则不然?根据蚂蚁路径样式,**
表示包含嵌套的/
字符,而*
则在下一个/
处停止。因此,它应该只能成功映射像/results/123
这样的网址,而不是/results/123/abc/
。正确?答案 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
个通配符。