我的J2EE成功之路
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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这一种选择。