在我当前的项目中,过去几年我们一直在使用 Struts 1,而且……咳咳…… Struts 已经过时了。我们正在慢慢地将前端代码迁移到使用来自服务器的 XML 的 Ajax 客户端。我想知道你们中是否有人将遗留的 Struts 应用程序迁移到不同的框架,以及在这样做时遇到了哪些挑战。
2 回答
当然。从 Struts 迁移到 AJAX 框架是一种非常自由的体验。(尽管我们使用 JSON 而不是 XML。更容易解析。)但是,您需要注意它实际上是对您的应用程序的完全重写。
代替 MVC 的经典 Database/JSP/Actions 方案,您会发现自己转向 Servlet/Javascript 方案,其中模型由 HTTP GET 请求表示,动作由 POST/PUT/DELETE 请求表示,视图是由网络浏览器即时呈现。这导致了每个领域的有趣挑战:
服务器端- 在服务器端,您需要开发一个标准来向客户端公开数据。最简单和最简单的方法是采用最适合您的数据层次结构的REST方法。使用 servlet 实现这一点相当简单,但 Sun 还开发了一个Java 1.6 方案,使用看起来很酷的属性。
服务器端的另一个方面是选择传输协议。我知道您已经提到过 XML,但您可能需要重新考虑。浏览器之间的 XML 解析器差异很大。一个浏览器可能会将文档根设为第一个子节点,另一个浏览器可能会添加一个特殊的内容对象,并且它们都以不同的方式解析空格。更糟糕的是,主要浏览器似乎没有正确实现 normalize() 函数。这意味着 XML 解析很可能充满黑客攻击。
JSON更容易解析且结果更一致。Javascript 和 Actionscript (Flash) 都可以将 JSON 直接转换为对象。这使得访问数据成为 xy 或 x[y] 的简单问题。还有大量的 API 可以处理所有可以想象的语言中的 JSON。因为它很容易解析,所以几乎支持比 XML 更好!
客户端- 您将遇到的第一个问题是没有人了解如何编写 Javascript。特别是那些认为他们这样做的人。如果您有任何关于 Javascript 的书籍,请立即将它们扔出窗外。几乎没有关于该语言的好书,因为它们都遵循相同的“黑客”模式,而没有真正深入了解他们正在做什么。
从最低级别开始,您的团队将需要 Javascript 开发方面的补习培训。从Javascript 客户端指南开始。它是该语言的事实上的信息来源。下一站是Douglas Crockford 的Javascript 视频。我不同意他所说的一切,但他是为数不多的语言专家之一。
一旦你搞定了,考虑一下你想使用什么框架(如果有的话)。一般来说,我不喜欢 Prototype 和 Mootools 之类的东西。他们倾向于把一个简单的问题搞得更糟。尽管如此,您可以随意评估这些工具并决定它们是否适合您。
如果您因为团队太缺乏经验而绝对觉得没有框架就无法生存,那么GWT可能适合您。GWT 允许您使用 Java 代码快速编写 DHTML Web 应用程序,然后将它们编译为 Javascript。问题是你这样做会放弃大量的灵活性。Javascript 语言比 GWT 公开的要强大得多。然而,GWT 确实让 Java 开发人员更快地掌握了速度。所以选择你的战斗。
这些是我能想到的关键领域。我可以说,一旦您从应用程序中获得支持,您就会松一口气。它可能有点像野兽。尤其是如果您的 Struts 模型上有经验不足的开发人员。:-)
任何问题?
编辑 1:我忘了补充一点,您的团队应该认真研究W3C 规范。这些是现代浏览器中可供您使用的 API。如果您发现有人使用 DOM 0 API(例如 document.forms['myform'].blah.value 而不是 document.getElementById("blah").value),则强制他们转录整个 DOM 1 规范,直到他们理解为止到底部。
编辑 2:要考虑的另一个关键问题是如何记录您花哨的新 AJAX 应用程序。REST 风格的界面很适合在 Wiki 中记录。我所做的是一个顶级页面,列出了每项服务和描述。通过单击服务路径,您将被带到一个文档,其中包含每个子路径的详细信息。理论上,这个方案可以记录你需要树去的深度。
如果您使用 JSON,您将需要开发一个方案来记录对象。我刚刚列出了 Wiki 中可能的属性作为文档。这适用于简单的对象树,但对于更大、更复杂的对象可能会变得复杂。在这种情况下,您可以考虑补充 IDL 或 WebIDL 之类的东西。(不能比 XML DTD 和模式差多少。;-))
DHTML 代码在其文档中更为经典。您可以使用像JSDoc这样的工具来创建 JavaDoc 样式的文档。只有一个警告。Javascript 代码不适合在代码中记录。如果没有其他原因,它会使下载膨胀。但是,您可能会发现自己经常编写作为内聚对象运行的代码,但并未在幕后将其编码为这样的对象。因此,最好的解决方案是创建代表和记录 Javascript 对象的 JSDoc 框架文件。
如果您使用 GWT,文档应该是显而易见的。
查看条纹框架。如果您熟悉支柱,那么条纹对您来说会很有意义,但它要好得多。他们的网站上有一个Stripes vs Struts部分。你可以检查一下,看看你是否感兴趣。它允许您使用任何您想要的 ajax 框架,而且我认为从 struts 迁移到 stripes 不会花费很长时间。