1. 由表生成model 運行mvn appfuse:gen-model
會在model包中生成Person.java查看原代碼,原來model中有兩個ID的生成策略,如下:
@Id @GeneratedValue(strategy=IDENTITY) @GeneratedValue(strategy = GenerationType.AUTO)
刪除@GeneratedValue(strategy=IDENTITY),只剩下一個。
2.由model 生成CRUD 運行mvn appfuse:gen -Dentity=Person會生成personList.jsp、
personForm.jsp、PersonAction.java 但是沒有自動生成dao與service 而是采用的
GenericManager<Person, Long>中的方法。如果想生成相應的service和dao需要修改pom.xml
配置文件。在項目下的pom.xml中查找genericCore,大概在940行 找到 將屬性true 改為false
像這樣<amp.genericCore>false</amp.genericCore>,重新運行 mvn appfuse:gen -Dentity=Person
在eclipse中查看代碼 dao 與 service也都生成了。
3.亂碼問題
對于APPFUSE生成的工程運行時亂碼是很常見的現象,造成該現象的原因也有幾種:
為了偷懶,這里引用一篇網上的文章:
http://www.aygfsteel.com/43880800/archive/2006/11/18/81892.html
對于國際化文件*.properties文件的編輯,有兩個ECLIPSE插件可以推薦使用PropertiesEditor 和
ResourceBundleEditor 再次偷懶引用一篇網文:
http://blog.csdn.net/lmjq/archive/2007/06/21/1660137.aspx
1:安裝jdk和maven
1)JAVA_HOME 設置為剛才安裝的JDK的安裝路徑
2)M2_HOME設置為Maven的安裝路徑
3)path 部分 添加:%M2_HOME%\bin;%JAVA_HOME%\bin
關于maven的本地倉庫和maven proxy設置詳見【Maven安裝和使用】
2:構建項目
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts - DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.onet.bd - DartifactId=BDSystem
可以參考appfuse官方網站上的構建命令,其中DgroupId:所構建項目的包名稱,DartifactId:項目名稱。
3:運行工程
mvn jetty:run-war
打開瀏覽器http:localhost:8080/即可以看到生成的web項目
4:獲得源文件
mvn appfuse:full-source
6:生成eclipse項目文件
mvn install eclipse:eclipse
- appfuse是什么?
AppFuse是一個集成了當前最流行的Web應用框架的一個更高層次的Web開發框架,也可以說是一個Web開發基礎平臺,它與它所集成的各種框架相比,它提供了一部分所有Web系統開發過程中都需要開發的一些功能,如登陸、用戶密碼加密,用戶管理、根據不同的用戶可以展現不同的菜單,可以自動生成40%-60%左右的代碼,自帶了默認的一些在CSS中設定的樣式,使用這些樣式能很快的改變整個系統的外觀,還有自動化測試的功能。
- appfuse能干什么?
它最大的價值就是為我們提供了一個Web開發的新的方式和思路,盡管這些技術在國外都已進很流行了,但在國內能夠將Hibernate、Struts、Spring、DBUnit、Ant、Log4J、Struts Menu、Xdoclet、SiteMesh、Velocity、JUnit、JSTL、WebWork這些技術集成到一個框架中的還不多見,所以即使不使用它的全部功能,它也給我們提供了一個很好的借鑒、學習的機會。 AppFuse的另一個啟示是:我們可以依靠開源軟件的功能降低開發成本,而且可以閱讀開源軟件的代碼提高所在團隊的整體實力。
- appfuse有什么?
一.Struts
1. AppFuse中默認的MVC框架是Struts,而且使用的是LookupDispatchAction,并且使用的是按鈕(button),在XP下用IE瀏覽效果還可以,但如果在2000或者98下,就使外觀很難看,而且當時我還遇到一個問題:如果按鈕顯示中文,則在DisplayTag中翻頁失靈,而且報錯,后來我把BaseAction的相關方法改變了,才可以使用,因為國內的客戶都比較重視界面,所以后來我將那些按鈕都改成圖片了,當然也要添加一些方法了,有點麻煩!
2. Struts中的標簽如今推薦使用的只有html部分的標簽了,其他的標簽或者可以使用JSTL替代,或者已經不推薦使用了,而且AppFuse中推薦使用JSTL,而JSTL和struts的標簽的聯合使用時,需要的不是<html:標簽>,而是<html-el:標簽>,這個問題曾經困擾了我整整2天。
3. Struts的Validation的校驗規則并不完善,比如如果使用客戶端的javascript校驗,則在郵箱中輸入漢字根本校驗不出來,到了服務器端報錯。
4. 最嚴重的問題是AppFuse生成的Struts的validation.xml文件中有許多多余的“.”,如果你去掉了,常常在執行ant的deploy任務時又恢復原樣。這樣是提交表單的時候經常會報javascript的腳本錯誤或者缺少對象或者缺少value,所以我會手工的修改這個文件,然后把修改后的文件備份,當重新生成有錯誤的文件時,我會用備份的沒有錯誤的文件去覆蓋。
5. Struts的validatioin對于使用同一個FormBean的Action的校驗方式比較復雜。(待解決)。
二.Hibernate
1. Hibernate是現在受到越來越多的人推崇的一個ORM工具(框架、類庫),它將我們從繁瑣的使用JDBC的開發過程中解放出來,但同時也帶來了新的問題,如學習曲線,執行效率,數據庫設計優化,還有最重要的靈活性。Hibernate不是一個很容易上手的東西,要完全駕馭它還需要讀很多資料,但好的資料卻很少。
2. 使用Xdoclet可以很方便的生成Hibernate中的持久類的配置文件(*.hbm.xml),但對一些特殊的映射卻無能為力,如使用序列的id生成規則,序列的名字沒有地方寫,所以也只好先利用它生成主要的內容,然后手工修改。
3. 同樣還是id的生成策略問題,如果使用序列、hilo等需要一些數據庫機制支持的策略時,schemaExport并不能自動生成序列或者保存當前id的表,這項工作仍然要手工解決。
4. Hibernate中提供了幾種關聯,一對一、一對多、多對多,但對于怎樣調整效率卻沒有一個很明確的提示,還要根據情況判定,這就帶來和一些彈性的設計。
5. Hibernate中可以選擇的操作數據庫的方式有3種,其中HQL功能最強大,但有些功能使用標準查詢可能會更方便,但會有一些限制,所以雖然它很靈活,但易用性不如JDBC好。
三.Spring
在AppFuse的過程中,Spring完全隱藏在幕后,除了一些配置外,幾乎感覺不到它的存在,所以我在使用它的過程中并沒有遇到什么麻煩,這里只是簡單的介紹一下它在AppFuse中起到的作用。
1. Spring在AppFuse中起到的主要作用是對Hibernate的Session和事務的管理,利用Spring封裝的Hibernate模板類,我們大大地減少了實現DAO的代碼行數。
2. Spring還起到了連接映射文件和類之間的關聯,及接口和實現類之間的關聯,這些都依賴于Spring的IoC的機制的實現。
3. 對于字符進行編碼和解碼部分用到了Spring自帶的Filter,只需要在配置文件中配置就好了。
四.SiteMesh
SiteMesh是一個基于Decorator模式的技術,它可以修飾返回的網頁文件,它的工作方式受到越來越多的人的推崇,這點從Manning出版的一些技術書籍中可以看出來。
我在使用SiteMesh的過程中并不順利,我參考了《Java Open Source Programming》,這本書中說SiteMesh在默認的情況下不對下載文件進行裝飾,但我在下載文件時發現,我的文件內容被丟棄了,取而代之的是SiteMesh的模板的內容,后來我通過修改SiteMesh的配置文件解決了這個問題,但感覺還有一些不太清楚的地方需要學習。
五.DisplayTag
DisplayTag是一個優秀的顯示內容的標簽,從SourceForge的訪問量來看,它是很活躍的項目,僅次于Ant、Hibernate、Xdoclet等幾個著名的項目,我總結,它的主要功能有4項:顯示、分頁、排序、將顯示的數據寫入指定類型的文件中,然后下載。
1. 據我使用的情況看,我只使用了分頁和顯示的功能,因為當時我沒有很好的解決中文編碼的問題,所以排序會有問題,直到昨天,我在朋友的幫助下解決了這個問題,至此我可以放心使用的功能又增加了排序(我昨天簡單的測試了一下是可以的)。
2. 但對于將顯示的內容生成到一個指定格式的文件中的功能卻有著很多缺陷,如:
(1) 生成的文件中只有顯示的數據,那些沒有顯示在界面上的的數據,則不會被寫到文件中。
(2) 如果修改了DisplayTag的顯示的內容,比如添加一列,在這列中的內容不是字符,而是HTML的標簽,則生成的文件只有這些HTML標簽,而沒有數據。
(3) 即使DisplayTag中沒有我們定制的HTML腳本,生成的文件偶爾也有問題,比如:它會把“007”生成為“7”,把字符串自動的轉換為整型值。有時候還生成空白內容的文件。
(4) DisplayTag生成的Excel文件兼容性不好,有時在Excel2003中不能正常打開,或者在XP下打開報錯。
后來,我看了作者寫的《Spring Live》,書中說如果想實現穩定的Excel,推薦使用POI,于是我使用POI生成Excel,穩定性和兼容性都不錯。
六.DBUnit
DBUnit是一個可以被Ant集成的向數據庫中添加數據和備份數據的一個類庫,配置很方便,因為AppFuse已經集成好了,所以使用也很容易。
但是如果你使用EditPlus之類的工具手工修改了AppFuse生成的內容,則執行Ant的setup、setup-db或者deploy的任務時,常常報錯,說無效的格式,這是因為這個被手工修改的文件再次被AppFuse執行后,它的第一行的文件聲明的前幾個字母是無效的,是因為本地的字符集編碼的原因而引起了亂碼,如果把這幾個無效的字母去掉,問題就解決了。
七.Struts Menu
Struts Menu也是AppFuse的作者開發的一個開源軟件,它可以根據配置文件讀取當前用戶可以使用的功能菜單,這個功能是我一直以來都想要的,我也找到了一些代碼,但實現的都不如這個完善,沒什么好說的,使用簡單,配置容易,很好的解決了我的問題。
問題是我只使用了AppFuse提供的2個角色,對于多個角色的實驗我還沒有做。
八.XDoclet
在AppFuse中,使用Xdoclet生成了幾乎一切的配置文件:Struts-config.xml、web.xml、validation.xml、*.hbm.xml等文件,如果使用AppGen的話,還會生成更多的文件,這一切都是使用Xdoclet實現的。
問題是我在Struts部分提到的,生成的Validation.xml文件中會多生成一個“.”,另外在生成資源文件時也會多生成一個“.”,目前我沒有很好的閱讀這段代碼,不知道是不是Xdoclet的問題。
九.Ant
Ant并沒有什么問題,但在執行作者寫的Ant任務的時候,有一些任務不能正常執行,比如,運行模擬對象測試的任務,作者也在1.7版本的修復列表中提到以前版本有些ant任務不能執行,在1.7中修改了一些ant任務,使他們能夠正常的執行了。
實際上,我們如果使用AppGen進行開發的話,使用的任務一般不超過8個。
十.JSTL
JSTL是個好東西,我常用的有<c:>和<fmt:>部分的標簽,但是如果使用JSTL進行邏輯判斷,我并沒有感覺比使用JSP的代碼塊優雅多少。另外,熟悉JSTL也需要一段時間,我就經歷了面對著JSP頁面不知道該怎么寫JSTL語法的困境。當然,AppFuse中使用的基本都是JSTL,包括向DisplayTag傳遞顯示的數據,使用的都是JSTL語法,這方面的資料挺多,我參考的是電子工業出版社出的《JSP2.0技術》,說的很詳細。
十一.Tomcat
你也許會說:“Tomcat就不用說了吧?”,是的,Tomcat一般都會使用,但是―――――――――――――Tomcat5和Tomcat4.X對于中文編碼使用了不同的機制,這個問題困擾了我好久,我解決了頁面上寫入漢字顯示亂碼的問題,我也曾經以為DisplayTag對漢字不能排序,也不能正常分頁是因為DisplayTag的開發者都是老外,是因為他們沒有考慮中文的關系的原因。
直到昨天,我才知道這一切都是因為Tomcat5對漢字編碼的實現的方式和Tomcat4不一樣的原因,如果感興趣,可以看看這個帖子:http://www.javaworld.com.tw/jute/post/view?bid=9&id=44042&sty=1&tpg=1&age=0
十二.JavaScript
JavaScript簡單易學,但想運用自如就不太容易了。AppFuse中嵌入了幾個js文件,里面包含了許多函數,值得我們好好的研究一下,比如,如果有一個必填字段沒有填寫,AppFuse會自動的聚焦在那個input上,類似的小技巧有很多,你可以自己去翻看。
但AppFuse自帶的JavaScript腳本有一個Bug,就是當DisplatyTag中沒有可以顯示的數據時,你用鼠標單擊,它會報JavaScript錯誤,你仔細研究一下function highlightTableRows(tableId) 就知道了:我的解決辦法是在location.href = link.getAttribute("href");前面添加一行判斷:if (link != null)。
十三.資源文件國際化
對于Struts和DisplayTag都涉及到資源文件國際化AppFuse1.6.1很好的解決了Struts資源映射文件國際化的問題,你只需要在對應本國語言的資源文件中寫入漢字,Ant中有一項執行native2ascii的任務,AppFuse自動的為你進行了資源文件的編碼轉換,而對于DisplayTag的資源文件問題,還要自己執行native2ascii命令,為了避免每次都輸入一串命令,我用Delphi寫了個小工具,可視化的選擇資源文件,點擊按鈕自動執行該命令,底層依賴于JDK。
mvn appfuse:gen-model |
根據數據庫的表生成java類 |
mvn appfuse:gen |
根據 POJOs.生成并安裝Tests, DAO, Managers, Controllers and Views |
mvn appfuse:full-source |
把運行所需要的org.appfuse中的依賴類轉換成你的包名稱 |
mvn eclipse:eclipse |
生成eclipse的項目的配置文件,用戶可以直接把項目導入到eclipse中 |
mvn jetty:run-war |
打包并且發布你的應用程序到Jetty, 查看在 http://localhost:8080 |
mvn appfuse:install |
把生成的源代碼及配置文件寫入到src中 |
mvn integration-test |
啟動TOMCAT(或別的服務器)進行測試 |
mvn appfuse:remove |
刪除appfuse:gen.生成的代碼 |
mvn appfuse:clean |
清除target下的所有內容 |
http://www.infoq.com/cn/ 影響有影響力的人為目標的技術網站。主要是技術潮流文章. Java開發者必去的20個英文技術網站
http://www.javaalmanac.com - Java開發者年鑒一書的在線版本. 要想快速查到某種Java技巧的用法及示例代碼, 這是一個不錯的去處.
http://www.onjava.com - O'Reilly的Java網站. 每周都有新文章.
http://java.sun.com - 官方的Java開發者網站 - 每周都有新文章發表.
http://www.developer.com/java - 由Gamelan.com 維護的Java技術文章網站.
http://www.java.net - Sun公司維護的一個Java社區網站.
http://www.builder.com - Cnet的Builder.com網站 - 所有的技術文章, 以Java為主.
http://www.ibm.com/developerworks/java - IBM的Developerworks技術網站; 這是其中的Java技術主頁.
http://www.javaworld.com - 最早的一個Java站點. 每周更新Java技術文章.
http://www.devx.com/java - DevX維護的一個Java技術文章網站.
http://www.fawcette.com/javapro - JavaPro在線雜志網站.
http://www.sys-con.com/java - Java Developers Journal的在線雜志網站.
http://www.javadesktop.org - 位于Java.net的一個Java桌面技術社區網站.
http://www.theserverside.com - 這是一個討論所有Java服務器端技術的網站.
http://www.jars.com - 提供Java評論服務. 包括各種framework和應用程序.
http://www.jguru.com - 一個非常棒的采用Q&A形式的Java技術資源社區.
http://www.javaranch.com - 一個論壇,得到Java問題答案的地方,初學者的好去處。
http://www.ibiblio.org/javafaq/javafaq.html - comp.lang.java的FAQ站點 - 收集了來自comp.lang.java新聞組的問題和答案的分類目錄.
http://java.sun.com/docs/books/tutorial/ - 來自SUN公司的官方Java指南 - 對于了解幾乎所有的java技術特性非常有幫助.
http://www.javablogs.com - 互聯網上最活躍的一個Java Blog網站.
http://java.about.com/ - 來自About.com的Java新聞和技術文章網站.