我应该考虑用 AJAX吗?
AJAX现在当然很红,但它不一定适合你。AJAX只能用在最新的浏览器上,暴露出许多浏览器兼容性问题,对许多人它还要求学会一些新技术。Alex Bosworth 写了篇不错的网志 AJAX Mistakes,在你全力投入AJAX以前值得一看。
另一方面,你可以实现丰富的,高度交互性的,快速响应的WEB应用,它们看起来真的很快。尽管人们还在争论基于AJAX的应用是不是真的更快, 用户已感到更直接了,因为当数据在后台交换的时候,用户就收到了积极反馈。如果你较早采用了AJAX,能够处理浏览器兼容性问题,而且愿意学习一些新技术,那么AJAX是适合你的。谨慎起见,你可以试着把应用的一小部分或者小组件转化成AJAX。我们都喜欢新技术,但要记住AJAX的目的是要改善而不是妨碍用户的体验。
AJAX 能不能和Java一起用?
当然。Java很适合AJAX!你可以用Java企业版服务器来生成AJAX 客户端页面并处理进来的请求,为AJAX 客户端管理服务器端的状态,并且把AJAX 客户端联接到企业资源。JavaServe* **ces 组件模型非常适合于定义和使用AJAX组件。
难道我的框架不提供AJAX吗?
你可能已经受益于AJAX。许多现有的基于Java 的框架已经有一定的AJAX 交互,许多新的框架和组件正在被开发来更好地支持AJAX。这里我不想列出所有用AJAX 的Java框架,因为我怕会遗漏一些。但是你可以在这里找到一个不错的列单: www.ajaxpatterns.org/Java_Ajax_Frameworks.
如果你还没有选好一个框架,我建议你考虑使用JavaServe* **ces 或者基于JavaServe* **ces的框架。你可以用JavaServe* **ces组件来抽象化处理许多细节:生成JavaScript, AJAX交互, 和DHTML处理,这样JSF开发员就可以更方便地使用AJAX,它们还可以作为插件装入支持JSF的IDE内,比如 Sun Java Studio Creator.
该从哪里开始?
如果你现在的框架不能满足你的用例,你想开发自己的AJAX组件和功能,我建议你先看一下这篇文章Asynchronous JavaScript Technology and XML (AJAX) With Java 2 Platform, Enterprise Edition。(译者注:中文版 在Java2平台企业版中应用异步 JavaScript技术和XML(AJAX))
如果你想看一个很基本的例子和源代码,这里有 Using AJAX with Java Technology。 Blueprints AJAX Home 有更完整的AJAX资源。
接下来,我建议你花些时间研究AJAX库和框架。如果你想自己写AJAX客户端脚本,最好不要再重复劳动了。
Dave Crane,Eric Pascarello和Darren James的AJAX in Action也不错。这本书有附录中讲学习 JavaScript,对Java开发员有帮助。
创建我自己的AJAX 功能,我要知道些什么?
如果你不想利用已有的AJAX组件,这里是一些需要注意的地方。
准备学习动态HTML (DHTML), AJAX的基础技术。DHTML让用户与网页间通过浏览器现时交互成为可能。DHTML结合了JavaScript,文档对象模型(DOM)和层叠样式表 (CSS).
JavaScript - JavaScript是个宽松类型的,基于对象的脚本语言。它是AJAX交互的关键,而且所有的主流浏览器都支持它。当页面中的一个事件发生时,例如,载入页面,鼠标点击,或表单元素上的按键,JavaScript就被调用了。
文档对象模型(DOM) - 用来读取和更改结构化文档的应用编程接口。在大多数情况下DOM代表XML和HTML文档的结构。
层叠样式表(CSS) - 让你定义页面的外观,例如:字体,颜色,大小,和定位。CSS让你清晰地分隔开内容和形式,并且可以用JavaScript来编程改变。
理解HTTP的请求/回应这一基本性质也很重要。如果你在配置XMLHttpRequest时忽略了GET和POST方法的区别,或者在处理回调时忽略了HTTP状态代码,你会碰到许多难题。
从某种意义上说,JavaScript是一种客户端的胶合体。JavaScript被用来创建XMLHttpRequest对象并触发异步调用。 JavaScript被用来解析返回的内容。JavaScript被用来分析返回的数据并处理返回的信息。用JavaScript可以通过DOM API往HTML里注入内容和改变CSS。
我真的需要学JavaScript吗?
一般来说,是的,如果你想为你的WEB应用开发新的AJAX功能。
另外一方面, JSF 组件和组件库能抽象化JavaScript,DOM和CSS的细节。这些组件能生成必要的工件(artifacts)来支持AJAX交互。可视的工具,象Java Studio Creator,也可以利用支持AJAX的JSF组件来创建应用,应用开发者就不用担心AJAX的许多细节了。如果你打算写自己的 JSF组件,或者想把组件间的事件串联在一起,你应该对JavaScript有个基本了解。你可以从你页面里的JavaScript调用一些客户端的JavaScript 库(在下面谈到)来抽象化测声器间的差异。 Object Hierarchy and Inheritance in JavaScript 是一个供Java开发员学习JavaScript对象的很好的参考。
有哪些JavaScript 库和框架可以帮助Java开发员?
已经有许多库和框架(而且许多还在涌现出来)能帮助我们抽象化这些讨厌的浏览器差异。三个不错的库是:The Dojo Toolkit, Prototype, and DWR.
The Dojo Toolkit 包含一些API和工具来支持开发富WEB应用。Dojo包含一个智能的包装系统,用户界面效果,拖放方法(Drag and Drop) API,小应用(widget)API,事件抽象,客户存储API,以及AJAX交互API。Dojo解决了一些常见的可用性(Usability)问题, 比如,处理浏览器导航问题包括察觉浏览器退后按钮,更改地址栏里的URL来收藏书签,当客户端不完全支持AJAX和JavaScript时妥善处理。Dojo就好比是JavaScript库中的一把瑞士军刀。 它在一个库里提供了最广泛的选择,而且能很好地支持新老浏览器。
Prototype 专注于通过JavaScript AJAX对象进行AJAX 交互,它包含了若干对象来做基本的工作,比如发出请求,更新部分文档,往文档里插入内容,以及定期更新部分文档。Prototype JavaScript库包含了一套JavaScript对象来代表AJAX请求,和一些效用函数来读取页面内的数据和修改DOM。 Script.aculo.us和Rico就是建立在Prototype之上并提供了用户界面效果,支持拖放效果,以及一些围绕JavaScript的不工具(widgets)。如果你想支持AJAX交互和一些基本的功能,Prototype是个很好的选择。如果你需要用户界面效果,Script.aculo.us和Rico是不错的。
Yahoo UI Library 是一个通过API来支持富客户端的效用库和一套小应用。这个效用库包括了支持跨浏览器的AJAX交互,动画,DOM脚本,拖放,以及跨浏览器事件。 Yahoo UI Library提供较好的文档和许多例子。
DWR (Dynamic Web Remoting) 是一个客户端和服务器端的框架,它专注于允许开发员实现从客户端JavaScript到J2EE WEB容器内的普通Java对象(Plain Old Java Object)之间的远程调用。在服务器端,DWR用一个Servlet来和Java对象交互,并返回Java对象或做成了对象的XML文档。 DWR安装使用方便,和其它Java技术配合较好。如果你想要一个整合性能良好,同时支持客户端和服务器的框架,那就用 DWR.
Zimbra 是个客户端和服务器的框架,它专注于支持消息(messaging),包括向使用JavaScript的客户端提供电子邮件服务。在它的工具包中有抽象化浏览器差异的UI API(同时也包括了许多内在的小应用),支持UI事件通信和客户与服务器之间通信的API,简化客户端JavaScript开发的效用类,抽象化了的 DOM API以简化跨浏览器操作,和一套网络API来帮助JavaScript客户端AJAX和SOAP通信。
有好多新的JavaScript库正在涌现出来,以上只是回顾了比较常见的库。选择最适合你需要的。尽管你最好用一个框架,当然也可以同时用多个。更详细的客户端框架列单,请看:Survey of AJAX/JavaScript Libraries.
我应该使用哪种返回值类型, XML 或 text, JavaScript, 或 HTML?
这要看情况。很清楚,AJAX里的X代表了XML,但是一些AJAX支持者马上也指出,AJAX本身并不排除使用其它种类做载荷(PAYLOAD),比如,JavaScript, HTML, 或是纯文本格式。
XML - Web Services和AJAX看起来天生般配。你可以用客户端的API来下载和解析来自REST一类Web Services的XML内容。(不过,要小心在有些基于SOAP的Web Services中载荷会变得又大又复杂,所以不适合AJAX技术)。
纯文本格式 - 在种情况下,服务器产生的文本被注入文档中,或用客户端逻辑来评估。
JavaScript - 是纯文本格式的延伸,不过服务器端组件会传递JavaScript脚本的分段,包括JavaScript对象声明。你可以在客户端用JavaScript eval()函数来创建这些对象。JSON,一个基于 JavaScript对象的数据交换规范,就是依赖了这种技术。
HTML - 直接把服务器生成的HTML分段注入文档,这通常是一种很有效的AJAX方法。不过,要让服务器端的组件和客户端的显示内容保持一致会有点复杂。
网络聚合(Mashup) 这是一个时下流行的术语,它从离散的WEB SERVICES和其它在线API获取内容,结合在一起创建全新的WEB应用。 一个很好的网络聚合的例子就是housingmaps.com,它把craiglist.org 的住房广告和 maps.google.com的地图结合在一起。
AJAX用起来方便不方便?
通过AJAX交互和DHTML的途径来获取数据,动态更新页面,这在本质上是会大幅度地改变页面的外观和状态。用户可能会在任何时候用到浏览器的向前或退后按钮,书签收藏当前页面,从地址栏复制URL后通过电子邮件或聊天发给朋友,或者是打印页面。在设计AJAX应用时,你应该考虑在发生这些情况时你预期的结果是怎样:导航,书签收藏,打印,浏览器支持, 如下所述:
导航- 向前,退后,刷新和书签收藏这些浏览器按钮被点击时,你应用设计预期的结果是什么?你虽然可以用手工地实现一些历史控制,但更简便的方法是用一些能提供历史和导航控制API的JavaScript框架,比如Dojo。
书签收藏和URL分享 - 许多用户想书签收藏或从地址栏里拷贝URL。Dojo 支持客户端书签收藏和修改URL。
打印- 有些时候打印动态产生的页面会有问题。
开发员使用AJAX时其它考虑因素:
浏览器支持 - 并不是所有的浏览器,或一个浏览器的所有版本都支持所有的AJAX或DHTML功能。quirksmode.org 列举了浏览器支持情况和可能的变通方法。
JavaScript被关闭 - 你还应该考虑如果用户关闭使用JavaScript,你该怎么办。另外,有些用户的浏览器上因为有些原因不能支持JavaScript和CSS。
等待时间(Latency) - 在你的设计中应该考虑到等待时间。应用在运行时应该比部署时更加响应迅速。同时要考虑到发出多个请求时,返回的次序是没有保障的。详情请看AJAX Latency problems: myth or reality?
可访问性 - 确保你的网站能让有残障的人访问,这不光是一个高尚的目标,在很多地区也是法律。有许多优秀的支撑技术能帮助他们使用网络,尽管他们有视觉,听觉,体力,语言,认知和神经方面的残障。有一点前瞻性,理解这方面的丰富文档和最好实践,你就能确保你的应用符合这些支撑技术的要求。
降解效果(Degradability)这个术语描述了WEB应用用于适应广泛的浏览器功能的一系列技巧。许多AJAX库有内置的自动降解方式。如果你要写自己的AJAX功能,考虑采纳一些标准组织,比如World Wide Web Conrsoritum (W3C), 和草根运动,比如Web Standards和其它人的最佳实践。这样你的应用在不支持AJAX的浏览器上仍然能运行,虽然它失去了一些很抢眼的效果。
记住不要只是为了显得酷而用AJAX。你打造WEB应用是为了给人用的。如果和他们的浏览器上不兼容,用户就不会用你的应用。
我该怎样调试 JavaScript?
没有很多调试器能同时支持客户端和服务器端调试。我肯定随着AJAX的普及,这种情况会改变。我现在分开调试客户端和服务器。以下是一些关于常见浏览器上的客户端调试器的情况:
Firefox/Mozilla/Netscape - 在一个内置的调试器Venkman很有帮助。我喜欢先在 Firefox开发应用,然后再到其它浏览器上去试。
Safari - 有一个调试器,你需要先开户。详情请看Safari FAQ。
Internet Explorer - MSDN Documentation上有关于调试JavaScript的文档。Internet Explorer developer toolbar可能也有帮助。
除了调试器能帮忙,还有一种常用的方法叫“对话框调试(Alert Debugging)”。在这种情况下你加入"alert()"函数调用,就好比在JAVA中用System.out.println一样。尽管是一个很小的窍门,对大部分情况都管用。有些框架,象Dojo,提供 API来追踪调试语句。
在AJAX调用中,我应该用HTTP GET还是 POST?
如果相对于一个待定的URL的数据一会改变,那么AJAX请求应该用HTTP GET方法。如果服务器会更新状态,那么就应该用HTTP POST方法。这和HTTP idempotency recommendations的要求是一致的,也是大家为创造一个统一的WEB应用设计而高度推荐的做法。
我该怎样提供国际化的AJAX交互?
不能认为用了XML, 你就能以AJAX请求发送和获取区域化的内容。要提供国际化的AJAX组件,你需要做以下这些要求:
把页面字符集设成目标语言支持的编码。你趋向于使用UTF-8,因为它涵盖了在部分语言。以下一个HTML/JSP页面的meta声明设置了 content type:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
在页面内JavaScript确保每个发往服务器的参数都被编码。JavaScript提供了一个escape()函数来返回统一码(UNICODE)转义字符串,这样区域化的文本就以十六进制的格式出现。更多关于JavaScript编码的信息,请看Comparing escape(), encodeURI(), and encodeURIComponent().
服务器端组件用HttpServletRequest.setCharacterEncoding()方法设置字符编码。这必须发生在用 HttpServletRequest.getParameter()方法读取区域化参数以前。如果是UTF-8,那就应该是 request.setCharactherEncoding("UTF-8");.
返回AJAX回应的服务器端组件需要把回应的编码设成和该页面一样的编码。
response.setContentType("text/xml;charset=;UTF-8"); response.getWriter().write("<response>invalid</response>");
关于在Java企业版上使用AJAX,更多资料请看AJAX and Internationalization,开发多种语言应用,请看Developing Multilingual Web Applications Using JavaServer Pages Technology.
我该如何处理并发的AJAX 请求?
通过JavaScript你可以同时处理多个AJAX 请求。为了确保妥善的后处理,我建议使用JavaScript闭包(JavaScript Closures)。下面这个例子
验证码:
注册会员 会员登陆