2011-12-01 31 views
6

我正在学习Spring 3,并将其用于简单的Web应用程序。Spring MVC控制器中的硬编码@RequestMapping URL

现在我正在实现一个使用注释的Spring MVC控制器,我在想: 有没有使用@RequestMapping注释的最佳实践?

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

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

编辑:

我想补充一个例子,以更好地解释我的疑问。

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

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

在我看来不是那么实用...

+0

'动态网址'是什么意思?在运行时构造?在你的java代码? – soulcheck

+0

@soulcheck对不起...'动态'这不是正确的词......我的意思是,将URL传递给注释,而不将其硬编码到类中。 我可以用'松散耦合的方式'来说。 (我已编辑帖子) – davioooh

+0

@David C .:你为什么想这样做。 - “有没有最佳实践......”我问,因为最佳实践始终是一个理由激励。 – Ralph

回答

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),虽然我还没有检查它,但似乎更灵活。

+0

Spring 3.1 M2:Spring MVC增强 - 移至 https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements –

+0

而这可能是不支持的,因为Spring 3.1 –

0

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

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

谢谢你的建议,但这不符合我的问题... :) – davioooh

1

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

无论如何应该有almost no code in your controller,您应该将您的控制器视为可编译的配置文件。另外,如果您正在使用构建系统(如MavenAnt),并且不使用Javac手动编译单个文件,则编译时间不应成为问题。如果它成为一个,那么可能是将项目分解为子项目的时候了。

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

如果你真的想,你可以回落到Spring 2.0 style XML configuration,但我不认为有人会推荐。