官术网_书友最值得收藏!

1.5 Java Web開發(fā)所需要的技術(shù)

前面對(duì)JavaEE和MVC進(jìn)行了講解,從講解中可以知道,要開發(fā)Java Web需要遵循上面的標(biāo)準(zhǔn)和規(guī)范,當(dāng)然讀者可以自己實(shí)現(xiàn)上述規(guī)范,從而進(jìn)行Java Web開發(fā)。但幸運(yùn)的是,目前市場上有不少的開源框架已經(jīng)實(shí)現(xiàn)了上述規(guī)范,比如Struts、Spring、Hibernate等,這些開源框架大大地減輕了開發(fā)人員的工作量。

1.5.1 Ajax

Ajax并不是一個(gè)新技術(shù),它其實(shí)是整合了XMLHttpRequest、JavaScript、DOM、CSS、XML等眾多技術(shù)。

Google的Sugges(t搜索建議)、Map、Gmail等都實(shí)現(xiàn)了Ajax技術(shù)。它采用XMLHttpRequest對(duì)象進(jìn)行數(shù)據(jù)的異步交互,使用JavaScript增強(qiáng)用戶體驗(yàn),使用DOM組織內(nèi)容,使用CSS顯示外觀,使用XML封裝數(shù)據(jù)。在創(chuàng)建一個(gè)XMLHttpRequest對(duì)象時(shí),一般采用如下寫法:

      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等技術(shù),在后面的章節(jié)中筆者將詳細(xì)介紹上述技術(shù)。

隨著Ajax的逐漸流行,開發(fā)人員發(fā)現(xiàn),Ajax的代碼非常零亂,難于維護(hù)。為了解決這個(gè)問題,很多的Ajax框架便應(yīng)運(yùn)而生了,比如Ext、Prototype、DOJO、DWR、GWT、Buffalo等。

這里以Ext為例進(jìn)行簡單的介紹。Ext最初來源于Yui-Ext,后來Ext又獨(dú)立于Yui發(fā)展,它積累了眾多的組件,有表格、表單、動(dòng)態(tài)樹、菜單、工具條、對(duì)話框等,以方便開發(fā)人員的使用。Ext的官方網(wǎng)址為http://www.extjs.com,首頁如圖1.14所示。

圖1.14 Ext的首頁

Ext一經(jīng)推出,就以其優(yōu)美的界面迅速流行起來,開發(fā)人員只需要很少的JavaScript代碼,就能實(shí)現(xiàn)一個(gè)漂亮的界面和復(fù)雜的功能。比如,要實(shí)現(xiàn)一個(gè)帶Tab的對(duì)話框,如圖1.15所示。

圖1.15 Ext實(shí)現(xiàn)帶Tab對(duì)話框的示例

上述復(fù)雜的對(duì)話框示例所需要的JavaScript代碼如下:

      //創(chuàng)建一個(gè)單列的對(duì)話框
      var LayoutExample = function(){
          //定義變量
          var dialog, showBtn;
          var toggleTheme = function(){
              Ext.get(document.body, true).toggleClass('xtheme-gray');
          };
          //返回一個(gè)公共接口
          return {
              init : function(){
                  showBtn = Ext.get('show-dialog-btn');
                  //定義單擊事件
                  showBtn.on('click', this.showDialog, this);
              },
              //定義對(duì)話框大小
              showDialog : function(){
                  if(!dialog){ //只創(chuàng)建一次
                      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
                          }
                      });
                      //增加鍵盤監(jiān)聽事件和按鈕
                      dialog.addKeyListener(27, dialog.hide, dialog);
                      dialog.addButton('Submit', dialog.hide, dialog);
                      dialog.addButton('Close', dialog.hide, dialog);
                      //添加上面定義的內(nèi)容
                      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}));
                      //結(jié)束更新
                      layout.endUpdate();
                  }
                  //顯示對(duì)話框
                  dialog.show(showBtn.dom);
              }
          };
      }();
      //代替window.onload,使得不需要等待圖片和其他資源即可進(jìn)行初始化
      Ext.EventManager.onDocumentReady(LayoutExample.init, LayoutExample, true);

通過上面的示例,讀者可以看出,要實(shí)現(xiàn)一個(gè)帶Tab的對(duì)話框,只需要不多的JavaScript代碼即可實(shí)現(xiàn),這在沒有Ext之前,是很難想象的。Ext提供了和后臺(tái)進(jìn)行交互的功能,但和Ext本身聯(lián)系比較緊密,不方便單獨(dú)使用它的Ajax功能。

1.5.2 MVC框架

目前實(shí)現(xiàn)MVC的框架非常多,比如大家都熟悉的Struts、Spring和WebWork等。通過前面對(duì)Mode l的介紹可以知道,Model 2會(huì)導(dǎo)致多個(gè)Controller的出現(xiàn),并且對(duì)頁面導(dǎo)航的處理比較復(fù)雜,所以Craig R. McClanahan于2000年5月 提交了一個(gè)框架給Java Community,這就是后來的Struts。2001年7月,Struts 1.0正式發(fā)布。截至到目前,Struts 2.1.6已經(jīng)正式發(fā)布了。

Struts 2概覽圖如圖1.16所示。

在2002年,Rod Johnson編寫了一本書:《Expert One-on-One J2EE設(shè)計(jì)與開發(fā)》,在這本書中,他描繪了Spring的雛形。最終,他因?yàn)椴荒苋淌蹺JB實(shí)現(xiàn)的繁雜,從而決定開發(fā)一個(gè)框架,這就是Spring。Spring由6部分組成,分別實(shí)現(xiàn)了開發(fā)Java應(yīng)用程序的不同內(nèi)容。得益于Spring框架設(shè)計(jì)的靈活性,使得它能與眾多開源框架相結(jié)合。

Spring框架如圖1.17所示。

圖1.16 Struts 2概覽圖

圖1.17 Spring框架圖

可以看到,Spring的整個(gè)框架的核心建立在Core的基礎(chǔ)之上,包括DAO、ORM、JEE、Web和AOP,由此也可以看出Spring的強(qiáng)大。

1.5.3 持久層技術(shù)

隨著EJB 3的發(fā)布,也有越來越多的人直接使用JPA了。Hibernate也提供了對(duì)JPA的支持,因此,在當(dāng)前的Java持久層框架中,Hibernate仍然是一個(gè)比較好的選擇。Hibernate在2001年發(fā)布了它的第一個(gè)正式版本;2003年6月,Hibernate 2發(fā)布;2003年年末,Hibernate被JBoss吸納;2005年3月,Hibernate 3正式發(fā)布。

為什么要使用ORM(Object/Relational Mapping)呢?這是因?yàn)殚_發(fā)人員使用的技術(shù)是面向?qū)ο蠹夹g(shù),而使用的數(shù)據(jù)庫卻是關(guān)系型數(shù)據(jù)庫,一個(gè)完整的類很難以對(duì)象的方式存儲(chǔ)在一個(gè)關(guān)系型數(shù)據(jù)庫中,它更適合存儲(chǔ)在對(duì)象型數(shù)據(jù)庫中。但目前關(guān)系型數(shù)據(jù)庫仍然占主流位置,所以要使用ORM在對(duì)象型和關(guān)系型之間建立關(guān)系,從而可以使開發(fā)人員完全用OO的思想去設(shè)計(jì)業(yè)務(wù)邏輯,而數(shù)據(jù)的存儲(chǔ)仍然使用關(guān)系型數(shù)據(jù)庫。

Hibernate對(duì)Java和.NET的支持體系圖,如圖1.18所示。

圖1.18 Hibernate對(duì)Java和.NET的支持體系圖

可以看到,因?yàn)镴DK 5.0推出的Annotations,Hibernate也開始支持Annotations,從而推出了Hibernate Annotations,使得Hibernate的配置文件不再只有XML這一種選擇。

主站蜘蛛池模板: 平度市| 和平区| 古田县| 新干县| 通渭县| 吉安县| 凤山县| 德昌县| 钟山县| 西吉县| 邯郸县| 娱乐| 江阴市| 石城县| 五原县| 阿巴嘎旗| 库伦旗| 中超| 响水县| 泉州市| 滨海县| 台中县| 屏东县| 渭南市| 利津县| 从江县| 湛江市| 荥阳市| 阿拉善盟| 丹寨县| 卓资县| 伊通| 郸城县| 无为县| 平凉市| 义乌市| 威远县| 高邮市| 古蔺县| 榆中县| 临清市|