??? 在java的web開發領域較麻煩的是數據庫操縱,如果有工具能像delphi開發數據庫運用系統那樣高效,它一定會受到開發者的歡迎。
??? 經過五個方面的比較,newxy+struts WEB開發與deiphi桌面開發相比,速度更快,能力更強。 http://blog.csdn.net/nlhlx/archive/2006/06/12/791047.aspx
??? newxy是hibernate的替代者,struts+newxy是struts+hibernate的替代方案。
??? struts的不足,下面一篇文章有代表性:《Struts的巨大煩惱 真的不適合大系統?》http://dev.csdn.net/develop/article/85/85114.shtm。
主要觀點是:
??? 一、轉到展示層時,需要配置forward,每一次轉到展示層,相信大多數都是直接轉到jsp, 而涉及到轉向,需要配置forward,如果有十個展示層的jsp,需要配置十次struts, 而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后, 要求重新部署整個項目,而tomcate這樣的服務器,還必須重新啟動服務器,如果業務變更復雜頻繁的系統, 這樣的操作簡單不可想象。現在就是這樣,幾十上百個人同時在線使用我們的 系統, 大家可以想象一下,我的煩惱有多大。
??? 二、當頁面表單需要自動變化或者頻繁變化時。
??? 對于一個成熟的MIS系統來說,頁面表單肯定是不固定的,甚至象有些系統,頁面表單是存在數據庫中, 需要填寫的表單在頁面自動生成,比如填寫一個人員基本信息,本來只需要填寫 姓名、性別、出生年月 三個指標, 而我后來需要增加籍貫這樣的指標,我只需要在數據庫中添加籍貫這個記錄,并在頁面就能自動增加籍貫這樣的表單。 而 struts在這方面,其優勢反而變成了不足,我參考了非常多的人力資源管理系統,這些系統幾乎都能夠做系統里面就可以控制人員信息的指示, 進行使展示層能隨之靈活變化,如果使用了struts,這些靈活性就根本用不上。 同時,如果頁面表單頻繁變化時,就需要頻繁修改formbean對應的方法和屬性,而每次修改之后,就要求重新部署,或者重新啟動服務器……。
??? hibernate的不足,下面是一位網友的看法,具有代表性:
??? 一、對象與數據庫的映射,關鍵在于對象關系的映射,但是沒做到很理想,配置過多,控制復雜, 另外還會出錯。其實本質在于對象不夠自由。
??? 二、事務處理。這點上更容易出問題,相對于各種各樣的事務管理器,要兼容是一個大問題, 總歸在各種應用服務器上有很多問題。其本質在于創建了一個自我數據存取小環境,必然面臨各種兼容問題。
??? 三、HQL語言。建立對象查詢語言,類SQL,但是不同于任何一種SQL,調試環境復雜。本質在于創建了一種語言,增加學習成本。
??? 這位網友還提出了減化和退化方案。
??? struts+newxy之所以在開發效率上比struts+hibernate能提高十倍、甚至幾十倍,是因為克服了struts與hiberate的不足。
??? 利用newxy DAO類,標簽, struts+newxy可以在以下幾個方面不用寫java代碼,不用配置struts。 http://blog.csdn.net/nlhlx/archive/2006/06/11/788541.aspx
??? 1.數據庫的增、刪、改;
??? 2.對查詢所得數據緩存,指定緩存時長;
??? 3.數據庫字符編碼與本地字符編碼轉換;
??? 4.文件上傳,上傳大小控制;
??? 5.文件下載,下載記數;
??? 6.圖片顯示;
??? 7.數據分頁顯示;
??? 8.客戶端標記記錄集哪條記錄被選擇;
??? 因為可以不寫java代碼,不用建立ActionForm類、Action類,因而不用配置struts,不用重新編譯類文件、不用重新打包、不用重啟服務器。 可以克服struts的不足。
??? 在克服hibernate的不足方面,newxy采用“退化”和“進化”并用的方案。
??? newxy在進行數據的查詢、增、刪、改時都會調用一注冊方法,根據業務涉及到的數據庫相關數據源名和表名進行注冊, 注冊的目的是要獲得表字段對應的java類名,主關鍵字段名,主關鍵字段長度等數據,保存在一個單子實例中,以供DAO類調用。 如果已注冊不再注冊。
??? 可以對多表查詢語句注冊,如:“select a.field1,b.field2 from table1 as a,table2 as b where ...";
??? 可以對跨數據源的查詢注冊。如:"select a.field1,b.field2 from table1 as a,DB3.dto.table2 as b where ...";
??? 如果是數據增、刪、改,則是對單一表注冊;
??? 由于struts+newxy用即時注冊的方法,可以不象hibernate那樣用靜態文件影射數據庫到值對象類。開發者不用配置任何文件。可以使用任意查詢語句,克服“對象不夠自由”問題。
??? hibernate通過配置文件設置表之間的關系,有一定意義,newxy在這方面算是“退化”的,但struts+newxy在處理數據庫表之間關系方面是很容易的。
??? 在事務處理方面,newxy提供了一事務類net.newxy.dbm.Transaction。它可以將多個數據庫的操作放在一個事務中。由于DAO類對數據操作前的注冊方法得到的表及其字段各種特性都是與數據庫直接相關的,而不是事先用靜態文件影射, 因而極少發生錯誤;開發者可以通過Transaction的方法為不同的數據庫設置不同的隔離等級;可以設置操時回滾時間,在設置的時間內事務沒有完成,會有一線程進行干預,將事務回滾。
??? hibernate的HQL語言是和數據庫與對象影射規則相適應的,它沒有特別功能,主要是利用值對象類來查詢數據。 newxy也提供了一種查詢語言NQL。開發者不需用特殊的語法來構建查詢語句。非常容易理解,不會增加學習成本。
struts一旦與newxy結合到一起運用是如此簡單,下列是struts+newxy代替struts+hibernate的例子。
??????? struts配置中,formBean的type是“net.newxy.struts_faces.DynaFormBean”,開發者不需另外設計ActionForm類。如:
??????????? <form-bean name="myFormBean" type="net.newxy.struts_faces.DynaFormBean" />
??????? 用戶從頁面表單submit數據后,在Action類的方法中,開發者可以用DynaFormBean代替struts ActionForm,用DynaDto代替hibernate 對象類。
??????? public ActionForward methodName(ActionMapping actionMapping, ActionForm actionForm,
????????????????????????????? HttpServletRequest httpServletRequest,
??????????? HttpServletResponse httpServletResponse) throws Exception{
??????????? ......
??????????? DynaFormBean form=(DynaFormBean)actionForm;
??????????? DynaDto dto=(DynaDto)form.getDto();
??????????? dto.set_table("table1");//如果用戶頁面沒有傳來數據庫表名。
??????????? try{
??????????????? IFacade ifacade=IFacadeFactory.getFacade(httpServletRequest.getParameter("_dao"),
????????????????????? httpServletRequest.getLocale());? //絕大多數情況是:IFacade ifacade=IFacadeFactory.getFacade();
??????????????? //更新或插入,如果result==null,為update,否則為insert。
??????????????? result = ifacade.update(dto);//或:FormBeanUtils.update(ifacade, form);
??????????????? //刪除記錄
??????????????? ifacade.remove(dto);//或:FormBeanUtils.remove(ifacade, form);
??????????????? //數據查詢,如果上傳了符合newxy多項查詢規則的數據。查詢記錄集放在newForm 的_coll屬性中。
??????????????? DynaFormBean newForm=new DynaFormBean();
??????????????? FormBeanUtils.createForm(newForm, httpServletRequest);
??????????????? ......
??????????????? //開發者如果想知道生成的sql語句,可以這樣:
??????????????? //string sql=form.get_sql();
??????????????? //由于開發者在對數據進行操作時完全不需知道sql語句,所以沒有提供方法讓開發者直接得到sql語句來控制數據操作。
??????????????? //未來版本可能提供這樣的方法。
??????????? }catch(Exception e){
??????????????? ......
??????????? }
??????? }
??????? 如果使用newxy的標簽可以不建立Action類,不設置struts的formBean及action,可以不寫代碼。
???