9

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

/results/**

也就是说,我希望任何 URL 都喜欢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. 为什么 url 模式/results/*有效,而/results/**无效?根据 ant path 样式,**意味着包含嵌套/字符,而*在 next 处停止/。因此,它应该只成功映射一个 URL /results/123,例如 bot NOT /results/123/abc/。正确的?
4

2 回答 2

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”模式匹配器(特别是 **)。

于 2011-05-10T18:52:00.570 回答
5

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

使用您当前的配置,您不能。如果要映射到多个 URL 模式并DispatcherServlet区分它们,可以在.DefaultAnnotationHandlerMappingalwaysUseFullPath = "true"@RequestMapping

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

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

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

于 2011-05-10T18:50:08.247 回答