Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC控制器中的硬编码@RequestMapping URL_Java_Spring_Model View Controller_Spring Mvc_Annotations - Fatal编程技术网

Java Spring MVC控制器中的硬编码@RequestMapping URL

Java Spring MVC控制器中的硬编码@RequestMapping URL,java,spring,model-view-controller,spring-mvc,annotations,Java,Spring,Model View Controller,Spring Mvc,Annotations,我正在学习Spring3,并在一个简单的web应用程序中使用它 现在,我正在使用注释实现一个Spring MVC控制器,我想知道: 是否有使用@RequestMapping注释的最佳实践 我的意思是:我已经看到这个注释中映射的URL通常是在类中硬编码的… 有没有一种方法可以通过“松散耦合”的方式传递URL(以获得更可重用的类)? 我知道有一些外卡可以使用,但我认为这不是解决办法。。。我错了吗 编辑: 我加了一个例子来更好地解释我的疑问 假设我希望我的控制器由对/foo/bar/baz/mypag

我正在学习Spring3,并在一个简单的web应用程序中使用它

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

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

我知道有一些外卡可以使用,但我认为这不是解决办法。。。我错了吗

编辑:

我加了一个例子来更好地解释我的疑问

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

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


在我看来,这似乎不太实际…

当前带注释的控制器不太可配置

据我所知,解决这个问题的唯一可能方法是使用alternative来配置控制器的“基本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(...) { ... }
}


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


即将到来的Spring 3.1将有一个改进的Spring 3.1体系结构(),它似乎更加灵活,尽管我还没有检查它。

我认为这不是一个最佳实践,但您尝试过@PathVariable注释吗

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

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

不管怎样,您应该将控制器看作是可编译的配置文件。此外,如果您使用的是类似于或的构建系统,而不是使用Javac手工编译单个文件,那么编译时间不应该是一个问题。如果它成为一个,那么可能是时候将您的项目拆分为子项目了

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


如果你真的想这样做,你可以退一步,但我认为没有人会推荐你这样做。

动态url是什么意思?在运行时构造?在java代码中?@soulcheck抱歉…'动态“这不是正确的词。。。我的意思是,将URL传递给注释,而不将其硬编码到类中。我可以说是“松散耦合方式”。(我编辑了这篇文章)@David C:你为什么要这样做。-“有什么最佳实践吗…”我问,因为最佳实践总是有原因的。@Ralph我认为在
@RequestMapping
注释中有一个参数化的URL可能会有用。例如,如果我决定更改页面的“路径”,我需要修改类中的url,重新编译并重新部署应用程序。对吗?如果我错了,请纠正我。问问自己,您(动态地)更改现有应用程序中URL模式的频率,以及是否值得为其构建支持。根据我的经验,这通常只是作为更大重构的一部分进行的,在这种情况下,您的应用程序将被重建/重新部署。谢谢您的建议,但这与我的问题不符…:)Spring3.1M2:SpringMVC增强功能-移动到,这可能是自Spring3.1以来不受支持的
 @RequestMapping(value="/path/{word}", method=RequestMethod.GET)
public ModelAndView myRestMethod(@PathVariable String word) {
    ...
}