Spring MVC中生成路由的推荐方法是什么?

6
在基于Java的Spring MVC Web应用程序中,生成路由的推荐方法是什么?我希望避免在整个应用程序中硬编码路径。
2个回答

2
假设我们谈论的是路径RequestMapping等。在我的应用程序中,我有一个只包含一堆公共静态常量的类,我在@RequestMapping注释中引用这些常量。
因此,这些常量可能如下所示:
public class Pages {
  public static final String FOO_URL "foo/foo.action"
  public static final String FOO_VIEW "test/foo"

  public static final String BAR_URL "bar/bar.action"
  public static final String BAR_VIEW "test/bar"
}

然后在你的控制器中,你可以像这样引用它们:

@RequestMapping(value=Pages.FOO_URL, method=RequestMethod.GET)
public String handleFoo(Model model) {
      return Pages.FOO_VIEW;
    }

由于它们都在一个位置,因此更改它们非常容易。


也许你可以提供一个代码示例,展示它看起来是什么样子的。 - Nick DeVore
你如何处理值替换?你是否在你的页面类上使用静态方法?例如:Page.urlFor(page) 生成 /pages/1,其中页面ID为1? - Zach Dennis
在我们的应用程序中,我们不需要这样做 - 所有页面都有唯一的名称。查看Spring文档后,我没有看到需要更改的要求 - 也许我漏掉了什么? - kieron

-1

你说你想避免在整个应用程序中硬编码路径,但通常所有的控制器(因此所有的URL映射)都驻留在一个目录中。例如,如果你有一个Maven结构,它们会在类似于src/main/java/com/mycompany/myapp/web/controllers/的地方。你是否想象过自己会问这样的问题:“我把/myapp/v1/search端点的URL映射放在哪里了?”,然后找不到它在/src/main/java/com/mycompany/myapp/web/controllers/V1SearchController.java中?

另外,一旦你选择了URL,它们就几乎是固定的,因为它们代表着与客户端的接口,改变它们可能意味着破坏向后兼容性。

并不是我认为一个带有一堆静态final字符串的类很糟糕,我只是认为它大多数情况下是不必要的。


我主要关注应用程序中生成URL所使用的约定。Rails框架在这方面做得非常好。例如,pages_path将生成“/pages/”,而page_path(page)将生成“/pages/1”。要添加查询参数,您可以像这样添加它们:page_path(page,:foo => 2,:bar => 3),这将生成“/pages/1?foo=2&bar=3”。我发现这种约定比硬编码路径和自己构建URL更易读、易发现且不容易出错。希望除了手动字符串连接之外还存在其他约定或库。 - Zach Dennis
当然不要更改URL... 将所有路由放在一个地方使得新的开发人员能够在一个地方查看您的Web应用程序的结构,而不必打开数十个控制器。 - trusktr
没错,我通常会用 README 或其他文档来解决这个问题,但一个包含一堆常量的文件也可以。 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接