1.5 Java Web开发所需要的技术
前面对JavaEE和MVC进行了讲解,从讲解中可以知道,要开发Java Web需要遵循上面的标准和规范,当然读者可以自己实现上述规范,从而进行Java Web开发。但幸运的是,目前市场上有不少的开源框架已经实现了上述规范,比如Struts、Spring、Hibernate等,这些开源框架大大地减轻了开发人员的工作量。
1.5.1 Ajax
Ajax并不是一个新技术,它其实是整合了XMLHttpRequest、JavaScript、DOM、CSS、XML等众多技术。
Google的Sugges(t搜索建议)、Map、Gmail等都实现了Ajax技术。它采用XMLHttpRequest对象进行数据的异步交互,使用JavaScript增强用户体验,使用DOM组织内容,使用CSS显示外观,使用XML封装数据。在创建一个XMLHttpRequest对象时,一般采用如下写法:
var xmlhttp; if (window.XMLHttpRequest) { //其他浏览器 xmlhttp = new XMLHttpRequest(); } else if (window.ActiveXObject) { try { //IE浏览器 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xmlhttp = new ActiveXObject('Msxml2.XMLHTTP'); } }
采用Ajax还需要用到JavaScript、DOM、CSS、XML等技术,在后面的章节中笔者将详细介绍上述技术。
随着Ajax的逐渐流行,开发人员发现,Ajax的代码非常零乱,难于维护。为了解决这个问题,很多的Ajax框架便应运而生了,比如Ext、Prototype、DOJO、DWR、GWT、Buffalo等。
这里以Ext为例进行简单的介绍。Ext最初来源于Yui-Ext,后来Ext又独立于Yui发展,它积累了众多的组件,有表格、表单、动态树、菜单、工具条、对话框等,以方便开发人员的使用。Ext的官方网址为http://www.extjs.com,首页如图1.14所示。
图1.14 Ext的首页
Ext一经推出,就以其优美的界面迅速流行起来,开发人员只需要很少的JavaScript代码,就能实现一个漂亮的界面和复杂的功能。比如,要实现一个带Tab的对话框,如图1.15所示。
图1.15 Ext实现带Tab对话框的示例
上述复杂的对话框示例所需要的JavaScript代码如下:
//创建一个单列的对话框 var LayoutExample = function(){ //定义变量 var dialog, showBtn; var toggleTheme = function(){ Ext.get(document.body, true).toggleClass('xtheme-gray'); }; //返回一个公共接口 return { init : function(){ showBtn = Ext.get('show-dialog-btn'); //定义单击事件 showBtn.on('click', this.showDialog, this); }, //定义对话框大小 showDialog : function(){ if(!dialog){ //只创建一次 dialog = new Ext.LayoutDialog("hello-dlg", { modal:true, width:600,//宽 height:400,//高 shadow:true, minWidth:300, minHeight:300,//最小高度 proxyDrag: true, west: { split:true, initialSize: 150, minSize: 100,//最小 maxSize: 250,//最大 titlebar: true, collapsible: true, animate: true }, center: { autoScroll:true, tabPosition: 'top',//定义Tab的位置 closeOnTab: true, alwaysShowTabs: true } }); //增加键盘监听事件和按钮 dialog.addKeyListener(27, dialog.hide, dialog); dialog.addButton('Submit', dialog.hide, dialog); dialog.addButton('Close', dialog.hide, dialog); //添加上面定义的内容 var layout = dialog.getLayout(); //开始更新 layout.beginUpdate(); layout.add('west', new Ext.ContentPanel('west', {title: 'West'})); layout.add('center', new Ext.ContentPanel('center', {title: 'The First Tab'})); //生成Tab layout.add('center', new Ext.ContentPanel(Ext.id(), { autoCreate:true, title: 'Another Tab', background:true})); layout.add('center', new Ext.ContentPanel(Ext.id(), { autoCreate:true, title: 'Third Tab', closable:true, background:true})); //结束更新 layout.endUpdate(); } //显示对话框 dialog.show(showBtn.dom); } }; }(); //代替window.onload,使得不需要等待图片和其他资源即可进行初始化 Ext.EventManager.onDocumentReady(LayoutExample.init, LayoutExample, true);
通过上面的示例,读者可以看出,要实现一个带Tab的对话框,只需要不多的JavaScript代码即可实现,这在没有Ext之前,是很难想象的。Ext提供了和后台进行交互的功能,但和Ext本身联系比较紧密,不方便单独使用它的Ajax功能。
1.5.2 MVC框架
目前实现MVC的框架非常多,比如大家都熟悉的Struts、Spring和WebWork等。通过前面对Mode l的介绍可以知道,Model 2会导致多个Controller的出现,并且对页面导航的处理比较复杂,所以Craig R. McClanahan于2000年5月 提交了一个框架给Java Community,这就是后来的Struts。2001年7月,Struts 1.0正式发布。截至到目前,Struts 2.1.6已经正式发布了。
Struts 2概览图如图1.16所示。
在2002年,Rod Johnson编写了一本书:《Expert One-on-One J2EE设计与开发》,在这本书中,他描绘了Spring的雏形。最终,他因为不能忍受EJB实现的繁杂,从而决定开发一个框架,这就是Spring。Spring由6部分组成,分别实现了开发Java应用程序的不同内容。得益于Spring框架设计的灵活性,使得它能与众多开源框架相结合。
Spring框架如图1.17所示。
图1.16 Struts 2概览图
图1.17 Spring框架图
可以看到,Spring的整个框架的核心建立在Core的基础之上,包括DAO、ORM、JEE、Web和AOP,由此也可以看出Spring的强大。
1.5.3 持久层技术
随着EJB 3的发布,也有越来越多的人直接使用JPA了。Hibernate也提供了对JPA的支持,因此,在当前的Java持久层框架中,Hibernate仍然是一个比较好的选择。Hibernate在2001年发布了它的第一个正式版本;2003年6月,Hibernate 2发布;2003年年末,Hibernate被JBoss吸纳;2005年3月,Hibernate 3正式发布。
为什么要使用ORM(Object/Relational Mapping)呢?这是因为开发人员使用的技术是面向对象技术,而使用的数据库却是关系型数据库,一个完整的类很难以对象的方式存储在一个关系型数据库中,它更适合存储在对象型数据库中。但目前关系型数据库仍然占主流位置,所以要使用ORM在对象型和关系型之间建立关系,从而可以使开发人员完全用OO的思想去设计业务逻辑,而数据的存储仍然使用关系型数据库。
Hibernate对Java和.NET的支持体系图,如图1.18所示。
图1.18 Hibernate对Java和.NET的支持体系图
可以看到,因为JDK 5.0推出的Annotations,Hibernate也开始支持Annotations,从而推出了Hibernate Annotations,使得Hibernate的配置文件不再只有XML这一种选择。