很多 Web 开发人员都经常抱怨说 Java™ EE 太复杂、构建新的 Web 组件太难、定制现有的组件没有预想的那样简单,并且即便是很小的更改都需要重新启动应用程序。本系列给出了针对这些问题的解决方案,即采用代码生成器、约 定、脚本语言和先进的 JavaServer Pages ™ (JSP) 特性。在本文中,您将了解如何基于 JSP 标记文件构建可重用的 Ajax 和 Java 组件,而这些 JSP 标记文件很容易开发和部署。更改之后,JSP 标记文件会由 Java EE 服务器自动重编译,而无须重启应用程序。此外,您还能完全控制所生成的代码,并能轻松地定制这些轻量级组件,因为它们使用的是 JSP 语法。
第 1 部分: 用 JSP 标记文件动态生成 JavaScript 代码
The NetBeans IDE is a modular, standards-based, integrated development environment (IDE) written in the Java programming language. The NetBeans project consists of an open source IDE and an application platform, which can be used as a generic framework to build any kind of application.
Release Overview
The NetBeans IDE 6.1 release provides several new features and enhancements, such as rich JavaScript editing features, support for using the Spring web framework, tighter MySQL integration, and an improved way of sharing libraries among dependent projects. The acclaimed support for Ruby/JRuby has been enhanced with new editor quick fixes, a Ruby platform manager, fast debug support for JRuby, and many other new features and fixes.
By popular demand, the bean pattern and JSF CRUD generation features that were missing in the 6.0 release have returned. In addition, early versions of new modules, such as ClearCase support, are available as plugins.
This release also provides improved performance, especially faster startup (up to 40%), lower memory consumption and improved responsiveness while working with large projects. See below for a list of features in this release. (www.netbeans.org)
摘要 在这一部分里,我们将讲解三种不同的JSP集成方案,代表着三种典型的应用范围。
SP相对于PHP来说,可能运行得更快,消耗系统资源更少,功能更为强大——例如对分布式处理和组件支持等等。JSP技术在国外已经相当普 及,而在国内,只不过还是刚热起来而已……虽然现在ASP+在性能上给JSP带来严峻的挑战,但它作为微软以外的一个选择,又支持多平台,所以还是很多网 站所采用的首选。在这一部分里,我们将讲解三种不同的JSP集成方案,代表着三种典型的应用范围。
三、Linux+Apache+PHP+JSP的Resin解决方案
首先向大家推荐的是Resin。Resin是快速的、容易配置和实施的、使用简单的JSP/Servlet引擎和Web服务器。这一点完全是无 庸置疑的,无论是在windows平台还是在UNIX/Linux平台。然而目前的Resin 1.3 还不是一个应用服务器。不过Resin 2.0版有望取得很大的突破。因为它将包含一些最新的J2EE特性。Resin在JSP tags、XML解析等方面投入都比较早,现在也是处于比较领先的地位。而apache.org的tomcat更象是一个开发研究的产品。如果让我来做一 个网站,RESIN肯定是我的首选——相信泛舟也是如此认为的。
我们将在Linux+Apache+PHP的WEB服务解决方案中加入JSP的支持,这也许是您升级网站的需要。就算你不需要PHP也没有关系,下面我也会讲解如何做到这一点。
Download - http://www.jetbrains.net/confluence/display/IDEADEV/Diana+EAP
I Love IntelliJ IDEA, and every one of my friends already know thatThe 5 and 6 versions are a little slow(specially the 6) but I was in love, and when you are in love… in Colombia we have a proverb “When you love the dog, you also love the stink“ and, of course, is better than work in Eclipse(sorry!!).
But the 7 version was a really good IDE, very quick and stable, and a Wonderful Spring Support(without talk about JSP, HTML, JavaScript, Groovy… ad infinitum), by far the best IDEA Version, or in other words, “The Best IDE in the world”.
But I have a feeling of sadness was in my soul, and a question in my mind, How could be the next version, if IntelliJ IDEA 7 are so good??
Well my question was answering this morning
Diana First EAP Release Notes
* Changes in Plugin API: I must have to change IntelliStripes, but the good news are that the changes are for better language support, so you can expect some very good language plugins for example: Scala, Jython and others
* Seam Support: I don't work with Seam and I don't have plans to do that in the near future, but any improvement is welcomed, and a Collateral Effect: Jetbrains always release this supports with Apache License 2.0, so I can read the whole code and see how to improve IntelliStripes, [mode type="Evil Laughter"]JAJAJAJAJAJA!!!![/mode]
* Free Maker Support: The same as Seam Support, but some Stripes Friends use Free Maker instead of JSP, so is welcomed
* JavaScript Debugging: I already made this with FireBug, but the IDEA Interface is better
* SQL Support!!!!!!!: WOW, thats very good, (I'm not a ORM Fan boy , I'm Still in love with POSQ (Plain Old SQL Query) (WOW, maybe I create a Buzzword!!!!) ) even when you have already good plugins like "SQL Query Plugin" is better if the Support come from Jetbrains
* Flex Support: Same as Sean, but IntelliJ IDEA 7 also have support, I like more Laszlo
* Per File Encoding Support; A must have when you have a team with Multiple OS
* "Unwrap/Remove" action (delete enclosing statement): Maybe I need, maybe not, but is welcomed
* Struts 2: Now the plugin is bundled with IntelliJ [mode type="Revengeful Warrior"]Some Day, Some Day IntelliStripes will be bundled, JAJAJAJA, and my Mom will loves me [/mode]
* And many others!!!!! [via jroller]
````````````````````````````````````````````````````````
We’re glad to announce the availability of IntelliJ IDEA 8.0 first EAP.
Some of the IntelliJ IDEA 8.0 features are now available for the first preview:
* Improved Flex code editor, with new inspections
* JavaScript debugger
* JBoss seam support, with coding assistance and dedicated visual tools
* Support for various SQL dialects, with coding assistance and injection
* Numerous other enhancements and new features
Download the fresh build and give a try right now.
For the complete list of the new features and improvements, check Release Notes
Enjoy! And develop with pleasure!
[via jetbrains]
jpa2web 是什么?
Hibernate(见 参考资料)等工具大大简化了 Java 对象与其数据库存储之间的映射;尤其是,很容易给 Java 类加上注解,从而指定对象持久化的方式。开发人员不再需要编写大量数据库集成代码。Hibernate 解决了持久化问题;但是,仍然需要创建 Web 页面来处理这些元素。对于中等规模的 Web 应用程序,典型的开发过程可能是这样的:开发人员首先编写表示某个领域模型的 Plain Old Java Object(POJO),然后创建不同的事务和 Web 用户界面。一部分模型元素常常涉及非事务性数据。客户、国家、地区、职员和公司是业务模型的典型元素,它们由操作员维护。
为什么不生成一个 Web 表示层,让它根据带注解的 bean 创建、添加、列出、删除和搜索这些元素呢?为什么不让这个表示层产生友好的 Ajax 用户体验呢?这就是 jpa2web 工具的主要目标,它采用以下处理流程:
输入:带注解的 POJO bean(和可选的模板)。
输出:一个 Ajax Web 应用程序,它可以处理模型元素并进行持久化。
使用的技术:FreeMarker + ZK + Hibernate(关于这些技术的更多信息,参见 参考资料 中的链接)。
关于 ZK
ZK 是一种开放源码的 Ajax Web 框架,用来为 Web 应用程序创建富用户界面,在开发界面时只需编写很少的代码,而且不需要编写 JavaScript 代码。使用 ZK,可以像设计桌面应用程序那样设计 Web 应用程序。ZK 负责客户机和服务器上的 Ajax 处理。开发人员只需创建一个简单的 XML 文件(称为 zul 文件)来指定用户界面,并用选择的语言编写事件处理函数:Java 代码(编译型)、Bean Shell(解释型 Java)、Groovy、Ruby、JavaScript 等。
这个工具主要使用注解驱动的编程方式指定 ORM 映射。可以重用其中的许多注解来定义 Web 界面或创建可修改的原型。
下面几节解释如何使用 jpa2web 把不同复杂程度的 bean 映射到 Ajax Web 用户界面。接下来,说明 jpa2web 算法的工作原理和一些基本指令。最后,描述 jpa2web 的适用范围和以后的改进。
新年伊始,Wicket Team发布了Apache Wicket 1.3。Apache Wicket是目前增长最快的基于Web框架的Java开源组件,它使得开发web应用程序变得容易而轻松。 Wicket利用一个POJO data beans组件使得它可以与任何持久层技术相结合。一个结合Eclipse工具的Demo可以引导你如何利用Wicket来发开Web应用程序。
主页:http://wicket.sourceforge.net/index.html
An editable Ajax tree table
All examples
Download Apache Wicket 1.3
新版本带来了一些全新的特性:
l 基于JDK1.4的最终版本。下一版本将采用Java 5。
l 注意,包名改成了:org.apache.wicket;
l 简化了核心的APIs;
l 真正的零配置,而改用代理服务器的方式;
l 增加了对Google Guice的支持;
l 支持JSR-168/JSR-286标准;
l 日志类库由commons-logging升级为slf4j;
l 整合了Velocity模板;
l 轻量化了Session中存储组件的内容;
l 增加了AjaxTree/AJaxTreeTable功能;
l 加大了对无状态用户页面及组件的承受能力;
l 使用URL编码添加搜索引擎功能。 【CSDN】
SUN与GlassFish社区今日发表开源应用服务器第2版GlassFish--第5版Java平台企业版应用服务器(Java Platform Enterprise Edition, Java EE 5);而对应之商业化版本:Sun Java System Application Server 9.1也同时推出。
新版本以GlassFish V1为基础更纳入了企业所需的功能特点,诸如集群技术(Clustering)、高级管理、以及破纪录的效能等新增功能包括:
集 群技术(Clustering)能让企业能够将群组服务器,以满足扩充及于内存中复制数据的复原保护功能与高可用度的需求。中央控管功能让企业透过中央管 理接口管理应用服务器集群,以及应用程序部署。Project Metro则是平台互通技术,允许Java技术以及Windows环境下的网络服务(Web Services)之互通。
Open ESB使让网络服务与既存之企业资源能够轻易整合。Java商业整合 (Java Business Integration, JBI)提供标准化方式传递SOA架构以使用网络服务。NetBeans IDE整合让研发人员能够透过设计BPEL (Business Process Execution Language)流程,部署SOA应用程序。
SUN大幅减少其商业化Sun Java System Application Server授权执照与支持成本,降低其主控权,让企业有更多的选择。使用者可以从http://glassfish.java.net下载支持Solaris、Linux、Windows与Mac OS X之GlassFish V2,在所有主流操作系统上导入具更生产力质量之应用服务器。
此外,新推出的NetBeans 6.0 IDE Beta (http://www.netbeans.org) 透过一整合且可配置之IDE,提供了更优良的效能,让研发人员能够轻松选择其所需之工具组、调整其环境设定。NetBeans 6.0 Beta同时新加入了强大的编辑工具,并强化对动态语言(诸如Ruby与JavaScript(TM))之支持;NetBeans 6.0 Beta Ruby亦纳入支持JRuby,让研发人员能够在既存的JAVA程序代码中使用Ruby;其它的特点还包括了:监测与引导功能、本地端历史记录、整合支持 Subversion、与各种整合标准多语系企业应用之功能,让企业应用更快速、成本更经济。
NetBeans最近发布之 NetBeans 6.0未来将同时提供 Common Development and Distribution License (CDDL)与GNU General Public License version 2 (GPLv2)授权。
SUN同时还提供软件开发包,支持其软件服务,从单一附件到完整的研发计划都在其中。构造Cluster是架构师们实现Scalability与High Availability 的 最直接用药。所以大家很多都会无意中使用Cluster的思想去设计自己的服务器。其实Java EE里的Clustering已经做得很熟很烂,大家如果烂熟各家vendor对Web,EJB,JNDI,JMS,WebService....的 Cluster实现,再思考自己的烂摊子时,思路便快捷清晰,少很多与同僚们的无谓争论。
本站下载地址 : http://www.ntsky.com/download/document/2007-09-10/dc8746ce46924f63.html
JavaEE Cluster的经典范文是Sun的王昱写于2005年的Uncover the hood of J2EE Clustering Preface,更可贵的是dev2dev上的JadeYuan兄弟将它高质的翻成了中文。
一、所谓集群 目的就是以负载均衡(Load Balance)与失败转移(Failover) 实现可扩展性(Scalability)和高可靠性(High Availability),主要实现的功能:
- Load Balance 算法主要有轮循、权重(根据服务器硬件配置的不同)和随机三种,但更酷的做法是基于负载(直接查探或者服务器主动报告它们的负载)。
- Health Check心跳系统与发现协议。Server一般会主动定期多播报告自己状态,也会Ping对方来问候平安。比如Weblogic每10秒会发送一次心跳,如果有30秒没有收到对方服务器的心跳了(考虑到多播可能会丢失数据包)就视对方为阵亡。
- Session Replication 因为会服务器记录与特定用户的会话信息,Balancer应该把同一用户的请求定位到同一台服务器上。如果该服务器失效,把该用户和会话信息转移到新服务器上时。
如果只要单纯的load balance,不要fail over的话,使用纯硬件如F5已经足够,不需要在软件上做任何事情。
除了Scalability 与High Availability,一个集群还应该对已有代码的最小影响,对性能影响最小,配置与部署简单,以及运行时可监控。
二、Web层群集
Balancer无非Apache/IIS插件,balance Servlet,硬件四层交换机三类,而讨论的重点在Session 信息的Replication 实现上,简单的分有全部服务器冗余备份,三三两两互为冗余备份,中央备份服务器三种模式。
1.多服务器全冗余备份
Tomcat的最为粗糙,最没有扩展性的做法,不提。Sun的怪怪的replacate的内存数据库法HADB可能也属于这种范畴。
2.三三两两互为冗余备份
Weblogic, Jboss and WebSphere 的做法,好主流。A会有B的数据,B会有C的数据,C会有B的数据,如果A出错,就会由C接替A的工作。这种做法的弊端是:
1.要控制failover到备份服务器,Balancer的实现复杂度高。
2. 如果A出错,C就要瞬时承载A、C的操作,很可能将它压垮,针对这点,Weblogic的做法是针对每个session而不是每个Server选择备份服 务器,把主备服务器A、B的名字写在用户Cookie里,如果A失效后,Balancer将用户转到服务器C,C会根据用户cookie记录,从B那里获 取会话信息。
3.相对没有cluster的方案,需要花额外的时间和内存。
文中没讲的Geronimo使用的WADI,应该也属于这种类型,不过更为灵活,详见Geronimo 叛逆者: 加入集群功能第1部分 和 第2部分。
3. 中央备份服务器
N+ 1模式,一个中央Server存放所有的Session,如果一台Server死了,接管的Server就从中央服务器restore相关数据。可以用数 据库(很多应用服务器都支持的最简单,但最慢的模式),也可以采用内存。这种方式好处是cluster服务器上不需要冗余内存,可以failover到任 意服务器,cluster服务器全死了中央服务器都不死。坏处就是如果中央服务器死了...如果中央服务器的内存不够了.....另外,多了个 restore的步骤。
使用内存备份session时,Tomcat/JBoss使用的JavaGroups 是一个很好的工具,它的“ Group membership protocols” and “message multicast”特性都非常有用。
另外,无论使用内存还是数据库,都需要串行化Java对象,性能损耗厉害,所以JRun 就采用了Jini架构 ,而Tangosol Coherenc ,Terracotta这些Data Grid方案都提出了自己的session备份做法,整天显示着比传统方案快多少多少。Data Grid分布式缓存本身就是很Enterprise的功能,下篇blog再详述。
三、EJB集群
从stub 调用实际EJB对象时,有三种方法实现负载均衡和fail over:
- Smart Stub.在stub内维护有效列表,实现负载均衡逻辑,进行实效检测,BEA Weblogic and JBoss 采用。
- IIOP Runtime Library ,Sun的JES 算法,把算法从客户端的stub移到客户端的IIOP Runtime
- Interceptor Proxy,IBM做法,把算法移到了服务端,Location Service Daemon (LSD)。
在JNDI查找,EJBHome Stub查找生成EJB实例,调用EJB方法三种时候都可以实现负载均衡,对statefull,stateless,entity bean,又有不同的做法。
四、其他集群
JMS 集群,可以有多个broker组成集群(JBoss,如果要持久化Message,就要把原来嵌入式的数据库改为共享模式),activeMQ还支持多个 消费者组成集群,但每个消费者负责同一类的任务,比如订单队列的处理,Server A只处理图书类的订单,或只处理《Programming Ruby 2nd》的订单。
数据库集群有Oracle的RAC,但JDBC本身的failover能力很低,一旦connection 中断,resultset等对象都会失效,Weblogic的连接池会尝试重连。
五、Cluster的神话
1.Failover可彻底避免错误
JBoss的文档用了整整一章来警告你,真的需要http session复制吗?没有http session可以使效率提高很多,而有了的话,并不能避免所有错误。失败转移只能在两次调用间产生作用,在调用时产生的错误是无法恢复的,除非这是个幂 等操作(如单纯的get(),而不是put(),无论如何重复操作结果都是一样的),否则,如果A上承载100用户,失败时有20个用户正在进行处理,则 只有80个用户能逃出生天平安转移到B。
2.小心编写可集群的程序
1.http session要放能serilaze的对象,对象不要太大,变更时要显式的setAttribute().
2. 注意Cache的使用。如果每个JVM独立使用Cache,会否不一致,如果进行同步,注意开销。
3.不能使用静态变量,如在线用户数,要搞成分布式的 Cache。
4.外部资源如文件系统(一台机器上没有另外一台机器的文件),存成DB或者使用SAN
5.特别服务:如timer服务,基于事件的服务,
(江南白衣)
六、延伸阅读:
对于J2EE,我们知道当开发应用时,在架构设计阶段的决定将对应用的性能和可扩展性产生深 远的影响。现在当开发一个应用项目时,我们越来越多地注意到了性能和可扩展性的问题。应用性能的问题比应用功能的不丰富问题往往更为严重,前者会影响到所 有用户,而后者只会影响到碰巧使用该功能的那些用户。
作为应用系统的负责人,一直被要求"要少花钱多办事"----用更少的硬件,更少的网络带 宽,以及更短的时间完成更多的任务。J2EE通过提供组件方式和通用的中间件服务是目前首选的最优方式。而要能够构建一个具有高性能和可扩展性的J2EE 应用,需要遵循一些基本的架构策略。
缓存(Caching)
简单地说,缓存中存放着频繁访问的数据,在应用的整个生命周期中,这些数据存放在持久性存储器或存放在内存中。在实际环境中,典型的现象是在分布式系统中每个JVM中有一个缓存的实例或者在多个JVM中有一个缓存的实例。
缓存数据是通过避免访问持久性存储器来提高性能的,否则会导致过多的磁盘访问和过于频繁网络数据传输。
复制
复制是通过在多台物理机器上创建指定应用服务的多个拷贝来获得整体更大吞吐效率。理论上看,如果一个服务被复制成两个服务,那么系统将可处理两倍的请求。复制是通过单一服务的多个实例的方式从而减少每个服务的负载来提高性能的。
并行处理
并行处理将一个任务分解为更为简单的子任务,并能够同时在不同的线程中执行。
并行处理是通过利用J2EE层执行模式的多线程和多CPU特点来提高性能。与使用一个线程或CPU处理任务相比,以并行方式处理多个子任务可以使操作系统在多个线程或处理器中进行分配这些子任务。
异步处理
应用功能通常被设计为同步或串行方式。异步处理只处理那些非常重要的任务部分,然后将控制立即返回给调用者,其他任务部分将在稍后执行。
异步处理是通过缩短那些在将控制返回给用户之前必须处理的时间来提高性能的。虽然都做同样多的事情,但是用户不必等到整个过程完成就可以继续发出请求了。
资源池
资源池技术使用的是一套准备好的资源。与在请求和资源之间维持1:1的关系的不同,这些资源可被所有请求所共享。资源池的使用是有条件的,需要衡量下面两种方式的代价:
A、维持一套可被所有请求共享资源的代价
B、为每个请求都重新创建一个资源的代价
当前者小于后者时,使用资源池才是有效率的。
任何试过过Flickr、GMail、Google Suggest或者是Google Maps的人都会意识到一种新型的动态Web应用正在逐渐浮出水面。这些应用外观和表现都和传统的桌面应用程序很像,而他们不需要依赖于插件或者是特定于 浏览器的功能。过去Web应用只是一系列HTML页面,他们任意一部份内容的更改都必须重新载入页面。像JavaScript编程语言和层叠样式表 (CSS)之类的技术已经成熟,可以有效地应用他们来创建高动态的Web应用,而且可以运行在所有的主流浏览器中。本文将会详细介绍你马上就可以使用的一 些技术,让他们使你的Web应用像桌面应用更加丰富和更有交互性。
介绍异步JavaScript技术和XML(AJAX)
使用JavaScript技术,一个HTML页面可以异步地对服务器(一般是载入页面的服务器)发送请求并获取XML文档。然后JavaScript可以使用XML文档来更新或改动HTML页面的文档对象模型(DOM)。最近形成了一个术语AJAX(Asynchronous JavaScript Technology and XML)来描述这种交互模型。
AJAX其实不是很新的东西。这些技术对于Windows平台上专注于Internet Explorer的开发人员来说,已经存在好几年了。直到最近,这个技术才被作为Web远程技术或者远程脚本技术被大家了解。Web开发人员也有一段时间 曾经使用过插件、Java applet和隐藏框架来模拟这种交互模型。最近发生的变化是,对XMLHttpRequest对象的支持已经成为所有平台上的主流浏览器都包括的特性了。JavaScript技术的XMLHttpRequest对 象是。尽管在正式的JavaScript技术标准中并没有提到这种对象,然而今天主流的浏览器都对他提供了支持。而当代的浏览器如Firefox、 Internet Explorer以及Safari在JavaScript技术和CSS的支持上有些细微的差别,但是这种差别是可以处理的。如果你要考虑支持较老的浏览 器,AJAX也许就不能成为你的解决方法。
基于AJAX的客户端之所以独特的原因是客户端包含了用JavaScript嵌入的特定于页面的控制逻辑。应用JavaScript技术的页面基于 事件进行交互,如文档载入、鼠标点击、焦点改变甚至是定时器。AJAX交互使得表现层逻辑更加清晰地与数据分离。一个HTML页面也可以根据需要每次读入 适当的数据,而不是每次需要显示一个更改时都重新载入整个页面。AJAX要求一种不同的服务器架构来支持它这种交互模型。以前,服务器端Web应用关注于 对每个导致服务器调用的客户端事件都生成HTML文档。然后客户端对每个回应都要重新读入并重新渲染完整的HTML页面。富Web应用(Rich Web Application)关注于,让一个客户端获取一个HTML文档让它表现为一个模板或者是一个容器,可以基于事件并使用从服务器端组件中获取的XML 数据来对文档注入内容。
一些AJAX交互的应用如:
- 实时表单数据检验:像用户ID、序列号、邮政编码或者是特殊的票据代码这类需要服务器端验证的数据也可以在用户提交表单之前进行验证。
- 自动补全:像电子邮件地址、姓名或城市名之类的表单数据都可以根据用户情况自动补全。
- 处理细节操作:根据一个客户端事件,一个HTML页面可以根据现存的一些数据再去获取更多详细的信息,如现在有一个产品列表,客户端可以控制查看单独的产品信息而无需刷新页面。
- 复杂的用户界面控件:像树型控件、菜单和进度条之类不要求页面刷新的控件也能实现。
- 页面内刷新数据:HTML页面可以从服务器上查询最新的数据如分数、股指、天气还有其它的特定于应用的数据。
- 服务器端通知:一个HTML页面可以通过对服务器进行定时查询来模拟一个服务器的事件通知推送,实现像通知客户端一个消息、刷新页面数据或将客户端重定向到另一个页面。
这个列表并未把所有的应用都列出来,但它已经显示了AJAX交互可以让Web应用比从前能做更多的事情。但尽管这些好处是值得关注的,这种方式也有一些缺点:
- 复杂度:服务器端开发人员必需理解,HTML客户端页面中的表现层逻辑以及生成HTML 客户端页面所需的XML内容的服务器端逻辑。HTML页面开发人员必须了解JavaScript技术。如果开发新的框架和发展已有的框架来支持这种交互模 型,那么AJAX应用的创建就会越来越简单。
XMLHttpRequest对象的标准化:XMLHttpRequest对象还不是JavaScript技术标准的一部分,这就意味着根据客户端的不同,应用的行为也有所会不同。- JavaScript技术的实现:AJAX交互极大地依赖于JavaScript技术,而由于客户端的原因JavaScript还有一些细微的差别。见QuirksMode.org来了解更多关于浏览器之间区别的内容。
- 调试:AJAX应用也难于调试,因为流程逻辑是同时嵌在客户端中和服务器上的。
- 代码可见:客户端的JavaScript可以很容易通过“查看源代码”被人看见。一个没有良好设计的AJAX应用很可能被黑客攻击或被他人剽窃。
当开发人员在使用AJAX交互模型上获得更多的经验后,AJAX技术的框架和模式就会慢慢浮现出来。现在就关注于完全通用的AJAX交互框架,还为 时过早。本文和相关的解决方案将关注于在现有的Java 2平台企业版(J2EE)上如何对AJAX进行支持,像servlet,JavaServer Page(JSP)软件、JavaServer Face应用和Java标准标签库(JSTL)。
AJAX交互剖析
现在我们已经讨论了AJAX是什么以及一些高层次的问题。那现在让我们把所有的零件放在一起来展示一个具有AJAX的J2EE应用。
首先考虑一个例子。一个Web应用包括了一个静态HTML页面,或者是一个由JSP生成的HTML页面,这个JSP中还包括了一个HTML表单,它需要服务器端逻辑来对表单中的数据进行检验,而不用刷新页面。一个名为ValidateServlet服务器端组件(servlet)用来提供这种验证逻辑。图一描述了这种具有验证逻辑的AJAX交互的细节。
|
|
图1: 一个提供验证逻辑的AJAX交互
|
以下条目代表了图1中出来AJAX交互的过程:
- 发生一个客户端事件。
- 创建和配置一个
XMLHttpRequest对象。 XMLHttpRequest对象进行一个调用。ValidateServlet对请求进行处理。ValidateServlet返回一个包含了结果的XML文档。XMLHttpRequest对象调用callback()函数并处理结果。- 更新 HTML DOM。
现在让我们逐个研究这个AJAX模型的每一步。
1.发生一个客户端事件。
在一个事件发生时可以调用相应的JavaScript函数。在这里,validate()函数可以被映射到一个链接或者是表单组件的onkeyup事件上去。
<input type="text" |
每次用户在表单域中按下一个键时,表单元素将都调用validate()函数。
2. 建立和配置一个XMLHttpRequest对象
创建和配置一个XMLHttpRequest对象
var req; |
validate()函数建立了一个XMLHttpRequest对象并对象中的open函数。open函数需要两个参数:HTTP方法,可以是GET或POST; 和对象进行交互的服务器端组件的URL;一个布尔变量,表示是否要进行异步调用。API是XMLHttpRequest.open(String method, String URL, boolean asynchronous)。如果一个交互被设置为异步, (true) 那就必须指明一个回调函数。可以使用req.onreadystatechange = callback;来设置这个交互的回调函数。详细内容见第六节。
3.XMLHttpRequest对象进行调用
当收到了语句req.send(null);,就会进行一次调用。HTTPGET的情况下,内容可以是null或者留空。当调用XMLHttpRequest的这个函数时,也会对已经配置了的URL进行调用。在下面这个例子中,要发送的数据(id)将作为一个URL参数。
使用HTTPGET,两个重复的请求将返回同样的结果。当使用HTTPGET方法时,要注意URL的长度,包括已经转义的URL参数,可能会受到某些浏览器和服务器端的Web容器的限制。当发送的数据会影响到服务器端的应用程序的状态时,就应该使用HTTPPOST方法。使用HTTPPOST必须要对XMLHttpRequest对象设置一个Content-Type头,使用以下语句:
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); |
当从JavaScript中发送表单值得时候,你应该考虑对字段值进行编码。JavaScript中有一个函数escape(),应该用他来确保区域化的内容被正确编码,同时特殊字符也被正确转义。
4. ValidateServlet对请求进行处理.
一个映射到URI "validate" 的servlet将检验user ID是不是已经在数据库中存在了。
一个servlet处理一个XMLHttpRequest ,就像对待其它的HTTP请求一样。下面的例子显示了服务器从请求中抽取出id参数并检验是否被占用了。
public class ValidateServlet extends HttpServlet { |
在这个例子中,一个简单的HashMap用来存放存在的用户名。在这个例子中,我们假设用户的ID是duke。
5.ValidateServlet返回一个包含结果的XML文档
用户ID "duke" 在users HashMap的用户ID列表中出现了。将在应答中写一个包含值为invalid的message元素的XML文档。更复杂的用例将要求DOM、XSLT或其他API来生成这个应答。
response.setContentType("text/xml"); |
开发人员必须注意两个事情。第一,Content-Type必须设为text/xml。第二,Cache-Control必须设为no-cache。XMLHttpRequest对象只会处理Content-Type为text/xml的应答,同时把将Cache-Control设为no-cache将确保浏览器不会从缓存相同的URL(包括参数)返回的应答。
6.XMLHttpRequest对象调用callback()函数并处理结果。
XMLHttpRequest对象已经配置为当有readyState改变的时候就调用callback()函数。让我们假设已经ValidateServlet调用了而且ValidateServlet是4,表示XMLHttpRequest的调用已经完成。HTTP状态代码200表示一个成功的HTTP交互。
function callback() { |
浏览器维护了一个所显示的文档的对象形式(也就是所谓的Docuemt Object Model或DOM)。HTML页面中的JavaScript可以访问DOM,同时在页面载入完之后,可以使用API来修改DOM。
根据成功的请求,JavaScript代码可以修改HTML页面的DOM。从ValidateServlet获得的对象形式的XML文档可以通过req.responseXML在JavaScript中获得,req是一个XMLHttpRequest对象。DOM API给JavaScript提供了获取这个文档中的内容以及修改HTML页面的DOM的方法。所返回的字符串形式的XML文档可以通过req.responseText获得。现在我们看看如何在JavaScript中使用DOM API,先看以下从ValidateServlet返回的XML文档。
<message> |
这个例子是一个简单的只包含了一个message元素的XML片断,里面只有一个简单的字符串valid或invalid。一个更高级的例子可以包含多于一个的消息和可以给用户看的有效的名字:
function parseMessage() { |
parseMessages()函数将处理一个从ValidateServlet获取的XML文档。这个函数会调用setMessage()with the,并给出message作为参数来更新HTML DOM。
7.更新HTML DOM
JavaScript技术可以使用很多API从HTML DOM中获得任何元素对象的引用。推荐的获得元素引用的方法是调用document.getElementById("userIdMessage"), "userIdMessage"是HTML文档中出现的一个元素的ID属性。有了这个元素的引用,就可以使用JavaScript来修改元素的属性、修改元素的样式、添加、删除或修改子元素。
一个常见的改变元素主体内容的方法是设置元素的innerHTML属性,如下所示:
<script type="text/javascript"> |
受到影响的那部分HTML页面会立刻根据innerHTML的设置重新渲染。如果innerHTML属性包含类似<image>或者是<iframe>之类的元素,那么由那些元素所指定的内容同样会被获取并渲染。
这种途径的主要缺点是HTML元素是作为字符串硬编码在JavaScript中的。JavaScript中硬编码的HTML标记不是一种好的实践, 因为它使代码难于阅读、维护和修改。我们应该考虑在JavaScript中使用DOM API来创建和修改HTML元素。把显示和JavaScript代码的字符串混在一起只会让页面更难于阅读和编辑。
另一种修改HTML DOM的方法是动态地产生新的元素并把他们作为子元素追加到目标元素,如下面的例子所示:
<script type="text/javascript"> |
这个范例展示了JavaScript技术的DOM API可以用来更有目的地建立或改变一个元素。当然JavaScript的DOM AP在不同的浏览器上也可能有差别,所以你必须在开发应用程序时小心。
作者: Greg Murray