使用Spring的@RequestMapping和通配符

Ton*_*y R 9 spring servlets request-mapping

这与这个问题类似,但我仍然对我的情况感到困惑.我想将这种蚂蚁风格的模式映射到控制器方法:

/results/**
Run Code Online (Sandbox Code Playgroud)

也就是说,我希望任何URL www.hostname.com/MyServlet/results/123/abc/456/def/都可以使用此方法.我有:

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/results/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

和:

@RequestMapping(value="/**", method=RequestMethod.GET)
public ModelAndView handleRequest() {...}
Run Code Online (Sandbox Code Playgroud)

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

  1. 如果我添加另一个servlet映射,如<url-pattern>/another-mapping/*</url-pattern>??? 它也会映射到该方法!我该如何将两者分开?
  2. 为什么url-pattern /results/*工作,而/results/**不是?根据ant路径样式,**意味着包含嵌套/字符,而*在下一个停止/.因此,它应该只能成功映射一个URL,如/results/123bot not /results/123/abc/.对?

nic*_*ild 6

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

<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

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

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

希望上面的内容对数字1有帮助.至于数字2,我认为你不能在你的web.xml域描述符中使用'ant-style'模式匹配器(特别是**).


axt*_*avt 5

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

使用您当前的配置,您不能.如果你想映射DispatcherServlet到多个URL模式以及它们之间的区别,你可以声明DefaultAnnotationHandlerMappingalwaysUseFullPath = "true"和使用的完整路径@RequestMapping.

或者,您可以映射DispatcherServlet<url-pattern>/*</url-pattern>并使用完整路径@RequestMapping而无需重新配置DefaultAnnotationHandlerMapping.虽然在这种情况下,您需要为静态内容配置排除项.

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

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