17

IBM提供了一个演示,展示了在 DWR 2 中使用 Reverse AJAX 是多么容易。另一方面,Scala/LIFT 带有内置的 Reverse AJAX 功能。

  1. 问题:如果这适用于 Spring MVC,有什么经验吗?

  2. 问题:如果您从头开始,那么首选 Scala/LIFT 而不是 DWR/Spring MVC 的优缺点是什么

  3. 问题:在 Scala/LIFT 中,安全处理是否与 Spring Security 中一样复杂?

4

3 回答 3

11

在对多种不同技术进行评估后,Novell 选择了 Lift 的 Comet 架构来为其 Pulse 产品提供动力。

Lift 的 Comet 实现使用单个 HTTP 连接来轮询页面上任意数量的组件的更改。每个组件都有一个版本号。长轮询包括版本号和组件 GUID。在服务器端,一个侦听器附加到长轮询请求中列出的所有 GUID。如果任何组件具有更高的版本号(或在长轮询期间版本号增加),则将增量(描述每个版本更改的一组 JavaScript)发送到客户端。将应用增量并将客户端上的版本号设置为更改集的最高版本号。

Lift 将长轮询与会话管理集成在一起,因此如果在长轮询期间请求进入相同的 URL 会导致连接饥饿,则终止长轮询以避免连接饥饿(某些浏览器每个命名服务器最多有 2 个 HTTP 连接,其他人最多有 6 个)。Lift 还支持用于长轮询请求的 DNS 通配符服务器,这样浏览器中的每个选项卡都可以针对不同的 DNS 通配符服务器进行长轮询。这避免了连接饥饿问题。

Lift 动态检测 Servlet 正在运行的容器以及 Jetty 6 和 7 以及(很快)Glassfish,Lift 将使用平台的“延续”实现来避免在长轮询期间使用线程。

Lift 的 JavaScript 可以位于 jQuery 和 YUI 之上(也可以位于 Prototype/Scriptaculous 之上。)实际的轮询代码包括连接失败的回退和其他处理瞬时连接失败的“优雅”方式。

我看过 Atmosphere、CometD、Akka(所有面向 JVM 的 Comet 技术)。没有人(在我评估它们时)支持每页多个组件或避免连接饥饿。

Novell 从零开始,选择 Lift 来为 Pulse 提供动力是有充分理由的。

在安全性方面,Lift 胜过 Spring + Spring Security。请参阅http://www.mail-archive.com/liftweb@googlegroups.com/msg13020.html

基本上,Lift 的安全性已融入您的应用程序。默认情况下,Lift 应用程序可以抵抗常见问题(跨站点脚本、重放攻击、跨站点请求伪造)。默认情况下,Lift 应用程序可防止参数篡改。Lift 的站点地图定义了站点导航和访问控制规则。这意味着您永远不会拥有无法点击的链接。您不需要有一个必须独立于您的应用程序配置的外部过滤器(例如 Spring Security)(哎呀......移动了一个页面,但忘记确保 Spring Security XML 文件已更新。)

哦...如果您不想使用模板语言,这里有一个完整的 Lift Comet 聊天组件:

class Chat extends CometActor with CometListener {
  private var msgs: List[String] = Nil

  def registerWith = ChatServer

  override def lowPriority = {
    case m: List[String] => msgs = m; reRender(false)
  }

  def render = {
    <div>
    <ul>
    {
      msgs.reverse.map(m => <li>{m}</li>)
    }
    </ul>
    <lift:form>
    {
      SHtml.text("", s => ChatServer ! s)
    }
    <input type="submit" value="Chat"/>
    </lift:form>
    </div>
  }
}

并将其插入页面:<lift:comet type="Chat"/>

于 2010-06-28T22:35:27.020 回答
2
  1. 在我看来,Spring MVC 是构建 AJAXed/COMETed RIA 的一个非常糟糕的选择。ModelAndView 组件旨在处理 HTML 表单并一次渲染整个页面,标记库、验证例程都更适合基于 JSP 和模板的老式开发。对我来说,将 AJAX/COMET 插入 Spring MVC 将永远是一种 hack。但是,如果您要使用 @MVC(将 JSON 与您的 javascript UI 交换)构建 RESTful 服务,它可能会起作用(尽管我更喜欢 Jersey/JAXB 来解决这些问题)。
  2. LIFT 最初是为与 COMET 一起工作而设计的,因此它将是一个更好的选择。虽然我会选择比 LIFT 更轻量级和更少模板的东西(对我来说,它患有与 Spring MVC 相同的疾病)。
  3. 这两个安全系统都只涵盖基本场景,并且需要大量定制才能在实际项目中使用。

    这就是我将用于在 Scala 中构建 COMETed RIA 的方法:

    • Jersey(通过 HTTP/JSON 与 JS UI 进行通信的轻量级 RESTful 服务)+ Atmosphere(用于构建 COMETed 应用程序的可扩展解决方案)+ 任何 JS 框架(jquery、YUI、ext js...)。您还应该看看Akka Framework,它与 Jersey 和 Atmosphere 集成,并允许您在惯用的 Scala 中构建 RIA Web 应用程序。这是 Akka 中的pub-sub COMET 示例
    • 瓦丁+ ICEPush。如果您不想弄脏 JS(尽管 ICEpush 还不是企业级解决方案),这对您来说将是一个非常舒适的组合。
于 2010-06-24T08:26:19.430 回答
0

另一个以纯 Java(或任何其他 JVM 语言,包括 Scala)为中心的替代方案是ItsNat Comet

于 2011-01-17T14:22:51.963 回答