Web应用程序如何与服务器通信?

3
假设我想创建一个协作式的Web应用程序,用户可以同时在一个图表上进行工作。我有一个交互式网站(HTML/CSS/JavaScript)在客户端,还有一个Java应用程序在服务器端同步一个集中的模型。 客户端和服务器如何交换消息?为了更好地了解系统应该如何工作,这里有一些细节和小插图:
要求:
  • 底层技术应支持授权通信以显示/隐藏敏感信息。
  • 图表的模型应仅存在于服务器上(集中的模型,无副本),其中更改应广播到其他用户(正在编辑相同文档的其他浏览器)。
  • 在接收到模型更改后,服务器将执行计算量更高的任务,例如一致性检查,并在某个操作无效时通知用户。
限制条件:
  • 系统不能轮询或设置标志(它应该是直接通信)。
  • 使用过程中网站不得重新加载.
  • 运行在客户端的软件必须受到JavaScript的限制。
我找到的技术: 这里是我找到的一些解决方案,按最适合到最不适合的顺序排列,但我不确定列表是否完整且所有假设都是正确的。
  • 使用javax.jws的Java Web服务 - 该服务将提供由WSDL描述的API,并能够使用HTTP协议响应SOAP消息,但JavaScript能够处理这些消息吗?
  • Servlets和Java Server Pages(JSP)- 据我所知,需要重新加载页面才能获取新内容(这与PHP几乎相同吗?两者都在服务器上执行以生成HTML页面..)
我已经找到了这个问题,但是回答中并没有提供具体的技术。谢谢您提供任何提示和澄清,我非常感激!
2个回答

2

正如您已经发现的那样,解决这个常见问题有许多方法。

SOAP(有时称为“Web服务”或“WS *”)是一种应用于应用程序通信的标准。它的优势在于精确的规范(因此有许多良好的库),通过WSDL共享客户端和服务器的接口以及可发现性。

但是,SOAP在浏览器中支持非常有限,甚至没有支持。

最常见的现代方法可能是基于XML或JSON的RESTful Web服务。在作为客户端的浏览器中使用时,首选JSON,因为在JavaScript中反序列化是微不足道的。许多框架和库,如Angular和jQuery,承担了繁琐的跨浏览器AJAX请求构建。但是需要一些样板文件将数据包装在HTML中。但是,如果考虑到更清晰的体系结构和可维护性,则这个缺点也可以成为优点。

由于您在服务器上使用Java,您可能还想了解JSF的AJAX功能。它并没有真正使用REST(没有明确定义的资源),但可以异步加载服务器端呈现的HTML页面块(即:AJAX),并在DOM中重新呈现它们。这可以看作是真正的REST和完整页面重载之间的妥协。好的方面是您不必定义除支持bean之外的任何资源。缺点是:可能会有开销,因为您下载的是HTML而不是纯数据;以及测试性差,因为您不能在JSF上下文之外访问呈现的块。


完全不同的问题是1.并发请求的同步和2.与服务器的客户端通信。对于后者,您可以查看Web Sockets(下一个大事)或老式轮询。如果同时编辑相同的数据是一个问题,您将不得不实现某种策略来告诉是否可以合并编辑还是必须拒绝其中之一。客户端将需要处理这种情况并提供用户审查、覆盖或还原等选项。

编辑:更多关于Java servlets和JSP的内容

Servlets只是处理特定HTTP请求的Java类,通常绑定到某些URL路径。它们类似于PHP页面:在PHP中,Web服务器获取请求并搜索相应的PHP文件。然后解析PHP脚本并返回响应。Servlets也是这样做的,只是语法非常不同。JSP主要是尝试将更多的PHP式语法带到Java中。在幕后,它们被渲染为纯Java servlets。

Java Servlets有着悠久的历史,比AJAX还要古老,但许多框架已经接受了在服务器上实现灵活资源处理的挑战。最值得注意的是Jersey和RESTEasy,它们是Java EE标准JAX-RS的实现;以及Spring,它是一个基于请求的框架,与Java EE标准竞争激烈。然后还有JSF,有时被称为JSP的继任者。对于用户来说,它与JSP几乎没有区别,但语法更好,我认为它比JSP更具功能。特别是考虑到像PrimeFaces这样的扩展。与JSP相比,JSF拥抱AJAX,并且许多内置组件能够使用AJAX与服务器通信,包括调用Java函数和重新渲染页面的部分。


非常感谢您提供的出色解释!我希望我能将“正确答案”奖励给你们两个,但WebSockets确实是最好的选择。您能否简要告诉我Servlets和JSP应该放在哪里?我猜它们完全不适合。我知道我需要处理服务器上的并发问题,但我已经解决了,谢谢 :) - Double M

0

我建议您尝试使用WebSockets,因为客户端和服务器之间的连接将是持久的,并且它们中的任何一个都可以随时发送消息。

您可以在服务器上使用Java来实现WebSocket服务器,并在客户端上使用JavaScript的内置WebSocket功能。

请查看https://www.websocket.org/以了解有关WebSocket的更多信息。


1
附注:不支持在 MSIE 8、Opera mini 和旧版 Android 浏览器中使用。 - Hubert Grzeskowiak
就像我所有的梦想都实现了一样!WebSockets听起来很棒,我以前甚至不知道它们的存在,感谢你让我注意到它们。 - Double M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接