<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Shao Fan

    關于JAVA與軟件工程
    posts - 31, comments - 71, trackbacks - 0, articles - 4
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2007年4月6日

    目前開發(fā)人員對系統(tǒng)開發(fā)的一個共識是使用三層架構,分為表示層,業(yè)務層,和持久層。而這三層之間的依賴關系如何?比較常見的一種看法是

    表示層 --> 業(yè)務層 --> 持久層

    這表明了層與層之間的調(diào)用關系,表示層通過調(diào)用業(yè)務層來完成任務,而業(yè)務層則調(diào)用持久層。從另一個角度來看,一種依賴關系是

    表示層 --> 領域模型(Domain Model) <-- 持久層

    表示層和持久層都應該理解(recognize)領域模型。而領域模型則是業(yè)務層的一部分。業(yè)務層正是系統(tǒng)的價值所在。雖說表示和持久也很重要,在某些系統(tǒng)中可以說是很關鍵,但是它們的最終目的都是為業(yè)務服務,所以業(yè)務層應該是系統(tǒng)的核心

    基于以上的認識,在系統(tǒng)設計的時應首先分析需求得到領域模型,找出系統(tǒng)中的實體、對象(靜態(tài)的一面),并明確大致的業(yè)務流程(動態(tài)的一面)。 而另兩層應盡最大努力為業(yè)務層服務,且盡量減少業(yè)務層受另兩層的限制。


    各層的職責:

    表示層:負責顯示信息,及從系統(tǒng)外部得到輸入。表示層的設計決定系統(tǒng)界面的可用性,及信息輸入和展示的可靠性。表示層只知道如何展示信息,及收集用戶輸入,并不知道該如何對這些輸入進行處理來完成業(yè)務。

    業(yè)務層:完成業(yè)務邏輯。業(yè)務層設計決定客戶價值是否能夠得到實現(xiàn)。這是系統(tǒng)的關鍵。外在的表現(xiàn)是功能性。業(yè)務層設計和實現(xiàn)的失誤表現(xiàn)在用戶端即功能缺失,功能不可靠等。如果需要對業(yè)務層的業(yè)務規(guī)則進行解耦,則可以使用規(guī)則引擎如Drools,把業(yè)務規(guī)則分離出來。但分離后的業(yè)務規(guī)則仍屬于業(yè)務層。業(yè)務層知道如何對用戶輸入進行處理,能夠應用業(yè)務規(guī)則完成用戶所需的業(yè)務,但它不知道數(shù)據(jù)如何讀取和保存。

    持久層:負責用戶信息的持久化。持久層的失誤表現(xiàn)在外即數(shù)據(jù)處理(儲存,展示等)不可靠。持久層完全不知道業(yè)務,只專注于數(shù)據(jù)存儲和讀取。所謂持久化并不一定是指數(shù)據(jù)庫,任何方式的持久化(通過文件,網(wǎng)絡的持久化等)都應由持久層完成。

    各層的設計都會直接影響系統(tǒng)性能。

    三層的體積大小和復雜度在不同的系統(tǒng)中可能會有很大的不同。比如說GOOGLE的搜索引擎,它的界面很簡單,可以想像表示層是比較容易實現(xiàn)的,而它的業(yè)務層,關系到處理關鍵字,分析搜索結果,決定排名等,而持久層則要負責處理超大量的數(shù)據(jù)。業(yè)務層和持久層則相當復雜。而有的系統(tǒng)持久層會很小,比如殺毒軟件,媒體播放軟件等。業(yè)務層小而另兩層大的例子暫時還沒有想到:)


    posted @ 2007-09-08 19:45 shaofan 閱讀(5130) | 評論 (2)編輯 收藏

    help是一個內(nèi)置函數(shù),所謂內(nèi)置函數(shù),就是在Python中被自動加載的函數(shù),任何時候都可以用。參數(shù)分兩種:

    • 如果傳一個字符串做參數(shù)的話,它會自動搜索以這個字符串命名的模塊,方法,等。
    • 如果傳入的是一個對象,就會顯示這個對象的類型的幫助。

    比如輸入help(’print’),它就會尋找以’print’為名的模塊,類,等,找不到就會看到提示信息。而print在python里是一個保留字,和pass,return同等,而非對象,所以help(print)也會出錯((kkkkkkk))。

    舉個例子:

    1 help(’sys’) #會列出sys模塊的幫助
    2 = [1,2,3]
    3 help(a) #會顯示list的幫助
    4 help(a.append) #會顯示list的append方法的幫助

    python安裝自帶的library reference,2.1節(jié)是關于內(nèi)置函數(shù)的。

    Reference Manual的6.6節(jié)可以找到關于print的東東。

    posted @ 2007-06-05 06:28 shaofan 閱讀(2766) | 評論 (0)編輯 收藏

    Struts2默認theme是xhtml,它用表格來對表單中的控件進行排版。它也提供一個客戶端的js驗證功能,但是它的js腳本卻有些問題,在某些情況下,前次驗證的提示信息無法被清除,提示信息會不斷的累積顯示在屏幕上。而按照設計,每次提交表單時應只顯示每次驗證的出錯信息。

    它的客戶端驗證的流程大概是這樣,用戶提交表單時,對各個控件的輸入按預先設置的規(guī)則進行驗證,如果有問題,則清除表單里原有的出錯提示信息,并寫入新的提示。其設計的功能是把出錯信息寫表格里出錯控件的上方,以便用戶看得更加清楚。問題就出在其用來清除原出錯信息的函數(shù),其代碼是這樣的(在struts.jar的template/xhtml目錄下可以找到):

     1 function clearErrorMessages(form) {
     2 
     3     var table = form.childNodes[1];
     4     iftypeof table == "undefined" ) {
     5         table = form.childNodes[0];
     6     }
     7 
     8     // clear out any rows with an "errorFor" attribute
     9     var rows = table.rows;
    10     var rowsToDelete = new Array();
    11     if (rows == null){
    12         return;
    13     }
    14 
    15     for(var i = 0; i < rows.length; i++) {
    16         var r = rows[i];
    17         if (r.getAttribute("errorFor")) {
    18             rowsToDelete.push(r);
    19         }
    20     }
    21 
    22     // now delete the rows
    23     for (var i = 0; i < rowsToDelete.length; i++) {
    24         var r = rowsToDelete[i];
    25         table.deleteRow(r.rowIndex);
    26         //table.removeChild(rowsToDelete[i]);
    27     }
    28 }


    看這個函數(shù)的前三行,它試圖取得form的第1個或第2個子節(jié)點,并把它作為table來處理(看接下來的幾行)。要想清除表格里的錯誤信息,首先要取得表格本身,這沒錯,但是如果第1個或第2個子節(jié)點不是table的話,腳本就會出錯,造成原出錯信息無法清除,這樣每次提交后的提示信息就會累積在屏幕上。

    要解決這個問題有兩個辦法:
    • 寫代碼時要小心,保證form的第1或2個子節(jié)點是table,不要在生成table前加其他代碼。
    • 或,修改xhtml的validation.js,使它總能獲得正確的table元素,重新打包到struts.jar。
    剛看了一下Struts的JIRA,已經(jīng)有人報告了這個問題(id WW-1802),而且這個bug在2.1版本中已經(jīng)解決了。

    posted @ 2007-06-03 17:56 shaofan 閱讀(2537) | 評論 (3)編輯 收藏

    假設:用兩者寫一個最小的WEB程序。
    過程可以參照:
    1.struts的就太多了,隨便哪個都可以
    2.python/django可以看limodou寫的Django step by step

     

    Java/Struts/JSP  Python/Django
    開發(fā)步驟 1.在web.xml里配置struts的servlet
    2.在struts-config.xml里配置URL和action的映射
    3.寫action
    4.寫JSP
    1.在urls.py里配置URL到方法的映射
    2.寫相應的方法
    3.寫HTML模板
    調(diào)用過程 1.根據(jù)web.xml的映射調(diào)用struts的servlet controller
    2.servlet controller根據(jù)struts-config.xml的映射調(diào)用相應的action
    3.action處理請求
    4.JSP渲染顯示
    1.根據(jù)urls.py的映射調(diào)用相應的方法
    2.方法處理請求
    3.HTML渲染顯示


    相比之下前者用了兩層才把一個HTTP請求映射到實際處理的方法:第一次是servlet的映射,第二次是struts action的映射。
    而django則一次就從URL映射到相應的方法了。

    另外一個比較顯著的區(qū)別,也是基于java和python的語言上的區(qū)別吧,java的所有方法必需包含在一個類中,因此action mapping配置時是映射到類,而action在實現(xiàn)類則應實現(xiàn)事先約定的方法(通過繼承或實現(xiàn)接口)。而django則直接得多,可以直接在配置里寫明處理請求的方法名。


    posted @ 2007-04-06 19:11 shaofan 閱讀(4975) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲乱亚洲乱淫久久| 国产亚洲精品激情都市| 一级特黄aa毛片免费观看| 亚洲欧洲中文日韩av乱码| 香蕉国产在线观看免费| 免费a级毛片视频| 羞羞视频免费网站日本| 亚洲精品色婷婷在线影院| 日韩精品免费一线在线观看| 亚洲精品WWW久久久久久| 国产精品免费αv视频| 久久亚洲精品中文字幕三区| 久久免费视频精品| 亚洲第一成年网站大全亚洲| 无码国产精品一区二区免费式影视| 亚洲an日韩专区在线| 最近最新MV在线观看免费高清| 亚洲一本到无码av中文字幕| 日本高清免费中文字幕不卡| 亚洲第一香蕉视频| 成人女人A级毛片免费软件| 亚洲国产精品嫩草影院| 亚洲AV无码乱码精品国产| 免费看无码特级毛片| 在线免费观看亚洲| 成年人网站在线免费观看| 国产精品亚洲综合一区在线观看 | 农村寡妇一级毛片免费看视频| 亚洲av无码乱码在线观看野外| 国产免费人成视频尤勿视频| 亚洲avav天堂av在线不卡| 久久国内免费视频| 免费毛片毛片网址| 亚洲AV日韩精品久久久久 | 日本免费v片一二三区| h片在线播放免费高清| 亚洲酒色1314狠狠做| 免费国产成人高清视频网站| 国产免费拔擦拔擦8X高清在线人 | 亚洲av永久综合在线观看尤物| 国产中文字幕免费|