REST spring服务和JQUERY Web集成最佳实践

时间:2014-02-16 00:38:26

标签: java jquery spring spring-mvc architecture

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我同意你的观点,版本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垃圾。