反向AJAX(Comet)和Spring MVC与Scala/LIFT?
有一个例子说明了如何简单地将反向AJAX与DWR2一起使用。另一方面,Scala/LIFT具有内置的反向AJAX功能反向AJAX(Comet)和Spring MVC与Scala/LIFT?,scala,spring-mvc,spring-security,lift,dwr,Scala,Spring Mvc,Spring Security,Lift,Dwr,有一个例子说明了如何简单地将反向AJAX与DWR2一起使用。另一方面,Scala/LIFT具有内置的反向AJAX功能 问:如果这在SpringMVC中运行良好,有什么经验吗 问:如果您从头开始,那么与DWR/SpringMVC相比,您更喜欢Scala/LIFT有哪些优点和缺点 问题:在Scala/LIFT中,安全处理是否与Spring security一样复杂 在我看来,SpringMVC是构建AJAXed/COMETed RIA的一个非常糟糕的选择。ModelAndView组件旨在处理HTML
这就是我在Scala中构建COMETed RIA时要用到的:
- (通过HTTP/JSON与JSUI通信的轻量级RESTful服务)+(用于构建COMETed应用程序的可伸缩解决方案)+任何JS框架(jquery、YUI、ExtJS等)。您还应该看看,它和Jersey和Atmosphere都集成在一起,允许您在惯用的Scala中构建RIA web应用程序。这是在阿卡的一张照片
- +。如果您不想让JS弄脏您的手(尽管ICEpush还不是一个企业级解决方案),那么它将是一个非常舒适的组合李>
Lift的Comet架构是Novell在评估了许多不同技术后选择的,用于为其脉冲产品供电 Lift的Comet实现使用单个HTTP连接轮询页面上任意数量的组件的更改。每个组件都有一个版本号。长轮询包括版本号和组件GUID。在服务器端,侦听器连接到长轮询请求中列出的所有GUID。如果任何组件的版本号较高(或在长轮询期间版本号增加),则会将增量(描述每个版本更改的一组JavaScript)发送到客户端。将应用增量,并将客户端上的版本号设置为更改集的最高版本号 Lift将长轮询与会话管理集成在一起,因此,如果在长轮询期间请求进入同一URL,将导致连接饥饿,则长轮询将终止以避免连接饥饿(某些浏览器每个命名服务器最多有2个HTTP连接,其他浏览器最多有6个)。Lift还支持DNS通配符服务器进行长轮询请求,这样浏览器中的每个选项卡都可以针对不同的DNS通配符服务器进行长轮询。这避免了连接不足问题 Lift动态检测Servlet在Jetty 6&7和(很快)Glassfish上运行的容器,Lift将使用平台的“continuations”实现,以避免在长轮询期间使用线程 Lift的JavaScript可以位于jQuery和YUI之上(也可以位于Prototype/Scriptaculous之上)。实际的轮询代码包括连接失败时的回退以及处理瞬时连接失败的其他“优雅”方式 我研究了Atmosphere、CometD和Akka(所有面向JVM的Comet技术)。没有人(在我评估他们时)支持每页多个组件或避免连接饥饿 Novell从零开始,出于一些很好的原因选择了Lift为Pulse供电 在安全性方面,电梯胜过弹簧+弹簧安全性。看 基本上,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>
}
}
类聊天通过CometListener扩展CometActor{
私有变量msgs:List[String]=Nil
def registerWith=ChatServer
覆盖def低优先级={
案例m:List[String]=>msgs=m;重新加载(false)
}
def呈现={
{
msgs.reverse.map(m=>- {m}
)
}
{
text(“,s=>ChatServer!s)
}
}
}
将此插入页面:
另一种选择,纯Java(或任何其他JVM语言,包括Scala)为中心。嘿,David,谢谢你提供了非常有用的答案。我已经有了这样一种印象:除了电梯,别无选择,现在我知道这个假设是正确的。所以斯卡拉。。。我要学的另一种语言…:-(期待在Lift Google Group上与您见面