在我目前的项目中,我们过去几年一直在使用Struts 1,而且......唉... Struts正在显示它的时代.我们正在慢慢地将我们的前端代码迁移到从服务器使用XML的Ajax客户端.我想知道是否有人将遗留的Struts应用程序迁移到不同的框架,以及您在这样做时遇到的挑战.
当然.从Struts迁移到AJAX框架是一种非常自由的体验.(虽然我们使用的是JSON而不是XML.更容易解析.)但是,您需要注意它实际上是对应用程序的完全重写.
您将发现自己转向Servlet/Javascript方案而不是MVC的经典Database/JSP/Actions方案,其中模型由HTTP GET请求表示,操作由POST/PUT/DELETE请求表示,视图是由Web浏览器即时呈现.这导致了每个领域的有趣挑战:
服务器端 - 在服务器端,您需要开发一个用于向客户端公开数据的标准.最简单,最简单的方法是采用最符合数据层次结构的REST方法.使用servlet实现起来相当简单,但Sun也使用看起来非常酷的属性开发了Java 1.6方案.
服务器端的另一个方面是选择传输协议.我知道你已经提到了XML,但你可能想重新考虑一下.XML解析器在浏览器之间差异很大.一个浏览器可能使文档root成为第一个子节点,另一个浏览器可能会添加一个特殊的内容对象,并且它们都以不同方式解析空白.更糟糕的是,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和Schema差得多.;-))
DHTML代码在其文档中更为经典.您可以使用JSDoc之类的工具来创建JavaDoc样式的文档.只有一点需要注意.Javascript代码不适合在代码中记录.如果没有其他原因,它会下载这个事实.但是,您可能会发现自己经常编写作为一个有凝聚力的对象运行的代码,但不会在幕后编写为这样的对象.因此,最好的解决方案是创建表示和记录Javascript对象的JSDoc框架文件.
如果你正在使用GWT,文档应该是明智的.