最近在做一個JavaWeb程式,用MyEclipse開發,用Struts(*.do)做開發架構,Hibernate做資料庫代理類,負責對資料庫的操作,鑑效組資料持久和資料訪問,Spring用來整和注入,哎,還用了Ajax,在Java中實現真他媽的讓人煩,什麼Ajax,根本就是寫JS指令碼嘛(不過本來也是,就是最原始的那種拉),自己手寫了JS指令碼,好久沒寫過這麼多了,也當練習一下XMLHTTPRequest拉。
引用
要是在.net中那就方便多了,直接就拖AjaxControlToolkit控制項,5個AJAX Extensions核心組件,還有幾十個ajax Toolkit控制項,有兩邊對聯做廣告的,有做像Google智能提示的(說到這個,我做每回有一個問題,就是在指定了返回記錄的Item每一行Css樣式之後,當用鍵盤上下的方向鍵移動所選條的時候,它就出現了指令碼錯誤,也不能用方向鍵移動所選條了,我試過了,只要不設定class他就沒一點問題,能正常移動選擇和智能提示,但是不設定樣式那哪看得?他預設都是黑字白背景,不過不曉得是不是DIV層做的,我以前用返回<span style='color:red'>Jonllen</span>做測試,他卻沒能返回Jonllen,然後我對他進行Html編碼和反編碼都試過了,也不行,在頁面裡面要是能得到顯示Html的效果(說到這裡我呀有要叉開話題了,等後面講考試在說了),要是這樣能行的話那也能設定它的Css style了,但是就是不行,不知道大家有沒有碰到我這種情況過,還請知道的大蝦指點)還有做瑣定凍結頁面做實現的,還有談出的等等...要什麼有什麼,看你要實現什麼功能了,但我覺得就是MS這些Ajax控制項調用WebServer的太多了,就有時要新寫個WebMethod不習慣感覺麻煩了,不過這倒是順了Ajax的本質咯,就是要回調WebServer的Xml,不過我覺得以前做的Ajax還可以,他沒有做成控制項,只是要引用dll,回調的是一個Ajax方法,我以前在VS2003裡用AjaxPro.dll,感覺還可以,雖然此方法有很多局限性,但用起來感覺挺方便的。MS真是夠人性化,Sun也要學著點就好了,不過當前Sun還是做好它的J2EE規範在說吧.
剛開始還可以,就是JS不好怎麼調試,就只能做死了alert看執行到了那一步,不一會兒JS搞定了,我在JS裡面調用的open url是一個servlet類,然後在這裡調用Hibernate對資料庫操作,以達到Ajax的非同步處理,因為我這個項目以前是連SQL Server 2000的,不過現在我要用MYSQL資料庫了,呵呵,免費的那種,我就把以前工程裡面的Hibernate要連SQL Server 2000的三個驅動包給刪了,接著選擇DB Browser(資料庫瀏覽器)重新設定了Hibernate的資料連線,Edit更改連接埠,輸入資料庫口令,哦,還要添加一個MQSQL資料庫連接驅動串連包(jar檔案),找啊找,在E盤,選擇,配置OK,Next,Finish完成,Open Connection,一長串進度條到結尾後,OK串連成功了,一帆風順,點開一看幾個database下面幾個table都對數,我刪掉了以前的工程底下hibr包下的一些資料對應對象和相應的DAO資料訪問,然後Hibernate Reverse Engineering重新添加刪除的那些Hibernate資料庫映射對象,用assigned(有主鍵)的用assigned,用native(自動成長主鍵)用native,OK,Hibernate代理類搞定,現在只要看servlet裡面,...DAO dao = new ...DAO()…對資料庫操作完成!現在就看Ajax的了,它是如何的偉大,在不重新整理的情況下非同步CallBack伺服器,配置一下WebLogic,Redeploy重新部署,Run運行,開啟Brower鍵如URL看效果咯,滿懷期待,想著:onclick提交,addshow()調用JS一個函數,回傳到伺服器,結果···返回的是一個alert('你所請求的頁面有異常'),呵呵~哎,為什麼類?我關閉一下調試,在重新啟動一下,還是提示有異常,為什麼,為什麼,為什麼呢?我認真的檢查了我一下JS代碼,認真的過了一遍JS裡面的function,一個個檢查,定義XMLHttpRequest對象、sendRequest(url)發送函數請求、processResponse()處理返回資訊的函數,等等...sendRequest(url)發送函數請求,對URL,應該是這個問題,我的url是"servlet/FindServlet?sn=" +ss;FindServlet是我工程ss包下面的FindServlet.java的servlet類,ss是在JS裡面var的一個變數,在細想了一下,servlet/FindServlet?sn="+ss,不是ss/FindServlet?sn="+ss嗎?不是,後來也用ss也測試了一下,確實不是,那是什麼問題呢?難道問題不是出在URL上面,url沒錯,想了一陣了,靈機一動,測試一下不就知道了嗎!我連忙開啟FindServlet這個類,一時間還很狠啪著自己的後老勺:你真笨啊!進入FindServlet,在doGet方法裡邊String shen = request.getParameter("sn");System.out.println(shen);擷取sn查詢字串(呵呵.Net學多了),然後再在控制台輸出,儲存運行,哎,真的輸出了,控制台裡面輸出了"湖南",我sn查詢字串的值,那這麼來說,URL確實沒有問題,它已經把請求發送到我的這個FindServlet類裡面來了,這裡我已經能接受到了,接著在FindServlet類往下看,在一些關鍵性的代碼後加上System.out.println("變數值");我習慣性調試Java的方法,調試運行,果然還沒有執行完就報異常了,控制台在輸出了DAO前面的變數值後後面的就都沒有輸出了,一定就是DAO的問題了!我把目光轉到DAO,第一行AddrtableDAO dao = new AddrtableDAO();就執行個體化絕對沒問題List list = dao.findAll(shen);應該問題System.out.print(list.size());此行在控制台沒有輸出結果,List list = dao.findAll(shen),findAll(shen)是按指定條件shen對資料庫執行查詢返回List集合的方法,就是這句對資料庫查詢有問題了(一時間感覺自己真的了不起,我這個人比容易較驕傲自滿,我自己都受不了自己了),馬上寫了一個static void main()方法測試,果然是Hibernate代理資料庫操作類出現了問提,提示Can not Connection不能串連,為什麼類?連不上,我明明在DB Browser裡配置好了連MySQl的設定,在那裡連上了啊,還可以看到資料庫和表啊,怎麼建的Hibernate資料庫代理類就連不上了類,我馬上轉到了hibernate.cfg.xml Hibernate設定檔,一看,暈了,怎麼在設定檔裡面用的還是以前的那個的配置設定,我不是改成MySql了嗎,我知道了,你在DB Browser選擇好資料庫連接對象,並未更改Hibernate資料庫連接配置,暈了,這MyEclipse怎麼這麼蠢啊,不知道自動更改Hibernate設定檔,唉癡哦,手動更改後調試運行,心想這次應該能OK了吧,但結果總是出現意外,老和所想的背道而馳的,有出西西了,一長串異常:什麼Error Creating SessionFactory等一大片英文,搞得我頭都大了,點異常進去看,就是到了那些Hibernate那些砸七砸八的那些包的原類型裡了,一個個類N多代碼,看得真叫人煩拉,想起就鬱悶,這MyEclipse調試可真JB麻煩,又全英文版的(想起.Net中調試,哎```個人覺得Java中就是jar包太繁多了,而一些重要的設定都儲存在Xml的設定檔裡面,感覺喜歡拿xml設定檔出氣!如頁面導航等,但內容多了就顯得繁雜了,就只能手動修改Source了),心裡直罵Java垃圾,不禁雙手抱著後老勺往後仰,看這天花板鬱悶ING。回下頭來看到了這MyEclipse工具,蔑視了工程一下,回到電腦面前,看啊看,順眼看了這些砸七砸八的包,哎,似乎少了什麼東西,憑直覺我又過了那些jar包檔案一便,細想了一翻,又仔細看了那些包一遍,我的MySql資料庫驅動jar包檔案類!怎麼沒有呢?我再Refresh一下還是沒有看到啊!拐了,我雖然刪除了以前連Sql Server 2000的3個包,但是怎麼MySql的包怎麼沒有導進來呢?第一時間問為什麼?難道又是DB Browser的問題,你在那裡選擇Add JARS選擇是驅動包檔案是用的磁碟實體路徑,也就是說他沒有自動把你所選擇的包自動加在到你的工程裡面進來了,該死的DB Browser,害得我Hibernate老是連不上,這個問題好象只在你以前用一個資料來源現在又換掉一個新的資料庫連接時才有,我打工程檔案所在目錄,進入WebRoot\WEB-INF\lib目錄,手動將我E盤底下個那個MySQL資料庫連接驅動Jar包Copy到這個目錄下,再在工程裡面Refresh一下,MySql包就出來了,運行WebLogic開啟瀏覽器,onclick,啊````終於出來了,通過JS查詢到資料庫伺服器裡面的資料了。我在Java中實現Ajax就這樣成功了!你們看了我寫了這麼多覺得好不好笑啊,是不是感覺我是垃圾啊,菜鳥一個,我的確也是菜鳥,本來就是,要是高手的話可能一看就知道錯誤出在那裡了,就不會想我這樣折騰了吧!是不是我說了一些Java很低級的常識類?而我自己卻不清白類!希望大家莫見笑我了,第一次寫這些Hibernate知識,我犯的一些錯誤,應該大家有些Java的朋友在些Hibernate的時候沒出現過我這樣的問題吧,其實我對Java是比較感興趣的,但是由於我所學的Java的知識太少,對有一點難的就不知道做了,那是因為我個人學的Java太膚淺的原因,我知道其實在.net中實現在在Java裡基本上可以實現的,只不過可能比在.net中實現難一點而已吧。 在網上看到有很多朋友有拿過JAVA的Hibernate和.NET中的ADO.NET進行比較,也有很多人說兩著不能進行相比,就像SQL語句不能和預存程序進行相比一樣,只要能在恰當的時候用就是好的,我都很認同的他們的觀點和看法,而我個人認為呢,只要有自己的對事物認識的觀點就是好的。我是一個比較愛說的人,我覺得你只要能認真的去思考分析一件事物,不管你得到的結論是怎麼樣的,旨在在這個過程你從中是否學到了一些東西,我不喜歡那些平時不愛說話的,因為那時候我們不知道他對這個事物的看法是怎樣的,也難以猜測他心裡到底在想什麼。既然上面有說到Hibernate和ADO.Net,所以我又加上了這一段羅嗦起來了,呵呵,就我這皮毛也當回顧我以前一些知識,談不上總結也算小記一翻,希望高手們別笑話我們這些新手了,下面就我所瞭解的Hibernate和ADO.NET比較如下:在Hibernate中,首先我們需要在JAVA工程裡面添加Hibernate標籤庫(我用的是Hibernate 3.1 Core Libraries)的引用,在.Net中我覺得就是using、import名稱空間SqlClient、OleDb添加程式集的過程,然後我們需要開啟DB Brower建立資料庫連接字串,就是打伺服器名使用者名稱密碼等,然後Hibernate會這些資料庫連接資訊儲存在hibernate.cfg.xml(預設預設)這一個xml檔案中,在串連資料庫的時候值得一提的是需要資料庫連接驅動包,不同的資料庫有不同的驅動包,個人覺得不同的驅動包作用在與,由於不同資料庫用的可能的是不同串連操作方式,如Oracle是資料表空間的形式存在資料庫等,而其他的可能略有不同。正確配置好串連成功後,我們就能在DB Brower裡看到資料庫和資料庫對應的表了,在你串連資料庫前添加Hibernate時它會叫你選擇包,添加後包下面就會多3個類了,IBaseHibernateDAO、BaseHibernateDAO、HibernateSessionfactory從名字就可以看出來就是一個介面、一個介面實作類別(implements)、一個工廠,具體裡面是如何?的以及其原理機制我此小輩能講清楚的,我還是有自知知明的,等下甭被我的這點Java皮毛知識給歪曲了那就不好了,不過我看裡面的代碼也很少簡單,要理解起來也不難,反正就建立了這3個類,然後我就需要在DB Brower裡面選擇相應的表Hibernate Reverse Engineering添加對應DAO和Model,Model就是資料庫表對象映射執行個體,資料庫表的每一列充當Model類的屬性欄位,並添加有get、set規則的屬性訪問器,而DAO類裡面則封裝的是對該表的一些常見的資料訪問操作(insert、delete、update、select),它有自己的HibernateSQL語句(不是一般的sql語句),這一塊我手動寫得很少,不過和一般的sql語句文法還是很相似, 如有按屬性名稱查詢返回Model強型別化List集合等,除此之外,每添加一個表還會自動添加表名.hbm.xml檔案,這個xml檔案儲存資料庫映射到Hibernate表欄位的具體資訊,如主鍵資訊、列長度相應的Java類型等,要注意的是在添加的時候它會叫你選擇ID Generator表的資訊,這裡常見的是assigned(有表主鍵)和native(自動成長主鍵),因為在呆後建立的時候它會根據你所選擇的資訊建立不同的DAO和Model,如在建構函式和一些資料訪問的方法裡面就可能有需要ID主鍵的,而對於自動成長的則無須輸入ID主鍵即可。你可以對多個可能用的到表執行上述Hibernate Reverse Engineering映射操作,你可以在不寫一局代碼的情況下完成對資料庫的大多數的一般操作在其他地方很方便的調用,我覺得這就是Hibernate的最大的好處優點;而在.Net中類,相對Hibernate來說我想是一步一個腳印,什麼DAO方法等代碼一行行寫,不過我覺得這樣也沒什麼不好的,我們一般在項目中就用一個SqlHelper類,裡面寫上對資料庫的一些增刪改查方法等。根據傳來的SQL語句和參數組或預存程序等動態返回資料集合(List)或記錄數等,用起來也挺好的,頂多還對不同的執行個體添加對應的DAL,這些基本上能滿足我們對資料庫的基本操作了。不過我覺得在Java中這樣實現也可以啊,我以前就在Java裡面寫了一個SqlHelper類代替了Hibernate,用的是JdbcOdbc資料庫連接,感覺也很實用,簡單明了,但是Hibernate在一些效能等方面的優勢我們上不容忽視的,至少我覺得一個東西的存在它總有它存在的價值,不知道我說得不是不讓人感覺到鬱悶,我簡單的回顧了一帆,第一次寫理論這東西,我想錯誤肯定會有很多,還請大家批評指正,我必虛心受教!