1

刚刚结束我的最后一次冒险,现在我正在尝试映射更复杂的 URL,并疯狂地尝试使其按照 Spring 文档建议的方式工作。

同样,这些工具是:

  • Java 1.6
  • Spring 3.2 MVC
  • 雄猫 7

我想要做的是匹配 foo/bar/ id形式的 URL,其中id是一个整数。看起来我应该这样做的方式是像这样注释我的控制器方法:

@RequestMapping("/foo/bar/{id}")

然后在 web.xml 中有这个:

<url-filter>/foo/*</url-filter>

或这个:

<url-filter>/foo/bar/*</url-filter>

然后在部署到 Tomcat 之后,我应该能够访问 /mycontext/foo/bar/ id。但这不起作用。

为了完整起见,这里有几个变化和结果:

  • 方法映射:/foo,url-filter:/foo,结果:/mycontext/foo 有效。
  • 方法映射:/foo/*,url-filter:/foo/*,结果:部署时报告方法成功映射到/foo/*,但访问/mycontext/foo/bar 失败。
  • 方法映射:/foo/*,url-filter:/foo/bar,结果:在部署时映射,但访问 /mycontext/foo/bar 失败。
  • 方法映射:/foo/bar,url-filter:/foo/bar,结果:/mycontext/foo/bar 有效。
  • 方法映射:/foo/bar/*,url-filter:/foo/bar/*,结果:在部署时映射,但访问 /mycontext/foo/bar/(anything) 失败。
  • 方法映射:/foo/bar/{id},url-filter:/foo/bar/*,结果:在部署时映射,但访问 /mycontext/foo/bar/(anything) 失败。

所有失败都伴随着来自 mycontext 的 DispatcherServlet 的错误消息,即未找到映射,即使所有失败都报告在部署时设置映射成功。由于我从正确的 DispatcherServlet 收到错误,这表明我的 url-filter 设置很好。但是关于部署成功映射的消息引用了 @RequestMapping 注释中的任何内容,所以我不知道 Spring 首先说它很好,然后说它不匹配。

这里有什么我对通配符不了解的地方吗?

4

1 回答 1

1

如果你有@RequestMapping("/foo/bar/{id}")这个是在与 DispatcherServlet 的 url-pattern 匹配后映射的。例如,考虑一个案例,其中 url 模式如下:

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/dispatcher</url-pattern>
</servlet-mapping>

在这种情况下, DispatcherServlet 将仅在来自客户端的调用为:/dispatcher/foo/bar/1

因此,如果您想说 @RequestMapping 来回应http://<server>/<context>/foo/bar/1说,只需将您的 url-pattern for DispatcherServlet/改为:

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
于 2013-05-01T19:57:37.557 回答