【问题标题】:Separation of Spring MVC Restful application & Rest web serviceSpring MVC Restful 应用与 Rest web 服务的分离
【发布时间】:2014-08-08 06:44:09
【问题描述】:

我已经阅读了一些关于 Spring MVC 和 Rest web 服务的文章。 但是我对使用 spring mvc 实现 web 应用程序有一个困惑。

我的要求是创建一个基于 Spring 的 Web 应用程序并创建设备将使用的 Rest Web 服务。

例如。我想获取对象列表。

  1. 此列表将显示在 jsp 页面上(适用于 Web 应用)
  2. 对象列表将以 json 格式返回(用于远程设备)

我正在遵循这种方法来实现这一点。

//对于远程设备-返回json数据 公共列表 getObjectsInJson() { 返回 myService.getAllSomeObjects(); }

// 获取视图数据的方法 公共 ModelAndView getObjectsInModelNAndView() { // 返回模型和视图 }

请建议这种方法是正确的还是我应该为这两个目的创建单独的控制器? 或任何其他方法?

【问题讨论】:

    标签: java rest spring-mvc


    【解决方案1】:

    最好的方法是创建一个服务并拥有两个不同的控制器。

    一个用于标准 ModelAndView 控制器(@Controller 注释),另一个用于 Rest Controller(@RestController 注释)。

    或者您可以单独拥有 Rest Controller,在您的 JSP 中可以使用 AJAX 调用来获取 JSON 对象列表并对其进行处理和显示。

    【讨论】:

      【解决方案2】:

      根据我在 ASP.NET MVC 方面的经验(与您正在使用的相比)以及 Spring 的 restful API,我建议您使用单独的控制器。

      Web API(指您使用 JSON 向设备等公开的 API)实际上是一种标准的数据表示和传输形式。它不限于某些设备,任何 Web 应用程序都可以从此类 API 中受益。例如,您可以创建一个纯 html5 应用程序并使用 javascript 使用 API。简而言之,这在某种程度上是一种与前端无关的方法。

      另一方面,使用控制器和视图对象的经典 MVC 方法与选择的前端技术(在您的情况下为 Spring MVC + JSP)更紧密地结合在一起。结果和交流取决于那组特定的技术,将它们分开是一个不错的决定。

      证明这种分离的一个示例场景是,例如,如果您需要针对单独的 UI 技术(如移动设备上的本机应用程序),或者您想放弃 JSP + Spring MVC 前端以支持某些东西别的。如果您为 Web API 和 MVC 维护单个控制器,则必须对该控制器进行更改,并可能损害 Web API 的工作逻辑。将这些分开,将允许您在不影响 Web API 的情况下删除 MVC 内容。充其量,您甚至可以将它们拆分为两个单独的 Web 项目。

      【讨论】:

        【解决方案3】:

        应用程序和服务应该是两个独立的项目,并且您使用它们自己的 servlet 来初始化每个项目。将它们结合在一起很好,但它们没有任何共同点。您的服务提供数据。您的应用程序只是使用服务的 API。在您的示例中,您为您的服务使用 Java API,这使得拥有 REST Web 服务变得毫无意义。

        1. 创建您的 REST Web 服务
        2. 创建您的应用程序,该应用程序通过 HTTP 使用您的服务 API,而不是使用它的 Java API。

        【讨论】:

          【解决方案4】:

          这似乎不是最常见的场景,如果你的 jsp 视图只显示 json 中的内容(*),你可以让你的控制器完全不可知的实际格式。

          Spring MVC ContentNegotiatingViewResolver 将根据 URI 中的文件扩展名(xxx.json 而不是 xxx)或 Accept HTTP 请求标头委托给相关的实际视图解析器。

          它是关注点分离的严格应用,控制器将呈现完全委托给(更复杂的)视图层。有趣的是,添加其他演示文稿(pdf、xls 等)将需要对应用程序进行少量修改:添加视图解析器(可选视图类)并配置 ContentNegotiatingViewResolver 以使用它。

          (*) 这可以通过 Tiles 或其他基于布局的框架更简单地实现

          【讨论】:

            猜你喜欢
            • 2017-01-27
            • 2011-06-13
            • 1970-01-01
            • 1970-01-01
            • 2015-02-20
            • 2015-08-04
            • 1970-01-01
            • 2011-02-09
            • 2013-08-14
            相关资源
            最近更新 更多