【问题标题】:REST spring services and JQUERY web integration best practicesREST spring 服务和 JQUERY web 集成最佳实践
【发布时间】:2014-03-15 08:54:37
【问题描述】:

关于使用 spring-mvc(REST 服务)和 jQuery 设计系统的最佳方式。我认为存在以下方法。

  1. 一个包含 spring 服务和 jQuery 东西的 war 文件,通过这种方法,我们拥有所有可用于 spring-mvc 的域对象,我们可以创建初始 jsp 页面,然后使用 jQuery 调用刷新一些元素服务。
  2. 两个war文件,一个包含spring服务,另一个包含spring-mvc的东西和jquery,在这种情况下,页面的创建可以由jsp页面完成,也可以通过jquery调用我们的服务来刷新元素,但是要使这可能我们需要在第二次战争中使用一个通用的域对象库,并且在需要创建的一些控制器中内部使用restTemplate(听起来像重复代码)。
  3. 有一个运行 REST 服务的 war 文件和另一个“包”,没有任何 java 或 spring 的东西,只有 jquery,这意味着所有的调用和信息检索必须使用 jquery 完成,初始 jsp 页面创建不能用这个完成选项,所有内容都是通过 REST 服务获取的。 (无需使用内部控制器通过 java 调用服务)

想来想去,一、二有以下缺点。

  • 将服务和 web 内容放在同一个 war 文件中听起来像 SOA 中的一个坏主意,这种战争的移动将导致移动不需要的 jquery 和 web 内容。
  • 混合 jsp 和 jquery 的东西听起来不是一个好主意,但我认为这是一种常见的做法(我想知道为什么?),使用它我认为我们需要在第二次战争中创建一些控制器来最初创建网页,使用 restTemplate 获取初始信息,然后使用 jquery 调用更新或刷新。感觉有一个控制器只是为了将数据检索到服务中,为什么不直接去……

我只想实现第三种方法,但问题是:有任何我没有看到的缺点或任何 在使用这种方法之前我应该​​知道的建议?还有任何建议来处理这种系统,很高兴听到你的意见,来自 java 和 jquery 开发人员

【问题讨论】:

  • 对我来说,您似乎正在寻找两种不同的理想,托管您的 API 的 Spring 应用程序和可以托管在任何地方的前端应用程序......我会编写“JQuery”应用程序并将其托管在...任何东西上,在您的java应用程序上启用xsite,然后调用您的rest url。如果你想使用 spring 来构建一个前端应用程序。没关系,但如果你想让 spring 主持休息......让它主持休息。

标签: java jquery spring spring-mvc architecture


【解决方案1】:

我同意您的观点,即版本 3 为您提供了最大的灵活性,并且是您在设计界通常会看到的。

将其余部分和前端完全视为单独的应用程序。如果操作正确,您可以拥有一个非常健壮的应用程序,并且具有适当的敏捷性。

  • 版本 1:在初始控制器调用中加载页面,并使用 jquery 进行后续服务调用。所有代码都存在于一个包中。

    缺点是紧耦合。您现在受限于您的 api 语言,不再为您的数据和服务提供基于服务的方法。

    我看到这个版本主要应用在应用程序开发人员更关心异步前端调用而不是基于 SOA 的语言时。

  • 版本 2:包含 Spring Services 的战争,以及 JS 的战争。

    这种方法的问题可以通过使用 jar 而不是另一个服务器应用程序来解决。虽然这种方法很常用,但缺点仍然是依赖外部封装。

    使用包含所有代码的 jar 来访问数据库并创建与控制器用于序列化和响应 Web 请求的代码分开的域对象,创建了一种非常简洁的方式来管理您的 api,但这会产生复杂性和使用版本 3 可以避免的额外组件。它还提供了与版本 1 中相同的奇怪行为。

    我已经看到开发纯 api 应用程序的团队采用了这种方法。我还没有看到在还需要前端组件的团队中这样做。在这些情况下使用了方法一或三。

  • 版本 3:创建一个仅处理前端职责的应用程序 创建一个处理服务器端职责的应用程序。

在版本 2 和版本 3 中,将服务调用与 http 调用分开。让它们与众不同,因为它允许模块化。

比如我们需要响应http请求

@Controller
class MyController{
    @Autowired
    private MyService service;
    @GET
    public String getData(String dataId){
       return service.getData(dataId);
    }
}

我们需要响应活跃的 mq 请求

 Message m = queueReceiver.receive();
 if (m instanceof DataRequest) {
     DataRequest message = (DataRequest) request;
     queueSender.send(service.getData(request.getDataId())); //service call
 } else {
     // Handle error
 }

此外,它使您能够管理您需要在不同于服务端的 http 端处理的内容。

@GET
public String getData(HttpRequest request, String dataId){
   if(!this.handleAuth(request)){
      throw new 403();
   }
   try{
      return service.getData(dataId);
   catch(Exception e){
      throw new WrappedErrorInProperHttpException(e);
   }
}

这允许您的服务层处理仅对这些服务有意义的任务,而无需处理所有的 http 废话。并让您处理与服务层分开的所有 HTTP 垃圾。

【讨论】:

  • 我认为您理解我的部分观点,但完全不理解,我同意您的观点,即 REST 服务可以在服务器中运行而没有其他任何东西,我可以在另一个中使用 jquery 调用这些服务前端应用程序。但是为什么有些应用程序使用 spring-mvc + jquery 来完成这个过程,仅仅使用纯 jquery 就足够了,基于我们在这两种方法中可能具有的优点或缺点?这应该是第二种方法退出的任何原因。 (混合spring-mvc和jquery)调用rest api
  • 我认为没有理由同时使用两者...根据我的经验(这是有限的),我还没有看到这样做。 RestTemplate 用于服务器中的客户端调用...如果 RestTemplate 用于调用现有控制器内的内部 api...我会很困惑为什么要这样做。如果 JQuery 存在,在 jsp 中是有意义的,因为浏览器会加载所有数据,并在加载数据后对服务器进行 http 调用。这会是有道理的...但是将它们链接起来... JQuery ---> Controller --> rest call --> controller --> JQuery,这没有意义。
  • 我现在看到你的问题了......对此感到抱歉。让我澄清一下我的答案。
  • 如果我回答了您的问题,请告诉我。如果没有解决问题,我可以更好地尝试并找到一些文档。
  • 但是在version2中,不涉及restTemplate,如果有两次war且数据库只连接到REST,如何创建初始页面第一个用户点击中的信息 API,这就是为什么你需要使用resttemplate调用那些REST服务并获取初始信息,然后你可以直接使用jquery调用REST api进行更新,为什么使用这种方法?
猜你喜欢
  • 1970-01-01
  • 2012-10-08
  • 2014-07-07
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多