City of Dream

          實(shí)踐出真知

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            2 隨筆 :: 1 文章 :: 35 評論 :: 0 Trackbacks
          后臺采用Struts2+Spring2.5+Hibernate3的經(jīng)典模式。簡約主義,體現(xiàn)在分層簡約(三層:Action、service、dao)、結(jié)構(gòu)節(jié)約(類的解耦:Action一個(gè)類,通過DI調(diào)用Service。Service通過配置注入泛型基類dao的實(shí)例,無需手工書寫dao。添加一個(gè)Model,后臺就OK了)、配置節(jié)約,默認(rèn)的Struts無需進(jìn)行任何配置,因?yàn)槲覀円呀?jīng)采用了通配符的方式:
          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>
          因?yàn)槲覀儾捎昧薐PA,避免手工書寫xml。
          至于前臺,與后臺的聯(lián)系是單純的數(shù)據(jù)交換,JSON格式的數(shù)據(jù)很適合在有限的帶寬里無限奔跑。基于此,數(shù)據(jù)交換格式采用JSON,而前臺UI使用YUI制作。話說YUI還是不錯(cuò)的,文檔一應(yīng)俱全(雖然是英文),效果也很可贊。
          前臺,一個(gè)頁面搞定CURD:
            1 <script type="text/javascript">
            2 YAHOO.namespace("aostar.container");
            3 
            4 var myDataTable,myDataSource;
            5 //啟動時(shí)載入,獲取JSON數(shù)據(jù),初始化列表
            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         //監(jiān)聽row的相關(guān)行為
           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層的各種觸發(fā)動作
           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 = "新增表成功,點(diǎn)擊“確定”刷新頁面"
           63         }else if(m.message=="update"){
           64             response = "更新表成功,點(diǎn)擊“確定”刷新頁面"
           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 = "刪除表成功,點(diǎn)擊“確定”刷新頁面"
           86             }
           87             if (confirm(response)) {
           88                 window.location.reload();
           89                }  
           90         },
           91         failure : function (o) {
           92             if (!YAHOO.util.Connect.isCallInProgress(o)) {
           93                 alert("服務(wù)調(diào)用失敗!");
           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("請選中一行進(jìn)行編輯");
          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("請選中行進(jìn)行刪除");
          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     // 進(jìn)行數(shù)據(jù)驗(yàn)證的方法
          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>

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

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

          評論

          # re: SSH+YUI+JSON的Web結(jié)構(gòu) 2008-09-19 23:34 shengruan
          不錯(cuò),不能下載吧,請發(fā)我一份,謝謝
          jprsyf@qq.com  回復(fù)  更多評論
            

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

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

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

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

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

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

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

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

          # re: SSH+YUI+JSON的Web結(jié)構(gòu) 2008-09-21 10:28 ccbobocat
          不能下載啊,能發(fā)一份嗎?
          ccbobocat@gmail.com  回復(fù)  更多評論
            

          # re: SSH+YUI+JSON的Web結(jié)構(gòu) 2008-09-22 08:54 Huangyy
          5huangyy@gmail.com 偶也學(xué)習(xí)一下  回復(fù)  更多評論
            

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

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

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

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

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

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

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

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

          # re: SSH+YUI+JSON的Web結(jié)構(gòu) 2008-12-12 10:51 tod
          我也想要一份代碼,謝謝

          mstitop@gmail.com  回復(fù)  更多評論
            

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

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

          # re: SSH+YUI+JSON的Web結(jié)構(gòu) 2009-09-23 01:31 reddemon888
          麻煩博主發(fā)我一份,謝謝, reddemon888@163.com  回復(fù)  更多評論
            

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

          # re: SSH+YUI+JSON的Web結(jié)構(gòu) 2010-06-04 04:45 magicmo
          能給我一份么?  回復(fù)  更多評論
            

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

          # re: SSH+YUI+JSON的Web結(jié)構(gòu) 2010-07-12 11:26 風(fēng)也
          能給我發(fā)一份,學(xué)習(xí)一下嗎?26234032@qq.com 謝謝  回復(fù)  更多評論
            

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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 沙坪坝区| 甘洛县| 衢州市| 天水市| 东港市| 常州市| 墨脱县| 福建省| 偃师市| 游戏| 南康市| 名山县| 师宗县| 泊头市| 隆昌县| 玉树县| 延安市| 定西市| 麦盖提县| 绥芬河市| 南郑县| 若尔盖县| 安福县| 东山县| 永清县| 湖南省| 马鞍山市| 云龙县| 金寨县| 堆龙德庆县| 简阳市| 合水县| 敦化市| 左贡县| 扎赉特旗| 九龙县| 达孜县| 永平县| 宕昌县| 咸阳市| 万山特区|