Spring MVC Controller中的硬编码@RequestMapping URL

时间:2011-12-01 09:34:12

标签: java spring model-view-controller spring-mvc annotations

我正在学习Spring 3,我正在一个简单的Web应用程序中使用它。

现在我正在使用注释实现Spring MVC Controller,我想知道: 是否有使用@RequestMapping注释的最佳做法?

我的意思是:我已经看到通常在这个注释中映射的URL在类中被硬编码...
有没有办法以“松散耦合的方式”传递URL(以获得更可重用的类)?

我知道可以使用一些外卡,但我认为这不是解决方案......我错了吗?

修改

我添加一个例子来更好地解释我的怀疑。

假设我希望我的控制器由/foo/bar/baz/mypage.htm的请求触发,在我的控制器中,处理程序方法将使用@RequestMapping("/foo/bar/baz/mypage")进行注释。

现在我决定将触发我的控制器的URL更改为/foo/bar/otherpage.htm,因此我需要编辑我的类,将@RequestMapping("/foo/bar/otherpage")放在我的处理程序方法上,重新编译项目并再次部署它。

在我看来并不那么实际......

3 个答案:

答案 0 :(得分:5)

目前带注释的控制器不是很容易配置。

据我所知,解决此问题的唯一方法是使用备用HandlerMappings来配置控制器的“基本URL”。例如,如下:

// Note the absense of @Controller to prevent this controller
// from being discovered by DefaultAnnotationHandlerMapping
public class FooController {
    @RequestMapping("/list") public String list(...) { ... }
    @ReqeustMapping("/save") public String save(...) { ... }
}

<bean 
    class = "org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping" />

<bean name = "/foo" class = "FooController" />
<bean name = "/bar" class = "FooController" />

在此示例中,FooController分别处理/foo/list/foo/save/bar/list/bar/save两个实例。

即将推出的Spring 3.1将有一个改进的Spring 3.1架构(Spring 3.1 M2: Spring MVC Enhancements)似乎更灵活,但我尚未检查它。

答案 1 :(得分:1)

我认为你正试图解决错误的问题。如果您想更改与控制器匹配的页面,则需要在某处更改文件。您是否希望使用相关代码更改文件,您是否愿意使用指定URL和类的某些XML文件,然后您必须担心文件位于右侧在运行时放置?

至少应该有almost no code in your controller,您应该将控制器视为可编译的配置文件。此外,如果您使用的是MavenAnt之类的构建系统,而不是使用Javac手动编译单个文件,那么编译时间应该不是问题。如果它变为一个,则可能是时候将项目拆分为子项目了。

我认为你应该接受这个并且看到它可能不是你认为的问题。另外,你知道控制器可以匹配表达式而不仅仅是文字字符串吗?这为您的命名提供了一些灵活性。

如果你真的想,你可以回到Spring 2.0 style XML configuration,但我认为没有人会建议。

答案 2 :(得分:0)

我认为这不是最佳做法,但您尝试使用@PathVariable注释ep>

 @RequestMapping(value="/path/{word}", method=RequestMethod.GET)
public ModelAndView myRestMethod(@PathVariable String word) {
    ...
}