2013-03-28 63 views
3

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

的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 所以,我怎么这个URL模式映射?

+0

尝试在请求映射开始时添加'/',看看是否有所作为。它应该与url-pattern/*一起工作,并通过/ contextPath/activate/123456789访问它。另外,请检查您的日志以了解可能导致Web应用程序无法正常启动的任何启动错误。 – NilsH

回答

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) { 
    ... 
} 

[编辑]

就像莱昂内尔说,你应该有这个配置全URL(@RequestMapping(value = {"/activate/{key}"})使用方法:

<url-pattern>/</url-pattern> 
+0

行,它的工作原理。但在我的情况下,它会导致重定向循环。例如,如果激活成功,我通过'new ModelAndView(redirect:./ success)'重定向它,并将其根目录作为'myApp/activate',所以'success'匹配'/ {key}'。但是我希望我的root只是'myApp'。我应该使用完整路径来解决这个问题还是有其他方法? –

+0

哼,我认为你需要使用全路径URL作为root用户'myApp'使用/。 –

1

我见过的所有请求映射都使用了斜杠。你有没有试过这样: @RequestMapping( “/启动/ {}键”)

2

更改URL-pattern元素下文。一个斜线,没有星号

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

会发生什么事是,第一servlet容器所请求的URL匹配到模式,然后调用Spring的DispatcherServlet,其分派到正确的控制器。

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

当您使用单斜杠/时,只有斜杠与servlet容器匹配,这会使字符串/activate/123456789与DispatcherServlet匹配;通过这个字符串,DispatcherServlet能够找到控制器。

+0

因为DispatcherServlet与它们匹配,所以不会丢失URL子字符串。 '/ *'会匹配'/'后的任何内容,但'*'仍然可用。这是他的RequestMapping中领先的'/'缺失。 –

+0

虽然我喜欢它,但上面的解释并不完全正确,我认为在中使用*存在问题。我只能在web.xml中使用单个/预测可用的内容,然后以/ ...开头的所有请求映射。/activate/{key}等。web.xml模式所允许的一组只有在不包含带*的路径并且控制器具有完全匹配的请求映射路径集时才可预测地工作。我试过的任何东西都会产生匹配模式的错误。 – berhauz