City of Dream

          實踐出真知

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            2 隨筆 :: 1 文章 :: 35 評論 :: 0 Trackbacks
          后臺采用Struts2+Spring2.5+Hibernate3的經典模式。簡約主義,體現在分層簡約(三層:Action、service、dao)、結構節約(類的解耦:Action一個類,通過DI調用Service。Service通過配置注入泛型基類dao的實例,無需手工書寫dao。添加一個Model,后臺就OK了)、配置節約,默認的Struts無需進行任何配置,因為我們已經采用了通配符的方式:
          Struts.xml
          1     <package name="page" extends="json-default" namespace="/page">
          2        <action name="*/*" class="{1}Action" method="{2}">
          4            <result name="success">/WEB-INF/pages/{1}/list.jsp</result>
          5            <!-- 引入JSON,前臺用YUI展示 -->
          6            <result name="json" type="json"/>
          7        </action>
          8     </package>

          Spring需要配置如:
           1     <!-- Service Begin -->
           2     <bean id="userManager" class="com.aostar.service.UserManager">
           3        <property name="sessionFactory" ref="sessionFactory" />
           4     </bean>
           5      <!-- Service End -->
           6     <!-- Action Begin -->
           7     <bean id="userAction" class="com.aostar.webapp.action.UserAction" scope="prototype">
           8        <property name="userManager" ref="userManager" />
           9     </bean>
          10     <!-- Action End -->

          Hibernate需要加一行:
          1        <property name="annotatedClasses">
          2            <list>
          3               <value>com.aostar.model.User</value>
          4            </list>
          5        </property>
          因為我們采用了JPA,避免手工書寫xml。
          至于前臺,與后臺的聯系是單純的數據交換,JSON格式的數據很適合在有限的帶寬里無限奔跑。基于此,數據交換格式采用JSON,而前臺UI使用YUI制作。話說YUI還是不錯的,文檔一應俱全(雖然是英文),效果也很可贊。
          前臺,一個頁面搞定CURD:
            1 <script type="text/javascript">
            2 YAHOO.namespace("aostar.container");
            3 
            4 var myDataTable,myDataSource;
            5 //啟動時載入,獲取JSON數據,初始化列表
            6 YAHOO.util.Event.addListener(window, "load"function() {
            7     YAHOO.aostar.USERJSON = new function() {
            8         var myColumnDefs = [
            9             {key:"id", sortable:true, resizeable:true},
           10             {key:"name",sortable:true, resizeable:true},
           11             {key:"module",sortable:true, resizeable:true},
           12             {key:"note"},
           13             {key:"active"}
           14         ];
           15 
           16         myDataSource = new YAHOO.util.DataSource("jsonList.action");
           17         myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
           18         myDataSource.connXhrMode = "queueRequests";
           19         myDataSource.responseSchema = {
           20             resultsList: "page.list",
           21             fields: ["id","name","module","note","active"]
           22         };
           25 
           26         myDataTable = new YAHOO.widget.DataTable("json", myColumnDefs,
           27                 myDataSource, {initialRequest:""});
           28 
           29         myDataTable.subscribe("checkboxClickEvent"function(oArgs){
           30             var elCheckbox = oArgs.target;
           31             var oRecord = this.getRecord(elCheckbox);
           32             oRecord.setData("check",elCheckbox.checked);
           33         });
           34                 
           35         //監聽row的相關行為
           36         myDataTable.subscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow);
           37         myDataTable.subscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow);
           38         myDataTable.subscribe("rowClickEvent", myDataTable.onEventSelectRow);
           39     };
           40 });
           41 //處理Dialog的各種動作
           42 function init() {
           43     // 處理Dialog層的各種觸發動作
           44     var handleSubmit = function() {
           45         this.submit();
           46     };
           47     var handleCancel = function() {
           48         YAHOO.aostar.container.dlg.form.reset();
           49         this.cancel();
           50     };
           51     var handleSuccess = function(o) {
           52         var m,response;
           53         try {
           54             m = YAHOO.lang.JSON.parse(o.responseText);
           55         }
           56         catch (x) {
           57             alert("解析JSON失敗!");
           58             return;
           59         }
           60         YAHOO.aostar.container.dlg.form.reset();
           61         if(m.message=="create"){
           62             response = "新增表成功,點擊“確定”刷新頁面"
           63         }else if(m.message=="update"){
           64             response = "更新表成功,點擊“確定”刷新頁面"
           65         }
           66         if (confirm(response)) {
           67             window.location.reload();
           68            }  
           69     };
           70     var handleFailure = function(o) {
           71         alert("提交失敗: " + o.status);
           72     };
           73 
           74     var batchDeleteMethod = {
           75         success : function (o) {
           76             var m,response;
           77             try {
           78                 m = YAHOO.lang.JSON.parse(o.responseText);
           79             }
           80             catch (x) {
           81                 alert("解析JSON失敗!");
           82                 return;
           83             }
           84             if(m.message=="delete"){
           85                 response = "刪除表成功,點擊“確定”刷新頁面"
           86             }
           87             if (confirm(response)) {
           88                 window.location.reload();
           89                }  
           90         },
           91         failure : function (o) {
           92             if (!YAHOO.util.Connect.isCallInProgress(o)) {
           93                 alert("服務調用失敗!");
           94             }
           95         },
           96         timeout : 3000
           97     };
           98 
           99     //編輯方法
          100     var editRowData = function(e){
          101         //var oRecord = myDataTable.getRecord(myDataTable.getFirstTrEl());
          102         var oRecord;
          103         var selectRows = myDataTable.getSelectedRows();
          104         if(selectRows.length!=null && selectRows.length==1){
          105             oRecord = myDataTable.getRecordSet().getRecord(selectRows[0]);
          106             var formData = YAHOO.aostar.container.dlg.form;
          107             formData.reset();
          108             formData.id.value = YAHOO.lang.dump(oRecord.getData("id"));
          109             formData.name.value = YAHOO.lang.dump(oRecord.getData("name"));
          110             formData.module.value = YAHOO.lang.dump(oRecord.getData("module"));
          111             formData.active.value = YAHOO.lang.dump(oRecord.getData("active"));
          112             formData.note.value = YAHOO.lang.dump(oRecord.getData("note"));
          113             YAHOO.aostar.container.dlg.show();
          114         }else{
          115             alert("請選中一行進行編輯");
          116         }
          117     }
          118     //刪除方法
          119     var deleteRowData = function(e){
          120         //var oRecord = myDataTable.getRecord(myDataTable.getFirstTrEl());
          121         var oRecord;
          122         var selectRows = myDataTable.getSelectedRows();
          123         if(selectRows.length>0){
          124             var sId="{id:[";
          125             for(var i=0;i<selectRows.length;i++){
          126                 oRecord = myDataTable.getRecordSet().getRecord(selectRows[i]);
          127                 if(i>0){
          128                     sId += ",";
          129                 }
          130                 sId += YAHOO.lang.dump(oRecord.getData("id"));
          131             }
          132             sId += "]}";
          133         }else{
          134             alert("請選中行進行刪除");
          135         }
          136         YAHOO.util.Connect.asyncRequest('GET',"batchDelete.action?batchId="+sId, batchDeleteMethod); 
          137     }
          138     //定義Dialog的一些屬性
          139     YAHOO.aostar.container.dlg = new YAHOO.widget.Dialog("dlg"
          140                             { width : "30em",
          141                               fixedcenter : true,
          142                               visible : false
          143                               constraintoviewport : true,
          144                               modal: true,//hideMask
          145                               buttons : [ { text:"提交", handler:handleSubmit, isDefault:true },
          146                                       { text:"取消", handler:handleCancel } ]
          147                             });
          148 
          149     // 進行數據驗證的方法
          150     YAHOO.aostar.container.dlg.validate = function() {
          151         var data = this.getData();
          152         if (data.name == "" || data.module == "") {
          153             alert("請輸入名字和所屬模塊");
          154             return false;
          155         } else {
          156             return true;
          157         }
          158     };
          159 
          160     // Wire up the success and failure handlers
          161     YAHOO.aostar.container.dlg.callback = { success: handleSuccess,
          162                              failure: handleFailure };
          163     
          164     //裝配Dialog層
          165     YAHOO.aostar.container.dlg.render();
          166 
          167     YAHOO.util.Event.addListener("addtable""click", YAHOO.aostar.container.dlg.show, YAHOO.aostar.container.dlg, true);
          168     YAHOO.util.Event.addListener("edittable""click", editRowData);
          169     YAHOO.util.Event.addListener("deletetable""click", deleteRowData);
          170 }
          171 YAHOO.util.Event.onDOMReady(init);
          172 </script>

          看到這里,似乎這個架構不過平平,類似的東東網上一抓一把。OK,接下來說到重點。
          我們知道,在傳統的架構里,前臺只是管理業務數據的地方。而程序數據和程序結構則在如迷宮一般的后臺里,或者需要到浩如煙海的文檔中搜尋。一批接一批的開發人員前仆后繼,軟件越來越迷宮,文檔越來越蕪雜,維護也越發困難。
          既然hibernate已經把數據表作為對象在后臺進行管理了,為何我們不能開發出一個前臺管理版的hibernate?在前臺可以看到每個表的名字、所屬模塊、作用。點開以后可以看到每個字段的說明及索引等,何等直觀。而且做好這一切后,將數據表直接轉化為Web頁面的工作也會迅速很多,可以通過程序和模板直接進行轉換。這樣,我們把后臺數據表和前臺頁面有機的聯合起來,而且都作為對象進行管理了。對于后來的維護者也大大的便利了。這個想法,我們可以稱之為“數據注冊機制”。
          軟件,是對資源的管理。不管是業務資源還是程序本身的資源,一個架構良好的軟件可以對他們進行清晰和方便的管理。既然我們有了“數據注冊機制”,那么下一步,我們還可以有“類注冊機制”、“包注冊機制”……如果能把軟件本身相應的資源管理起來。那么所謂DDD、安全、SOA等模式,都可以有一個良好的開始和基礎。
          附上YUI+JSON版的前臺架構樣式:
          http://www.aygfsteel.com/Files/shenlei/ssh+yui.rar

          posted on 2008-09-19 22:55 蕭少英 閱讀(3654) 評論(29)  編輯  收藏

          評論

          # re: SSH+YUI+JSON的Web結構 2008-09-19 23:34 shengruan
          不錯,不能下載吧,請發我一份,謝謝
          jprsyf@qq.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2008-09-20 00:07 北北
          不能下載啊 。。
          我也要一份代碼
          yswj81@163.com
            回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-20 09:38 esmiles
          的確代碼不能下載。
          希望看看這個架構。
          tiecheng#gmail.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-20 10:24 chao
          支持!很好,不能下載啊 。。
          我也要一份代碼
          chaowei126@gmail.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2008-09-20 11:00
          你好 我是出版社的編輯,我看到你博客中的內容,感覺寫的非常好,如果想把這些內容和更多的人分享,可以和我聯系,把這些東西寫成書。可以考慮寫一本Java Web開發的書。
          我的郵箱:books_522008@yahoo.com.cn  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-20 16:14 huangzhiwei
          不錯
          很想研究下你的代碼
          請你在閑暇之余把代碼發給我一份
          謝謝
          arezhiwei@gmail.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-20 20:07 lvq810
          想看看架構 希望能給我發一份源碼
          lvq810@163.com
          謝謝了  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-21 00:00 shengruan
          LZ,我沒收到,呵呵
          不厚道啊
          jprsyf@qq.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2008-09-21 09:32 wayne
          樓主能不能也發我一份啊 ,謝謝,junjun231953@163.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-21 10:28 ccbobocat
          不能下載啊,能發一份嗎?
          ccbobocat@gmail.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-22 08:54 Huangyy
          5huangyy@gmail.com 偶也學習一下  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2008-09-22 09:45 zhang
          不能下載啊,能發一份嗎?
          163yongjun@163.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-09-22 09:46 tianming
          我也想要一份代碼,多謝
          pantian9@126.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2008-09-23 12:34 tan
          我也想看看樓主的架構,麻煩樓主給我也發一份,謝謝!
          y3320987@yeah.net  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2008-09-27 13:39 test
          不錯,給一份!
          yapingjob@163.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-10-18 16:11 lsqlister
          我也想要一份代碼,謝謝
          lsqlister@gmail.com   回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-10-23 15:14 yangtao309
          我也想要一份代碼 謝謝
          yangtao309@gmail.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-10-29 15:46 huanghu
          我也想要一份代碼 謝謝
          huang_hu@msn.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2008-12-03 14:53 jonson
          我也想要一份代碼,謝謝
          huhaibo777@sina.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2008-12-12 10:51 tod
          我也想要一份代碼,謝謝

          mstitop@gmail.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2009-03-19 10:38 wei
          我也yao testxiaowei@163.com 謝謝了   回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2009-06-05 09:19 hufei
          麻煩也給我一份,謝謝!!!! hufei_0_528@163.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2009-09-23 01:31 reddemon888
          麻煩博主發我一份,謝謝, reddemon888@163.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構[未登錄] 2009-11-11 20:00 hh
          發給我一份吧
          zhoudawn@163.com
          謝謝。  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2010-06-04 04:45 magicmo
          能給我一份么?  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2010-06-04 04:46 magicmo
          能給我一份么? bluesky.mo@foxmail.com  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2010-07-12 11:26 風也
          能給我發一份,學習一下嗎?26234032@qq.com 謝謝  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2011-08-17 19:30
          您好!請給我發一份。我的郵箱just4java@163.com。謝謝!!!  回復  更多評論
            

          # re: SSH+YUI+JSON的Web結構 2012-03-20 15:52
          您好!請給我發一份。我的郵箱liujunbjh@163.com。謝謝!!!  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 莫力| 得荣县| 霞浦县| 凯里市| 汉沽区| 沙湾县| 建瓯市| 都匀市| 新巴尔虎左旗| 简阳市| 桐乡市| 娄底市| 镇巴县| 贡山| 邢台市| 临安市| 崇礼县| 南汇区| 桦川县| 黔南| 达日县| 凤山县| 姜堰市| 黑山县| 天祝| 吉水县| 德令哈市| 田林县| 乾安县| 阿瓦提县| 连州市| 邢台县| 南宁市| 鄯善县| 阜新市| 新化县| 陇南市| 鄂温| 邹城市| 阜康市| 五台县|