Spring和几个控制器匹配单个路径变量

时间:2016-06-01 16:55:28

标签: java spring spring-mvc controller

在Spring应用程序中,我有一个带有以下注释的控制器:

@RequestMapping(value = "/{category}/", method = GET)

我希望其他控制器匹配单个预定义的路径变量,例如

@RequestMapping(value = "/payment/", method = GET)

我认为这是可行的,因为我看到几个网站实现了这种URL。

E.g。您可能有多个类别路径

http ://www.mysite.com/computer/
http ://www.mysite.com/smartphone/
http ://www.mysite.com/printer/

然后其他人为“静态内容”

http ://www.mysite.com/payment/
http ://www.mysite.com/shopping-bag/
http ://www.mysite.com/wish-list/

任何人都可以告诉我该怎么做吗?

2 个答案:

答案 0 :(得分:1)

我用谷歌搜索了一下,我在Spring docs内发现了一些我从未尝试过的东西。我认为你可以使用正则表达式来处理请求映射。

动态路径变量应保持如您所述,即

@RequestMapping(value = "/{category}/", method = GET)
public String dynamicController(@PathVariable String category){
  ...
}

理论上,这将匹配所有网址:

protocol://localhost:8080/123/
protocol://localhost:8080/random-text/
protocol://localhost:8080/whatever-it-comes/

静态控制器应该像这样改变:

@RequestMapping(value = "/{accepted_path:^payment$}/", method = GET)
public String staticController(){//you don't need to consume the path
  //variable accepted_path
  ...
}

使用正则表达式^payment$应该确保URL

protocol://localhost:8080/payment/

仅会被staticController绑定。

您还可以附加几个已接受的路径变量。例如。如果staticController必须与以下网址匹配

protocol://localhost:8080/payment/
protocol://localhost:8080/pay/

然后您应该将"/{accepted_path:^payment$}/"替换为"/{accepted_path:^payment|pay$}/"

未经过测试,但应该做到这一点!

答案 1 :(得分:-2)

这就像你已经做过的那样可行。如果我的网站是http://example.com-

@RequestMapping(value = "/test", method = RequestMethod.GET)

上面的代码会创建http://example.com/test

如果我想要一个带有静态名称和变量(http://example.com/test/variableName)的URI,那么我会使用 -

@RequestMapping(value = "/test/{variableName}", method = RequestMethod.GET)