使用@RequestMapping匹配URL模式

时间:2013-03-28 14:06:50

标签: spring jsp url spring-mvc

这与this问题非常相似,但我无法弄清楚如何匹配网址模式。

的web.xml:

<servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/activate/*</url-pattern>
</servlet-mapping>

我的控制器:

@RequestMapping(value = {"activate/{key}"}, method = RequestMethod.GET)
public ModelAndView activate(@PathVariable(value = "key") String key) {
  ...
}

当我尝试访问localhost:9999/myApp/activate/123456789时,出现以下错误:

No mapping found for HTTP request with URI [/myApp/activate/123456789] in DispatcherServlet with name 'dispatcher'

我也试过<url-pattern>/*</url-pattern>,同样的事情发生了。

但是,将<url-pattern>/activate/*</url-pattern>更改为 <url-pattern>/**</url-pattern>没有出现错误,但我仍然得到404。 那么,我该如何映射这个网址模式?

3 个答案:

答案 0 :(得分:3)

您需要在@RequestMapping上添加斜杠,例如:

@RequestMapping(value = {"/activate/{key}"}, method = RequestMethod.GET)
public ModelAndView activate(@PathVariable(value = "key") String key) {
  ...
}

无论如何,如果您打算访问以下上下文:

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

你不能试试这个:

@RequestMapping(value = {"/{key}"}, method = RequestMethod.GET)
public ModelAndView activate(@PathVariable(value = "key") String key) {
  ...
}

[被修改]

与Leonel说的一样,您应该将此配置与完整网址(@RequestMapping(value = {"/activate/{key}"})一起使用:

<url-pattern>/</url-pattern>

答案 1 :(得分:2)

将url-pattern元素更改为以下内容。 单个斜杠,没有星号

<url-pattern>/</url-pattern>

首先,servlet容器将请求的URL与模式匹配,然后调用Spring的DispatcherServlet,它将调度到正确的控制器。

当您使用斜杠+星号/*时,URI /activate/123456789的片段会匹配,这会让DispatcherServlet的空字符串找到控制器。

当你有一个斜杠/时,只有斜杠与servlet容器匹配,这使得字符串/activate/123456789与DispatcherServlet匹配;使用此字符串,DispatcherServlet能够找到控制器。

答案 2 :(得分:1)

我见过的所有请求映射都使用了一个前导斜杠。你试过这个:     @RequestMapping( “/激活/ {键}”)