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

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

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

    每日一得

    不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發(fā)
    最近關心的內容:SSH,seam,flex,敏捷,TDD
    本站的官方站點是:顛覆軟件

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks

    2006年12月1日 #

         摘要: 你每天經常訪問哪些站點?

    你的收藏夾里有多少收藏的站點?  閱讀全文
    posted @ 2008-08-09 14:42 Alex 閱讀(2386) | 評論 (2)編輯 收藏

         摘要: 上次參加open party朋友拿了一本《開源技術選型手冊》,翻了一下,整理成腦圖(圖的效果還是比文字好哦)  閱讀全文
    posted @ 2008-08-06 10:30 Alex 閱讀(2496) | 評論 (5)編輯 收藏

         摘要: 從svn版本上checkout出來的新的版本,dwr部分的xml配置文件是紅色提示錯誤,一開始以為是jsp的普通驗證錯誤,后發(fā)現(xiàn)不是那么回事。  閱讀全文
    posted @ 2008-08-04 15:00 Alex 閱讀(1570) | 評論 (0)編輯 收藏

    1.很多人喜歡用代碼開發(fā)工具的debug功能來跟蹤問題,雖然最終可以解決問題,但是從方向或者思想上不建議這樣做,我依然記得最初我的技術經理對我說過 “代碼不是調出來的”。

    2.不是調出來的那是怎么出來的呢? “寫出來的。” 呵呵,別扭,但是想想看,是否有點道理?

    3.從另一個層面,我們需要加強代碼的規(guī)范的寫法,這就好比設計,先盡量將設計(在敏捷的年代似乎談設計不太入流,那么你可以認為那是一種思考吧)做的到位一點

    4.回到一個大的命題:戰(zhàn)略如果錯誤,執(zhí)行的越快死的越快;同理,思路或者方向如果有問題,做的越帶勁,你越難受。

    5.讓我們朝這個目標挺進:代碼一次編寫就通過! 我見過一些這樣的高人,只要你努力,是可以做到的。

    posted @ 2008-08-03 20:56 Alex 閱讀(2453) | 評論 (23)編輯 收藏

         摘要: 又一陣熱風吹過來了,猶如當初的asp,猶如近段時間的SOA  閱讀全文
    posted @ 2008-08-03 01:02 Alex 閱讀(2009) | 評論 (2)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-07-03 14:13 Alex 閱讀(1604) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-07-03 14:12 Alex 閱讀(2968) | 評論 (1)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-07-03 14:11 Alex 閱讀(3520) | 評論 (5)編輯 收藏

    //本站點內容來自于 顛覆軟件

    1.機器的ip經常改變,到公司一個ip,到客戶那一個ip,到家又是一個ip,不知怎么搞的,今天到家oracle的dbconsole就啟動不了了.

    2.用命令行的方式啟動 emctl.bat start dbconsole,結果還提示ORACLE_SID 還沒有設置,暈,這個怎么沒有了,set 一個吧 set ORACLE_SID=dggmcc (我的數(shù)據(jù)庫實例)

    3.還是有錯,提示找不到192.168.0.52.這個地址,應該是ip和當初裝數(shù)據(jù)庫的時候IP不一樣的緣故,將hosts設置一下 192.168.0.52   IDEA

    4.OK

    posted @ 2008-07-03 14:10 Alex 閱讀(1042) | 評論 (0)編輯 收藏

    1.架構的分類:業(yè)務架構、數(shù)據(jù)庫架構、軟件設計架構,正在流行的所謂soa架構也算吧

    2. 涉及到的主要內容:

    • 需求分析
    • 領域分析
    • UML建模
    • 文檔設計管理
    • 設計模式
    • 基于javaEE5的設計(jsf+EJB3)[個人感覺jboss seam是最好的代表了]

    3.今天一同事說在網(wǎng)上看到統(tǒng)計數(shù)據(jù)說基于soa的架構做的項目比傳統(tǒng)的做法成功率確實高,可能性是存在的,不過也不排除這些統(tǒng)計數(shù)據(jù)是某些大廠贊助的結果 :)

    4.今年打算有機會的話培訓一下軟件設計師的課程,內容摘要如下:(來自國信培訓)

    一、面向對象分析設計與UML

    Ø 面向對象分析與設計OOAD

    Ø UML建模與ICONIX進程

    Ø 領域建模與用例建模

    Ø 需求分析與UseCase

    Ø 健壯性分析

    Ø 時序圖

    Ø 對象圖、狀態(tài)圖、活動圖與協(xié)作圖

    Ø 類圖、包圖與組件圖

    Ø 部署圖

    Ø UMLRUP

    Ø 設計進度和設計粒度的控制

    二、設計模式

    Ø GOF設計模式

    Ø 創(chuàng)建型模式

    Ø 結構型模式

    Ø 行為型模式

    Ø 模式擴展

    Ø 開源項目中的設計模式

    Ø 模式與交流

    三、軟件設計管理

    Ø 軟件設計文檔

    Ø 軟件流程改進策略

    Ø 軟件設計風險管理

    四、相關軟件設計案例集

    posted @ 2008-07-03 14:08 Alex 閱讀(1581) | 評論 (0)編輯 收藏

    //本站點內容來自于www.foxlog.org


    1.中國還沒有真正偉大的軟件公司,就當自己做一下白日夢了

    2.需要一個協(xié)同軟件,比如oracle協(xié)作套件,或者IBM的Lotus,目的,提供郵件、文檔、工作空間、門戶、網(wǎng)絡會議、移動辦公等,讓公司的所有資源在一個統(tǒng)一的平臺上實施;當然,出于成本考慮,我也可以選擇google的企業(yè)套件,最直接的方式了,而且效果不錯,不過沒有網(wǎng)絡會議和門戶功能,可以考慮使用webEx等 (近期,流行的一個觀點是在協(xié)作平臺里引入web2.0的相關技術)

    3.需要一個學習平臺,比如oracle ilearing.用于員工的入職須知,技能培訓,為學習型組織提供一個最有力的幫助,最大的問題可能不是學習平臺本身,而是學習內容的規(guī)劃和設計,必要的時候需要購買 .  學習平臺最終的目的就是一是培訓員工,另一個就是知識共享。現(xiàn)在很多公司有這么一個毛病,公司運營了很多年,但是隨著員工的逐步更換和流失,很多以前精華的東西都不見了,如果主意了知識的共享和積累(通過軟件平臺),這個問題就是另一種情況了.

    4.需要一個 oa平臺,主要基于公司的業(yè)務流程,目前大多數(shù)oa是基于工作流的機制來實現(xiàn)。事實上,oa的發(fā)展歷程已經比較長了,也相對比較成熟,但是究竟能發(fā)揮多大作用或者該如何發(fā)揮最大的作用還依然是一個問題。

    5.建立一個項目管理系統(tǒng)平臺,所有項目都在上面監(jiān)控,它應該是動態(tài)的,可以看到每一天的進度,最好能從上面能對項目的各個組員的工作作出評估,作出即時的溝通和修正。

    6.軟件開發(fā)過程系統(tǒng):包含架構設計管理、開發(fā)動態(tài)控制管理、版本控制、測試管理 .這些內容的主要目的是保證開發(fā)的規(guī)范話、文檔化

    7.會議系統(tǒng)管理. 每個公司都需要開會,但是開會的層次差別太大了,存在的問題主要有:會議目標不明確,會議過程沒有效率,會議結果不明確,會議結束后沒有后期跟蹤管理.關于這方面可以推薦一篇文章 九段秘書

    8.以上好像偏重于技術的層面比較多,實際上一個公司的老總最看重的其實必然是市場,所以一個適合自己公司的ERP或者CRM系統(tǒng)也許是必要的,注意,我這里說的是也許。

    9.最后,所有的軟件僅僅提供了一個平臺,它是“死”的,或者說其本身并不會發(fā)生什么作用,更關鍵的是看不見的“軟件”——企業(yè)文化,一切的效率與創(chuàng)新都來自于公司的文化氛圍,在這個基礎上,軟件才會有推波助瀾的作用。

    posted @ 2008-07-03 14:07 Alex 閱讀(1079) | 評論 (3)編輯 收藏

         摘要: 很多東西是拿來被利用的,被 Fuck的,不是讓你消磨時間的.  閱讀全文
    posted @ 2007-09-01 12:42 Alex 閱讀(2562) | 評論 (5)編輯 收藏

         摘要: 項目,是一個范圍很廣的概念,三峽大壩是一個項目,IT企業(yè)的一次開發(fā)任務也是一個項目,個人某個時間段的活動安排仍然可以看作是一個項目.

      閱讀全文
    posted @ 2007-08-19 13:15 Alex 閱讀(1824) | 評論 (7)編輯 收藏

         摘要: 經常用到update語句,不過很少用到其他表的數(shù)據(jù)來更新當前表,這次用到了,總結一下

      閱讀全文
    posted @ 2007-08-19 12:49 Alex 閱讀(2273) | 評論 (1)編輯 收藏

    key words: plsql,導出數(shù)據(jù),大數(shù)據(jù)量

    最近的賬務的項目中需要導出Excel報表,數(shù)據(jù)量比較大,解決方案如下 :

    1.通過plsql在服務器端查詢出符合要求的紀錄,然后直接寫到文本文件中

    2.在web端通過流的方式讀文本文件,通過POI寫到Excel,將生成的Excel流寫到respoonse實現(xiàn)下載

    這樣做的好處是不必一次性將滿足條件的紀錄全部取出來,而是通過流的方式.

    這個方式原來在處理Blob類型的字段時有直接的getStream來支持的,這次普通的數(shù)據(jù)只好通過文件的方式來實現(xiàn).

    貼一段sample的代碼


    sql 代碼
     
    1. create or replace procedure alex_table_to_txt(filepath varchar2,filename varchar2) is  
    2. --var  
    3. v1 alex2.name%type;  
    4. v2 alex2.address%type;  
    5. v3 alex2.groupname%type;  
    6.   
    7. output varchar2(200);  
    8.   
    9. --file var  
    10. file_handle UTL_FILE.FILE_TYPE;  
    11.   
    12. cursor readtable is select t.name,t.address,t.groupname from alex2 t;  
    13. begin  
    14. file_handle:=utl_file.fopen(filepath,filename,'w',6000);  
    15. open readtable;  
    16.   
    17. loop  
    18. fetch readtable into v1,v2,v3;  
    19. exit when readtable%notfound;  
    20. output:=v1 || ',' || v2 || ',' || v3 ;  
    21. utl_file.put_line(file_handle,output);  
    22.   
    23. end loop;  
    24.   
    25. close readtable;  
    26. utl_file.fclose(file_handle);  
    27. end alex_table_to_txt;  
    28. /  

     

    歡迎討論你的方案

    posted @ 2007-08-18 12:46 Alex 閱讀(4271) | 評論 (1)編輯 收藏

         摘要: 一般來說,我們碰到問題都是無非google,看相關文檔,請教專家,問圈子里的朋友,等等。我這里說的主要是個人自己的解決思路。

      閱讀全文
    posted @ 2007-08-18 12:17 Alex 閱讀(1368) | 評論 (2)編輯 收藏

    好久沒有來這里了,blogjava的朋友們你們還好嗎。

    我的 blog搬家了,以后將主要在這里維護: www.foxlog.org 

    需要和我交換連接的朋友請聯(lián)系我 mail to me :  idea.wang@gmail.com,或者在我 blog留言
    http://www.foxlog.org/%E7%BB%99%E6%88%91%E7%95%99%E8%A8%80
    posted @ 2007-07-27 15:21 Alex 閱讀(661) | 評論 (0)編輯 收藏

    1.查看系統(tǒng)Swap空間使用

    [root@jumper usr]# free
                 total       used       free     shared    buffers     cached
    Mem:        513980     493640      20340          0     143808     271780
    -/+ buffers/cache:      78052     435928
    Swap:      1052248      21256    1030992

    2.在空間合適處創(chuàng)建swap文件

    [root@jumper usr]# mkdir swap
    [root@jumper usr]# cd swap
    [root@jumper swap]# dd if=/dev/zero of=swapfile bs=1024 count=10000
    10000+0 records in
    10000+0 records out
    [root@jumper swap]# ls -al
    total 10024
    drwxr-xr-x    2 root     root         4096  7月 28 14:58 .
    drwxr-xr-x   19 root     root         4096  7月 28 14:57 ..
    -rw-r--r--    1 root     root     10240000  7月 28 14:58 swapfile


    [root@jumper swap]# mkswap swapfile
    Setting up swapspace version 1, size = 9996 KiB


    3.激活swap文件
    [root@jumper swap]# swapon swapfile
    [root@jumper swap]# ls -l
    total 10016
    -rw-r--r--    1 root     root     10240000  7月 28 14:58 swapfile
    [root@jumper swap]# free
                 total       used       free     shared    buffers     cached
    Mem:        513980     505052       8928          0     143900     282288
    -/+ buffers/cache:      78864     435116
    Swap:      1062240      21256    1040984
    [root@jumper swap]#  

     

     

    Swap,即交換區(qū),除了安裝Linux的時候,有多少人關心過它呢?其實,Swap的調整對Linux服務器,特別是Web服務器的性能至關重要。通過調整Swap,有時可以越過系統(tǒng)性能瓶頸,節(jié)省系統(tǒng)升級費用。 

    本文內容包括: 


    Swap基本原理 

    突破128M Swap限制 

    Swap配置對性能的影響 

    Swap性能監(jiān)視 

    有關Swap操作的系統(tǒng)命令 
    Swap基本原理 

    Swap的原理是一個較復雜的問題,需要大量的篇幅來說明。在這里只作簡單的介紹,在以后的文章中將和大家詳細討論Swap實現(xiàn)的細節(jié)。 

    眾所周知,現(xiàn)代操作系統(tǒng)都實現(xiàn)了"虛擬內存"這一技術,不但在功能上突破了物理內存的限制,使程序可以操縱大于實際物理內存的空間,更重要的是,"虛擬內存"是隔離每個進程的安全保護網(wǎng),使每個進程都不受其它程序的干擾。 

    Swap 空間的作用可簡單描述為:當系統(tǒng)的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什么操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap中恢復保存的數(shù)據(jù)到內存中。這樣,系統(tǒng)總是在物理內存不夠時,才進行Swap交換。 

    計算機用戶會經常遇這種現(xiàn)象。例如,在使用Windows系統(tǒng)時,可以同時運行多個程序,當你切換到一個很長時間沒有理會的程序時,會聽到硬盤"嘩嘩"直響。這是因為這個程序的內存被那些頻繁運行的程序給"偷走"了,放到了Swap區(qū)中。因此,一旦此程序被放置到前端,它就會從Swap區(qū)取回自己的數(shù)據(jù),將其放進內存,然后接著運行。 

    需要說明一點,并不是所有從物理內存中交換出來的數(shù)據(jù)都會被放到Swap中(如果這樣的話,Swap就會不堪重負),有相當一部分數(shù)據(jù)被直接交換到文件系統(tǒng)。例如,有的程序會打開一些文件,對文件進行讀寫(其實每個程序都至少要打開一個文件,那就是運行程序本身),當需要將這些程序的內存空間交換出去時,就沒有必要將文件部分的數(shù)據(jù)放到 Swap空間中了,而可以直接將其放到文件里去。如果是讀文件操作,那么內存數(shù)據(jù)被直接釋放,不需要交換出來,因為下次需要時,可直接從文件系統(tǒng)恢復;如果是寫文件,只需要將變化的數(shù)據(jù)保存到文件中,以便恢復。但是那些用malloc和new函數(shù)生成的對象的數(shù)據(jù)則不同,它們需要Swap空間,因為它們在文件系統(tǒng)中沒有相應的"儲備"文件,因此被稱作"匿名"(Anonymous)內存數(shù)據(jù)。這類數(shù)據(jù)還包括堆棧中的一些狀態(tài)和變量數(shù)據(jù)等。所以說,Swap 空間是"匿名"數(shù)據(jù)的交換空間。 

    突破128M Swap限制 

    經常看到有些Linux(國內漢化版)安裝手冊上有這樣的說明:Swap空間不能超過128M。為什么會有這種說法?在說明"128M"這個數(shù)字的來歷之前,先給問題一個回答:現(xiàn)在根本不存在128M的限制!現(xiàn)在的限制是2G! 

    Swap 空間是分頁的,每一頁的大小和內存頁的大小一樣,方便Swap空間和內存之間的數(shù)據(jù)交換。舊版本的Linux實現(xiàn)Swap空間時,用Swap空間的第一頁作為所有Swap空間頁的一個"位映射"(Bit map)。這就是說第一頁的每一位,都對應著一頁Swap空間。如果這一位是1,表示此頁Swap可用;如果是0,表示此頁是壞塊,不能使用。這么說來,第一個Swap映射位應該是0,因為,第一頁Swap是映射頁。另外,最后10個映射位也被占用,用來表示Swap的版本(原來的版本是Swap_space ,現(xiàn)在的版本是swapspace2)。那么,如果說一頁的大小為s,這種Swap的實現(xiàn)方法共能管理"8 * ( s - 10 ) - 1"個Swap頁。對于i386系統(tǒng)來說s=4096,則空間大小共為133890048,如果認為 1 MB=2^20 Byte的話,大小正好為128M。 

    之所以這樣來實現(xiàn)Swap空間的管理,是要防止Swap空間中有壞塊。如果系統(tǒng)檢查到Swap中有壞塊,則在相應的位映射上標記上0,表示此頁不可用。這樣在使用Swap時,不至于用到壞塊,而使系統(tǒng)產生錯誤。 

    現(xiàn)在的系統(tǒng)設計者認為: 

    1.現(xiàn)在硬盤質量很好,壞塊很少。 

    2.就算有,也不多,只需要將壞塊羅列出來,而不需要為每一頁建立映射。 

    3.如果有很多壞塊,就不應該將此硬盤作為Swap空間使用。 

    于是,現(xiàn)在的Linux取消了位映射的方法,也就取消了128M的限制。直接用地址訪問,限制為2G。 

    Swap配置對性能的影響 

    分配太多的Swap空間會浪費磁盤空間,而Swap空間太少,則系統(tǒng)會發(fā)生錯誤。 

    如果系統(tǒng)的物理內存用光了,系統(tǒng)就會跑得很慢,但仍能運行;如果Swap空間用光了,那么系統(tǒng)就會發(fā)生錯誤。例如,Web服務器能根據(jù)不同的請求數(shù)量衍生出多個服務進程(或線程),如果Swap空間用完,則服務進程無法啟動,通常會出現(xiàn)"application is out of memory"的錯誤,嚴重時會造成服務進程的死鎖。因此Swap空間的分配是很重要的。 

    通常情況下,Swap空間應大于或等于物理內存的大小,最小不應小于64M,通常Swap空間的大小應是物理內存的2-2.5倍。但根據(jù)不同的應用,應有不同的配置:如果是小的桌面系統(tǒng),則只需要較小的Swap空間,而大的服務器系統(tǒng)則視情況不同需要不同大小的Swap空間。特別是數(shù)據(jù)庫服務器和Web服務器,隨著訪問量的增加,對Swap空間的要求也會增加,具體配置參見各服務器產品的說明。 

    另外,Swap分區(qū)的數(shù)量對性能也有很大的影響。因為Swap交換的操作是磁盤IO的操作,如果有多個 Swap交換區(qū),Swap空間的分配會以輪流的方式操作于所有的Swap,這樣會大大均衡IO的負載,加快Swap交換的速度。如果只有一個交換區(qū),所有的交換操作會使交換區(qū)變得很忙,使系統(tǒng)大多數(shù)時間處于等待狀態(tài),效率很低。用性能監(jiān)視工具就會發(fā)現(xiàn),此時的CPU并不很忙,而系統(tǒng)卻慢。這說明,瓶頸在 IO上,依靠提高CPU的速度是解決不了問題的。 
    系統(tǒng)性能監(jiān)視 

    Swap空間的分配固然很重要,而系統(tǒng)運行時的性能監(jiān)控卻更加有價值。通過性能監(jiān)視工具,可以檢查系統(tǒng)的各項性能指標,找到系統(tǒng)性能的瓶頸。本文只介紹一下在Solaris下和Swap相關的一些命令和用途。 

    最常用的是Vmstat命令(在大多數(shù)Unix平臺下都有這樣一些命令),此命令可以查看大多數(shù)性能指標。 

    例如: 
    # vmstat 3 
    procs memory swap io system cpu 
    r b w swpd free buff cache si so bi bo in cs us sy id 
    0 0 0 0 93880 3304 19372 0 0 10 2 131 10 0 0 99 
    0 0 0 0 93880 3304 19372 0 0 0 0 109 8 0 0 100 
    0 0 0 0 93880 3304 19372 0 0 0 0 112 6 0 0 100 
    ............ 

    命令說明: 
    vmstat 后面的參數(shù)指定了性能指標捕獲的時間間隔。3表示每三秒鐘捕獲一次。第一行數(shù)據(jù)不用看,沒有價值,它僅反映開機以來的平均性能。從第二行開始,反映每三秒鐘之內的系統(tǒng)性能指標。這些性能指標中和Swap有關的包括以下幾項: 


    procs下的w 
    它表示當前(三秒鐘之內)需要釋放內存、交換出去的進程數(shù)量。 

    memory下的swpd 
    它表示使用的Swap空間的大小。 

    Swap下的si,so 
    si表示當前(三秒鐘之內)每秒交換回內存(Swap in)的總量,單位為kbytes;so表示當前(三秒鐘之內)每秒交換出內存(Swap out)的總量,單位為kbytes。 
    以上的指標數(shù)量越大,表示系統(tǒng)越忙。這些指標所表現(xiàn)的系統(tǒng)繁忙程度,與系統(tǒng)具體的配置有關。系統(tǒng)管理員應該在平時系統(tǒng)正常運行時,記下這些指標的數(shù)值,在系統(tǒng)發(fā)生問題的時候,再進行比較,就會很快發(fā)現(xiàn)問題,并制定本系統(tǒng)正常運行的標準指標值,以供性能監(jiān)控使用。 

    另外,使用Swapon-s也能簡單地查看當前Swap資源的使用情況。例如: 
    # swapon -s 
    Filename Type Size Used Priority 
    /dev/hda9 partition 361420 0 3 

    能夠方便地看出Swap空間的已用和未用資源的大小。 

    應該使Swap負載保持在30%以下,這樣才能保證系統(tǒng)的良好性能。 

    有關Swap操作的系統(tǒng)命令 


    增加Swap空間,分以下幾步: 
    1)成為超級用戶 
    $su - root 

    2)創(chuàng)建Swap文件 
    # dd if=/dev/zero of=swapfile bs=1024 count=65536 

    創(chuàng)建一個有連續(xù)空間的交換文件。 

    3)激活Swap文件 
    #/usr/sbin/swapon swapfile 

    swapfile指的是上一步創(chuàng)建的交換文件。 4)現(xiàn)在新加的Swap文件已經起作用了,但系統(tǒng)重新啟動以后,并不會記住前幾步的操作。因此要在/etc/fstab文件中記錄文件的名字,和Swap類型,如: 
    /path/swapfile none Swap sw,pri=3 0 0 

    5)檢驗Swap文件是否加上 
    /usr/sbin/swapon -s 


    刪除多余的Swap空間。 
    1)成為超級用戶 

    2)使用Swapoff命令收回Swap空間。 
    #/usr/sbin/swapoff swapfile 

    3)編輯/etc/fstab文件,去掉此Swap文件的實體。 

    4)從文件系統(tǒng)中回收此文件。 
    #rm swapfile 

    5)當然,如果此Swap空間不是一個文件,而是一個分區(qū),則需創(chuàng)建一個新的文件系統(tǒng),再掛接到原來的文件系統(tǒng)上。

    posted @ 2007-06-18 14:27 Alex 閱讀(1020) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-06-13 16:43 Alex 閱讀(3759) | 評論 (4)編輯 收藏


    come from here

    如果將需求分析階段的工作歸結為編寫需求規(guī)格說明書,這種簡化的做法往往是導致項目后期層出不窮問題的罪魁禍首。建議采用以下步驟形成軟件需求:獲取用戶需求→分析用戶需求→編寫需求文檔→評審需求文檔→管理需求。下面我們先來討論前兩個步驟(獲取用戶需求、分析用戶需求)的做法。

    獲取用戶需求

      這是該階段的一個最重要的任務。以下為獲取用戶需求需要執(zhí)行的活動(如圖1所示)。

      ● 了解客戶方的所有用戶類型以及潛在的類型。然后,根據(jù)他們的要求來確定系統(tǒng)的整體目標和系統(tǒng)的工作范圍。

      ● 對用戶進行訪談和調研。交流的方式可以是會議、電話、電子郵件、小組討論、模擬演示等不同形式。需要注意的是,每一次交流一定要有記錄,對于交流的結果還可以進行分類,便于后續(xù)的分析活動。例如,可以將需求細分為功能需求、非功能需求(如響應時間、平均無故障工作時間、自動恢復時間等)、環(huán)境限制、設計約束等類型。

      ● 需求分析人員對收集到的用戶需求做進一步的分析和整理。下面是幾條常見的準則:

      ⑴對于用戶提出的每個需求都要知道“為什么”,并判斷用戶提出的需求是否有充足的理由;

      

      圖1 獲取用戶需求的活動

      ⑵將那種以“如何實現(xiàn)”的表述方式轉換為“實現(xiàn)什么”的方式,因為需求分析階段關注的目標是“做什么”,而不是“怎么做”;

      ⑶分析由用戶需求衍生出的隱含需求,并識別用戶沒有明確提出來的隱含需求(有可能是實現(xiàn)用戶需求的前提條件),這一點往往容易忽略掉,經常因為對隱含需求考慮得不夠充分而引起需求變更。

      ● 需求分析人員將調研的用戶需求以適當?shù)姆绞匠式唤o用戶方和開發(fā)方的相關人員。大家共同確認需求分析人員所提交的結果是否真實地反映了用戶的意圖。需求分析人員在這個任務中需要執(zhí)行下述活動:

      ⑴明確標識出那些未確定的需求項(在需求分析初期往往有很多這樣的待定項);

      ⑵使需求符合系統(tǒng)的整體目標;

      ⑶保證需求項之間的一致性,解決需求項之間可能存在的沖突。

    分析用戶需求

      在很多情形下,分析用戶需求是與獲取用戶需求并行的,主要通過建立模型的方式來描述用戶的需求,為客戶、用戶、開發(fā)方等不同參與方提供一個交流的渠道。這些模型是對需求的抽象,以可視化的方式提供一個易于溝通的橋梁。用戶需求的分析與獲取用戶需求有著相似的步驟,區(qū)別在于分析用戶需求時使用模型來描述,以獲取用戶更明確的需求。分析用戶需求需要執(zhí)行下列活動:

      ● 以圖形表示的方式描述系統(tǒng)的整體結構,包括系統(tǒng)的邊界與接口;

      ● 通過原型、頁面流或其它方式向用戶提供可視化的界面,用戶可以對需求做出自己的評價;

      ● 系統(tǒng)可行性分析,需求實現(xiàn)的技術可行性、環(huán)境分析、費用分析、時間分析等;

      ● 以模型描述系統(tǒng)的功能項、數(shù)據(jù)實體、外部實體、實體之間的關系、實體之間的狀態(tài)轉換等方面的內容。

      

      圖2 DFD示意圖

      用于需求建模的方法有很多種,最常用的包括數(shù)據(jù)流圖(DFD)、實體關系圖(ERD)和用例圖(Use Case)三種方式。DFD作為結構化系統(tǒng)分析與設計的主要方法,已經得到了廣泛的應用,DFD尤其適用于MIS系統(tǒng)的表述。DFD使用四種基本元素來描述系統(tǒng)的行為,過程、實體、數(shù)據(jù)流和數(shù)據(jù)存儲。DFD方法直觀易懂,使用者可以方便地得到系統(tǒng)的邏輯模型和物理模型,但是從DFD圖中無法判斷活動的時序關系。圖2描述的是某個項目的DFD示意圖。

      ERD方法用于描述系統(tǒng)實體間的對應關系,需求分析階段使用ERD描述系統(tǒng)中實體的邏輯關系,在設計階段則使用ERD描述物理表之間的關系。需求分析階段使用ERD來描述現(xiàn)實世界中的對象。ERD只關注系統(tǒng)中數(shù)據(jù)間的關系,而缺乏對系統(tǒng)功能的描述。如果將ERD與DFD兩種方法相結合,則可以更準確地描述系統(tǒng)的需求。

      在面向對象分析的方法中通常使用Use Case來獲取軟件的需求。Use Case通過描述“系統(tǒng)”和“活動者”之間的交互來描述系統(tǒng)的行為。通過分解系統(tǒng)目標,Use Case描述活動者為了實現(xiàn)這些目標而執(zhí)行的所有步驟。Use Case方法最主要的優(yōu)點,在于它是用戶導向的,用戶可以根據(jù)自己所對應的Use Case來不斷細化自己的需求。此外,使用Use Case還可以方便地得到系統(tǒng)功能的測試用例。

    編寫需求文檔

      需求文檔可以使用自然語言或形式化語言來描述,還可以添加圖形的表述方式和模型表征的方式。需求文檔應該包括用戶的所有需求(功能性需求和非功能性需求)。

    評審需求文檔

      需求文檔完成后,需要經過正式評審,以便作為下一階段工作的基礎。一般的評審分為用戶評審和同行評審兩類。用戶和開發(fā)方對于軟件項目內容的描述,是以需求規(guī)格說明書作為基礎的;用戶驗收的標準則是依據(jù)需求規(guī)格說明書中的內容來制訂,所以評審需求文檔時用戶的意見是第一位的。而同行評審的目的,是在軟件項目初期發(fā)現(xiàn)那些潛在的缺陷或錯誤,避免這些錯誤和缺陷遺漏到項目的后續(xù)階段。

    管理需求

      

      圖1 需求變更流程

      需求的變更是不可避免的,如何以可控的方式管理軟件的需求,對于項目的順利進行有著重要的意義。如果匆匆忙忙地完成用戶調研與分析,則往往意味著不穩(wěn)定的需求。所以需求管理要保證需求分析各個活動都得到了充分的執(zhí)行。對于需求變更的管理,則主要使用需求變更流程和需求跟蹤矩陣的管理方式。需求變更流程和需求跟蹤矩陣分別如圖1和圖2所示。

      

      圖2 需求跟蹤矩陣

      常見問題及建議

      Q、客戶與最終用戶的區(qū)別是什么?

      A、可以借助圖3來說明它們之間的區(qū)別。

      

      圖3 需求獲取渠道示意圖

      軟件需求來自系統(tǒng)工程與客戶兩個方面,其中客戶是主要的需求提供者(系統(tǒng)工程需求也來自于客戶)。客戶需要搜集其最終用戶的需求并考慮自身的需求,然后再提供給開發(fā)方。假如客戶并未去認真搜集最終用戶的需求,開發(fā)方便需要做到這一點,因為系統(tǒng)最終要滿足最終用戶的需求。

      Q、如何進行用戶訪談?

      A、首先,一定要事先確定訪談的目的和提綱。其次,因為用戶往往并不知道應該提供哪些方面的需求,所以需要開發(fā)人員引導。

      Q、用戶訪談內容是什么?

      A、首先,請用戶描述他們如何完成自己當前的工作,并與用戶一起抽象出一個工作流程或工作模型。然后,在得到用戶的認可后,向用戶解釋自己是怎樣來實現(xiàn)這些功能的,并說明哪些環(huán)節(jié)可以用自動化方式實現(xiàn)等。

      Q、采用哪一種方式做需求分析最好?

      A、不同的需求分析有不同的特點。還沒有哪一種方法可以完全替代別的方法,否則,現(xiàn)在就不會存在不同的需求建模方式了。一般來說,可以使用DFD+ERD來描述那些功能層次比較清晰的需求;而USE CASE則適于描述功能結構復雜的需求。做需求分析的目的是為了建立需求的模型,不同的子系統(tǒng)有可能使用不同的建模方法。

      Q、怎樣做原型,原型的目的是什么?

      A、通常使用原型分析方法來幫助開發(fā)方進一步獲取用戶需求或讓用戶確認需求。開發(fā)方往往先向用戶提供一個可視界面作為原型,并在界面上布置必要的元素以演示用戶所需要的功能。可以使用第四代語言(例如Visual Basic、Delphi等)來快速生成用戶界面,也可以使用FrontPage等網(wǎng)頁制作工具來生成用戶可視的頁面流。

      原型的目的往往是獲取需求。但有時也使用原型的方式來驗證關鍵技術或技術難點。對于技術原型,界面則往往被忽略掉。

    posted @ 2007-06-12 17:47 Alex 閱讀(993) | 評論 (0)編輯 收藏

    echo "begin to start oracle"
    lsnrctl start
    sqlplus /nolog 
    <<EOF
    connect /as sysdba
    startup
    exit
    exit
    echo "oracle have started"
    posted @ 2007-06-12 09:13 Alex 閱讀(1162) | 評論 (0)編輯 收藏

    已經打印了,晚上看一下,感覺不錯。

    download

    posted @ 2007-06-11 18:24 Alex 閱讀(670) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-06-04 00:18 Alex 閱讀(2074) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-06-02 11:50 Alex 閱讀(972) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-05-29 11:32 Alex 閱讀(1491) | 評論 (5)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-05-24 09:52 Alex 閱讀(1215) | 評論 (2)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-05-14 09:05 Alex 閱讀(13383) | 評論 (8)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-05-13 17:15 Alex 閱讀(1928) | 評論 (3)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-05-13 16:41 Alex 閱讀(5678) | 評論 (13)編輯 收藏

    key words: jstl,struts,log4j

    1.jstl
    jstl的配置參考這篇文章:
    http://foolmouse.cnblogs.com/archive/2006/04/20/380695.html

    在iAS904服務器上的jstl的版本只能用1.0 的
    "standard.jar和jstl.jar文件拷貝到\WEB-INF\lib\
    "

    2.struts
    struts的配置主要是把 相關jar文件(struts.jar,struts-legacy.jar)拷貝到\WEB-INF\lib
    ,另外,struts需要用到一些apache的commons的包(commons-beanutils.jar,commons-collections-2.1.1.jar,commons-digester.jar)

    3.log4j
    log4j經常有莫名其妙的問題,有時候能出來log有時候又不能出來log,最后把log4j.xml統(tǒng)一改為log4j.properties,暫時看好像有效果。

    4。web.xml配置

    <taglib>
            
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
            
    <taglib-location>/WEB-INF/c-1_0.tld</taglib-location>
        
    </taglib>
        
    <taglib>
            
    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
        
    </taglib>
        
    <taglib>
            
    <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
        
    </taglib>
        
    <taglib>
            
    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
        
    </taglib>


    今天終于先在iAS里部署完了struts,下一步把hibernate放進去,上次部署過一次,沒有成功,據(jù)說是和toplink有點沖突。 知道的兄弟分享下oc4j中部署hibernate
    posted @ 2007-05-08 19:11 Alex 閱讀(1344) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-04-11 16:09 Alex 閱讀(7796) | 評論 (8)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-03-30 08:34 Alex 閱讀(811) | 評論 (0)編輯 收藏

    key words: contentType,meta

    come from here


    ?

    在經典同時看到兩個關于ContentType的問題

    http://bbs.blueidea.com/thread-2729935-1-1.html

    http://bbs.blueidea.com/thread-2729945-1-1.html

    所以查了下資料,copy了一份詳細的ContentType的列表

    ?

    不同的ContentType 會影響客戶端所看到的效果.

    默認的ContentType為 text/html? 也就是網(wǎng)頁格式.

    代碼如:

    <% response.ContentType ="text/html" %>?
    <!--#i nclude virtual="/ContentType.html" -->

    顯示的為網(wǎng)頁,而

    <% response.ContentType ="text/plain" %>?
    <!--#i nclude virtual="/sscript/

    則會顯示html原代碼.

    以下為一些常用的 ContentType

    GIF images
    <% response.ContentType ="image/gif" %>?
    <!--#i nclude virtual="/myimage.gif" -->
    JPEG images
    <% response.ContentType ="image/jpeg" %>?
    <!--#i nclude virtual="/myimage.jpeg" -->
    TIFF images
    <% response.ContentType ="image/tiff" %>?
    <!--#i nclude virtual="/myimage.tiff" -->
    MICROSOFT WORD document
    <% response.ContentType ="application/msword" %>?
    <!--#i nclude virtual="/myfile.doc" -->
    RTF document
    <% response.ContentType ="application/rtf" %>?
    <!--#i nclude virtual="/myfile.rtf" -->
    MICROSOFT EXCEL document
    <% response.ContentType ="application/x-excel" %>?
    <!--#i nclude virtual="/myfile.xls" -->
    MICROSOFT POWERPOINT document
    <% response.ContentType ="application/ms-powerpoint" %>?
    <!--#i nclude virtual="/myfile.pff" -->
    PDF document
    <% response.ContentType ="application/pdf" %>?
    <!--#i nclude virtual="/myfile.pdf" -->
    ZIP document
    <% response.ContentType ="application/zip" %>?
    <!--#i nclude virtual="/myfile.zip" -->

    ?

    下面是更詳細的ContentType

    application/andrew-insetez
    application/mac-binhex40hqx
    application/mac-compactprocpt
    application/mathml+xmlmathml
    application/msworddoc
    application/octet-streambin dms lha lzh exe class so dll
    application/odaoda
    application/oggogg
    application/pdfpdf
    application/postscriptai eps ps
    application/rdf+xmlrdf
    application/smilsmi smil
    application/srgsgram
    application/srgs+xmlgrxml
    application/vnd.mifmif
    application/vnd.mozilla.xul+xmlxul
    application/vnd.ms-excelxls
    application/vnd.ms-powerpointppt
    application/vnd.wap.wbxmlwbxml
    application/vnd.wap.wmlc.wmlc wmlc
    application/vnd.wap.wmlscriptc.wmlsc wmlsc
    application/voicexml+xmlvxml
    application/x-bcpiobcpio
    application/x-cdlinkvcd
    application/x-chess-pgnpgn
    application/x-cpiocpio
    application/x-cshcsh
    application/x-directordcr dir dxr
    application/x-dvidvi
    application/x-futuresplashspl
    application/x-gtargtar
    application/x-hdfhdf
    application/x-httpd-php.php .php4 .php3 .phtml
    application/x-httpd-php-source.phps
    application/x-javascriptjs
    application/x-koanskp skd skt skm
    application/x-latexlatex
    application/x-netcdfnc cdf
    application/x-pkcs7-crl.crl
    application/x-shsh
    application/x-sharshar
    application/x-shockwave-flashswf
    application/x-stuffitsit
    application/x-sv4cpiosv4cpio
    application/x-sv4crcsv4crc
    application/x-tar.tgz tar
    application/x-tcltcl
    application/x-textex
    application/x-texinfotexinfo texi
    application/x-trofft tr roff
    application/x-troff-manman
    application/x-troff-meme
    application/x-troff-msms
    application/x-ustarustar
    application/x-wais-sourcesrc
    application/x-x509-ca-cert.crt
    application/xhtml+xmlxhtml xht
    application/xmlxml xsl
    application/xml-dtddtd
    application/xslt+xmlxslt
    application/zipzip
    audio/basicau snd
    audio/midimid midi kar
    audio/mpegmpga mp2 mp3
    audio/x-aiffaif aiff aifc
    audio/x-mpegurlm3u
    audio/x-pn-realaudioram rm
    audio/x-pn-realaudio-pluginrpm
    audio/x-realaudiora
    audio/x-wavwav
    chemical/x-pdbpdb
    chemical/x-xyzxyz
    image/bmpbmp
    image/cgmcgm
    image/gifgif
    image/iefief
    image/jpegjpeg jpg jpe
    image/pngpng
    image/svg+xmlsvg
    image/tifftiff tif
    image/vnd.djvudjvu djv
    image/vnd.wap.wbmp.wbmp wbmp
    image/x-cmu-rasterras
    image/x-iconico
    image/x-portable-anymappnm
    image/x-portable-bitmappbm
    image/x-portable-graymappgm
    image/x-portable-pixmapppm
    image/x-rgbrgb
    image/x-xbitmapxbm
    image/x-xpixmapxpm
    image/x-xwindowdumpxwd
    model/igesigs iges
    model/meshmsh mesh silo
    model/vrmlwrl vrml
    text/calendarics ifb
    text/csscss
    text/html.shtml html htm
    text/plainasc txt
    text/richtextrtx
    text/rtfrtf
    text/sgmlsgml sgm
    text/tab-separated-valuestsv
    text/vnd.wap.wml.wml wml
    text/vnd.wap.wmlscript.wmls wmls
    text/x-setextetx
    video/mpegmpeg mpg mpe
    video/quicktimeqt mov
    video/vnd.mpegurlmxu
    video/x-msvideoavi
    video/x-sgi-moviemovie
    x-conference/x-cooltalkice

         摘要:   閱讀全文
    posted @ 2007-03-28 16:55 Alex 閱讀(4578) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-03-26 22:18 Alex 閱讀(36116) | 評論 (7)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-03-20 16:23 Alex 閱讀(3380) | 評論 (1)編輯 收藏

    key words : jsp防盜鏈 header

    最近碰到盜鏈的問題,即復制一個url地址,在另一個地方也能訪問。

    index.jsp頁面
    <html>
    ??
    <head><title>Simple?jsp?page</title></head>
    ??
    <body>Place?your?content?here

    ??here?is?index?jsp
    ????get?header?info
    ??
    <a?href="a.jsp">a.jsp</a>
    ??
    </body>
    </html>

    a.jsp頁面
    <html>
    ??
    <head><title>Simple?jsp?page</title></head>
    ??
    <body>Place?your?content?here

    ??here?is?a.?jsp
    ????get?header?info
    ??
    <%=request.getHeader("Referer")%>
    ??
    <%if(null?==?request.getHeader("Referer")?||?request.getHeader("Referer").indexOf("yourdomain.com")?<?0){%>
    ?????做人要厚道
    ??
    <%}else{%>
    ??合法訪問
    ??
    <%}%>
    ??
    </body>
    </html>


    即從內部訪問可以,直接粘貼地址在另一個瀏覽器里訪問禁止
    posted @ 2007-03-13 10:01 Alex 閱讀(5949) | 評論 (8)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-03-12 00:40 Alex 閱讀(12398) | 評論 (18)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-02-25 00:20 Alex 閱讀(412) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-02-24 23:37 Alex 閱讀(1899) | 評論 (2)編輯 收藏

    key words: pd, powerdesigner,外建

    在PD中建立外鍵碰到一個問題,如: forum(id,name)表,forum_thread(id,forum_id)表,需要將forum的id設為forum_thread的外建,指向forum_id,默認的在 PD中是將主鍵設為外建.

    需要如下設置才可以:

    foreign_key.png
    posted @ 2007-01-31 10:42 Alex 閱讀(1317) | 評論 (0)編輯 收藏

    key words: 上傳文件

    目里面有上傳文件的需求,我想了一下不外乎下面兩種處理方法:

    1. 在數(shù)據(jù)庫表中建立一個blob字段存放用戶上傳文件.
    2. 在服務器上建立一個文件夾保存用戶上傳文件,數(shù)據(jù)庫表中只存放該文件的url地址.

    我本人現(xiàn)在比較傾向于第2種方案, 主要原因是擔心方案1的效率(我用的是mysql數(shù)據(jù)庫)。 但是處理過程中除了維護數(shù)據(jù)庫中表的字段還要維護上傳的文件,稍微麻煩一點。

    大家在項目里面又是怎么做呢? 給我點建議!謝謝


    討論內容見: javaeye

    robin更建議第二種方案,放在數(shù)據(jù)庫中主要的問題是 AppServer吃不消,開銷比較大.

    上面是摘錄,不過我們這里用的是Oracle9i AS,在Oracle的協(xié)作套間里一般文檔或者上傳的文件都是保存在數(shù)據(jù)庫里,還把這個特性作為Oracle 與別的協(xié)作套件之間不同的賣點。

    大家以為如何? 我直覺是Oracle的DB和oc4j的AppServer對付這個似乎沒有開銷上的擔心,但是沒有實際檢測過。

    換句話說,文件的管理是放在文件夾里方便還是數(shù)據(jù)庫里方便? 有點為難

    update (2007-5-13):
    還有一種方案結合了數(shù)據(jù)庫和IO,我認為比較可行,就是文件存在數(shù)據(jù)庫,但是下載的時候第一次從數(shù)據(jù)庫下載,然后第一次這個文件保存在一個臨時文件夾下面,以后每次下載的時候總是先檢查此臨時文件夾,如果已經存在則直接下載,如果沒有則從數(shù)據(jù)庫重復這個動作。當然,保存在臨時文件夾下的文件的命名需要唯一,這個應該沒有問題。
    posted @ 2007-01-31 09:06 Alex 閱讀(1970) | 評論 (4)編輯 收藏


    這個年代的偶像很多,值得學習的也很多,,如果讓我說,我覺得在現(xiàn)在這個急功近利的所謂2.0時代,阿甘精神更值得我們學習。

    什么是阿甘精神?
    1。奔跑。 不停的奔跑,不要停下來
    2。不斷地重復,如果你做的不夠好,那就說明你還重復的不夠多。
    3。執(zhí)著。 不要相信權威,按自己的意志去做。

    現(xiàn)在,聰明的人很多,但是小聰明似乎更多,包括我。

    你認可阿甘精神么? 如果是,頂一下。

    剛看到關于阿甘精神的另一個有意思的摘錄:



    "
    阿甘就是看到一個目標就走過去了,別的人是,看見一個目標,先訂一個作戰(zhàn)計劃,然后匍匐前進,往左閃,往右躲,再弄個掩體…一輩子就看他閃轉騰挪活得那叫一個花哨,最后哪兒也沒到達。
    "

    很形象哦。

    祝各位在2007年工作進步。

    posted @ 2007-01-30 08:59 Alex 閱讀(1231) | 評論 (2)編輯 收藏

    key words: js,javascript,檢查上傳文件大小

    有時需要在客戶端獲得待上傳得文件大小,google了一下,發(fā)現(xiàn)下面這個用法.

    <html>??
    <input?type="file"?name="file1"?onchange="ShowSize(this.value)">??
    <script?language="JavaScript">??
    <!--??
    function?ShowSize(files)??
    {??
    ??
    var?fso,f;??
    ??fso
    =new?ActiveXObject("Scripting.FileSystemObject");??
    ??f
    =fso.GetFile(files);
    ??
    var?mySize?=?f.size/1024;
    ??alert(mySize
    +"?K?");??
    }
    ??
    //-->??
    </script>??
    </html>


    BTW: 奇怪,COS上傳組件里怎么沒有獲得上傳文件大小的方法?? MultipartRequest里是沒有,有知道的兄弟通知下哦
    posted @ 2007-01-25 17:16 Alex 閱讀(10420) | 評論 (4)編輯 收藏

         摘要: key words : hibernate spring daocome from : http://lpacec.javaeye.com/blog/46220???1.??package?infoweb.dao;?????????2.?????????3.?import?java.util.List;?????????4.?import?java.util.Iterator;?????????5...  閱讀全文
    posted @ 2007-01-25 09:24 Alex 閱讀(920) | 評論 (0)編輯 收藏

    key words: REST webservice

    轉自廖宇雷的Weblog

    REST 是由 Roy Fielding 在他的論文《Architectural Styles and the Design of Network-based Software Architectures》中提出的一個術語。

    REST 是英文 Representational State Transfer 的縮寫,有中文翻譯為“具象狀態(tài)傳輸”(參考:《SIP/IMS網(wǎng)絡中的Representational State Transfer (REST)和數(shù)據(jù)分布》)。

    —————————————

    前面的內容比較枯燥,我說說我自己的理解。

    但是 REST 到底是什么呢?論文我看不懂,不過找到一篇更簡單易懂的東西:《Building Web Services the REST Way》

    根據(jù)這篇文章,我整理了一下我自己對 REST 的理解:

    REST 首先只是一種架構樣式,不是一種標準。這點和 Ajax 類似,兩者都是利用現(xiàn)有的成熟技術。

    在 REST 的定義中,一個 Web 應用總是使用固定的 URI 向外部世界呈現(xiàn)(或者說暴露)一個資源

    URI 是英文 Uniform Resource Identifier 的縮寫,中文翻譯“通用資源標志符”。

    “通用資源標志符”是指唯一標識一個資源(xhtml 文件、圖片、css 樣式表)的字符串。當然了,RFC 中定義的 URI 復雜得多,不過我們此處將 URI 想象成一個人的身份證號碼就行了(你不能有兩個同時有效的身份證號碼,一個號碼也不可能同時對應兩個人)。而我們天天掛在嘴邊的 URL 地址就是 URI 的一種表現(xiàn)形式(個人理解,有錯請糾正)。

    知道什么是 URI 后,我們來看一個實際例子:

    http://www.example.com/photo/logo 指向 example.com 網(wǎng)站(可以視為一個 Web 應用)中類型為 photo,名字為 logo 的資源。我們用瀏覽器訪問這個 URI,看到的將可能是一個 xhtml 文檔,其中用 <img src=”……” /> 來顯示實際的照片。

    http://www.example.com/photo/logo 很容易讓你想到 URL 重寫。事實上,這個地址很可能會在服務器內部處理為 http://www.example.com/photo.php?name=logo 這樣的地址。photo.php 是服務器端的一個動態(tài)腳本文件,根據(jù) name 參數(shù)生成 xhtml 文檔返回給瀏覽器。

    現(xiàn)在假設我們要獲取這張照片的 XML 文檔。XML 文檔中包含照片的文件名、文件大小、拍攝日期等等信息。也就是說我們要獲取“同一個資源的不同表現(xiàn)形式的數(shù)據(jù)”。對于這個要求,我們可以很容易的用另一個 URL 地址達到:http://www.example.com/xml/logo。

    但是,這就違背了“URI 唯一標識一個資源”的定義。如果我們要獲取同一個資源的多種表現(xiàn)形式,那么就要使用更多的 URL,從而給一個資源指定了多個不同的 URI。

    而在 REST 中,不管是獲取照片的 xhtml 文檔還是 XML 文檔,或者照片文件本身,都是用同一個 URI,就是 http://www.example.com/photo/logo。

    那這是怎么辦到的呢?Ruby On Rails 中是通過分辨 HTTP Request Header 信息來分辨客戶端是想要取得資源的哪一種表現(xiàn)形式的數(shù)據(jù)。

    當我們用瀏覽器訪問一個網(wǎng)址時,瀏覽器會構造一個 HTTP 請求。這個請求有一個頭信息,其中包括了本次請求接受何種類型的數(shù)據(jù)。通常瀏覽器發(fā)送的 HTTP 請求頭中,Accept 的值都是 */*,也就說接受服務器返回的任何類型的數(shù)據(jù)。

    看到這里,聰明的家伙應該知道了。只要我們指定一個特定的 Accept 參數(shù),那么服務器就可以通過判斷該參數(shù)來決定返回什么類型的數(shù)據(jù)。所以在一個采用 REST 架構的應用中,要獲取同一個資源的不同表現(xiàn)形式的數(shù)據(jù),只需要使用不同的 HTTP 請求頭信息就行了。

    如果考慮為 Web 應用增加 Web Services,這種技術的價值就體現(xiàn)出來了。比如我寫了一個 Delphi 程序,現(xiàn)在只需要構造一個包含 Accept: text/xml 的 HTTP 請求頭,然后將請求發(fā)送到 http://www.example.com/photo/logo 就可以了。返回的結果就是一個 XML 文檔,而不是 xhtml 文檔。

    因為我們的 HTTP 請求頭信息有不同的狀態(tài),從而可以獲得不同的數(shù)據(jù),所以叫做“具象狀態(tài)傳輸” :)

    —————————————

    除了上面的用法,REST 還有進一步的擴展。

    我們在 Web 應用中處理來自客戶端的請求時,通常只考慮 GET 和 POST 這兩種 HTTP 請求方法。實際上,HTTP 還有 HEAD、PUT、DELETE 等請求方法。而在 REST 架構中,用不同的 HTTP 請求方法來處理對資源的 CRUD(創(chuàng)建、讀取、更新和刪除)操作:

    • POST: 創(chuàng)建
    • GET: 讀取
    • PUT: 更新
    • DELETE: 刪除

    經過這樣的一番擴展,我們對一個資源的 CRUD 操作就可以通過同一個 URI 完成了:

    http://www.example.com/photo/logo(讀取)
    仍然保持為 [GET] http://www.example.com/photo/logo

    http://www.example.com/photo/logo/create(創(chuàng)建)
    改為 [POST] http://www.example.com/photo/logo

    http://www.example.com/photo/logo/update(更新)
    改為 [PUT] http://www.example.com/photo/logo

    http://www.example.com/photo/logo/delete(刪除)
    改為 [DELETE] http://www.example.com/photo/logo

    從而進一步規(guī)范了資源標識的使用。

    通過 REST 架構,Web 應用程序可以用一致的接口(URI)暴露資源給外部世界,并提供對資源的操作服務。這對于以資源為中心的 Web 應用來說非常重要。例如照片共享網(wǎng)站、用戶社區(qū)等。

    —————————————

    Ruby On Rails 1.2 版對 REST 有很好的支持,但要在 PHP 中應用 REST 還需要解決不少問題:

    • 如何在服務端判斷 PUT、DELETE 請求方法;
    • 如何獲取用 PUT、DELETE 請求方法中傳遞的數(shù)據(jù);
    • 如何獲取 HTTP 請求頭信息中的 Accept 參數(shù)值;
    • 如何在瀏覽器端發(fā)起 PUT 和 DELETE 請求。

    不過我仔細看了 PHP 文檔,我覺得上面幾個問題都是可以解決的。

    服務端綜合使用 $_SERVER[’HTTP_ACCEPT’]、$_SERVER[’REQUEST_URI’]、$_SERVER[’REQUEST_METHOD’]、$_SERVER[’QUERY_STRING’] 這些變量應該可以搞定前面三個問題。而第四個問題則可以用 JavaScript 的 XMLHttpRequest 對象來實現(xiàn)。

    不過我想 REST 的真正價值在于 Web Services,而不是通過瀏覽器操作的應用程序。

    —————————————

    參考:

    posted @ 2007-01-23 08:30 Alex 閱讀(448) | 評論 (0)編輯 收藏

    key words : web快速開發(fā)

    web快速開發(fā)是一個值得期待的東西,最早我接觸過codecharge,是一個商業(yè)軟件,功能據(jù)說很強大,我試用過,支持php,asp,jsp等多語言,但是感覺對java的支持不是很順手,接著就是asp,這個好也不好,原因就不說了,因為我對java關注。

    2. 接著就是dorado ,剛看到的,感覺也不錯,有asp的風格,不過更適合j2ee的環(huán)境 ,這里是他們的在線演示demo,有興趣的可以看一下

    3. 最后,剛google了一下,Oracle也有一個基于Oracle數(shù)據(jù)庫的快速開發(fā)產品? : APEX,基于瀏覽器做DB 開發(fā),原來的名字叫做HTML DB,名字很直觀,據(jù)說Oracle的metalink就是用這個實現(xiàn)的,應該功能不賴。

    4.對了,再補充一個現(xiàn)在很熱的,Ror,聽說javaeye的網(wǎng)站要重新用ruby1.2開發(fā),試用過一點,感覺確實令人震驚,值得關注。

    java的技術其實是看著很熱鬧,比較大的東西也不少,但是真正關注web這一塊的其實不多,無論是struts還是webwork,離我們所說的真正的“快速開發(fā)”的距離很遠,而以上一些工具的出現(xiàn)也許會逐步改善j2ee在這一領域的現(xiàn)狀。

    我之所以對這個目前有點興趣,確實有一種強烈的反差在折磨著我,因為我相信在j2ee的web開發(fā)里確實存在本來要開發(fā)1周多的工作量很可能用一個好的工具幾個小時就搞定了,這是一件多么荒唐搞笑的事情?如果dorado在它的產品中真的能做到這樣那我們的java開發(fā)那么坑吃坑吃的折騰個什么勁啊? 也許真的有奇跡,我寧愿相信有這樣的奇跡。

    大家有什么好的想法可以討論一下。
    posted @ 2007-01-20 22:56 Alex 閱讀(3784) | 評論 (7)編輯 收藏

    key words: powerdesign,power , design

    引言:
    發(fā)現(xiàn)powerdesign的文檔真的是不多,不過powerdesign還是很有用的,見到此類文檔就收藏下吧.

    轉自edeed

    ?附上一些使用pd11的心得:

    1、安裝PD v11.0版

    2、由pdm生成建表腳本時,字段超過15字符就發(fā)生錯誤(oracle)
    原因未知,解決辦法是打開PDM后,會出現(xiàn)Database的菜單欄,進入Database - Edit Current DBMS -script-objects-column-maxlen,把value值調大(原為30),比如改成60。出現(xiàn)表或者其它對象的長度也有這種錯誤的話都可以選擇對應的objects照此種方法更改!
    或者使用下面的這種方法:
    生成建表腳本時會彈出Database generation提示框:把options - check model的小勾給去掉,就是不進行檢查(不推薦)!
    或者可以修改C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\DBMS\oracl9i2.xdb文件
    修改好后,再cdm轉為pdm時,選擇“Copy the DBMS definition in model”把把這個資源文件拷貝到模型中。

    3、生成的建表腳本中如何把對象的雙引號去掉?
    打開cdm的情況下,進入Tools-Model Options-Naming Convention,把Name和Code的標簽的Charcter case選項設置成Uppercase或者Lowercase,只要不是Mixed Case就行!
    或者選擇Database->Edit current database->Script->Sql->Format,有一項CaseSensitivityUsingQuote,它的 comment為“Determines if the case sensitivity for identifiers is managed using double quotes”,表示是否適用雙引號來規(guī)定標識符的大小寫,可以看到右邊的values默認值為“YES”,改為“No”即可!
    或者在打開pdm的情況下,進入Tools-Model Options-Naming Convention,把Name和Code的標簽的Charcter case選項設置成Uppercase就可以!

    4、建立一個表后,為何檢測出現(xiàn)Existence of index的警告
    A table should contain at least one column, one index, one key, and one reference.
    可以不檢查 Existence of index 這項,也就沒有這個警告錯誤了!
    意思是說沒有給表建立索引,而一個表一般至少要有一個索引,這是一個警告,不用管也沒有關系!

    5、創(chuàng)建一個表在修改字段的時候,一修改name的內容,code也跟著變化,如何讓code不隨著name變化
    Name和Code 的右側都有一個按鈕“=”,如果需要不同步的話,把這個按鈕彈起來就可以了。
    Tools->General Options->Dialog->Name to Code Mirroring (去掉)

    6、由CDM生成PDM時,自動生成的外鍵的重命名
    PDM Generation Options->Detail->FK index names默認是%REFR%_FK,改為FK_%REFRCODE%,其中%REFRCODE%指的就是CDM中Relationship的code!另外自動生成的父字段的規(guī)則是PDM Generation Options->Detail->FK column name template中設置的,默認是%.3:PARENT%_%COLUMN%,可以改為Par%COLUMN%表示是父字段!

    7、如何防止一對一的關系生成兩個引用(外鍵)
    要定義關系的支配方向,占支配地位的實體(有D標志)變?yōu)楦副怼?br />在cdm中雙擊一對一關系->Detail->Dominant role選擇支配關系

    8、修改報表模板中一些術語的定義
    即文件:C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\Report Languages\Chinese.xrl
    Tools-Resources-Report Languages-選擇Chinese-單擊Properties或雙擊目標
    修改某些對象的名稱:Object Attributes\Physical Data Model\Column\
    ??????? ForeignKey:外鍵
    ??????? Mandatory:為空
    ??????? Primary:主鍵
    ??????? Table:表
    用查找替換,把“表格”替換成“表”
    修改顯示的內容為別的:Values Mapping\Lists\Standard,添加TRUE的轉化列為是,F(xiàn)ALSE的轉化列為空
    另外Report-Title Page里可以設置標題信息
    posted @ 2007-01-17 09:55 Alex 閱讀(3165) | 評論 (3)編輯 收藏

    key words : beanShell ,動態(tài)腳本

    原來第一次是在osworkflow中聽說過beanShell,最近又碰到,感覺還是挺有用的,比如對于我來說我就想有一些class文件拿過來直接調用看看,但有不想搭建一個麻煩的環(huán)境,而beanshell就可以滿足我這個需求。

    假設我欲調用的java為MyShit
    package?com.app;

    public?class?MyShit
    {
    ????
    static{
    ????????System.out.println(
    "this?is?in?static?blog");
    ????}

    ????
    public?static?void?main(String[]?args){
    ????????System.out.println(
    "this?is?in?main?method?:?hello?shit");
    ????}

    ????
    public?void?shit(){
    ????????System.out.println(
    "hello?shit!!!");
    ????}


    ????
    public?static?void?haha(){
    ????????System.out.println(
    "this?is?static?method?haha");
    ????}

    }


    javac ...
    java ..

    在dos中設置classpath,指向該class文件

    set classpath=%classpath%;c:\beanshell

    編寫一個 bsh的bat文件,便于dos直接調用beanshell腳本
    ?
    java?bsh.Interpreter?%1


    編寫一個test.bsh腳本
    //mytest
    import?com.app.*;

    print(
    "hello,it's?a?beanShell?test");

    List?list??
    =?new?ArrayList();
    list.add(
    "111");
    list.add(
    "222");
    list.add(
    "333");

    print(
    "the?list?=?"?+?list);

    Date?date?
    =?new?Date();
    print(
    "the?date?=?"?+?date);

    //method?test

    add(?a,?b?)?
    {
    ????
    return?a?+?b;
    }


    foo?
    =?add(1,?2);????????????//?3
    print("foo?=?"?+?foo);
    foo?
    =?add("Oh",?"?baby");???//?"Oh?baby"
    print("foo?=?"?+?foo);

    //about?object
    foo()?{
    ????print(
    "foo");
    ????x
    =5;

    ????bar()?
    {
    ????????print(
    "foo's?method?bar()");
    ????}


    ????
    return?this;
    }


    myfoo?
    =?foo();????//?prints?"foo"
    print(?myfoo.x?);?//?prints?"5"
    myfoo.bar();??????//?prints?"bar"

    MyShit?shit?
    =?new?MyShit();
    shit.shit();
    shit.main(
    null);
    print(
    "do?you?shit");

    //MyShit.haha();


    在dos下運行 bsh test.bsh就OK了

    另外,beanshell作為動態(tài)腳本語言可以結合 spring2.0的新特性,你新寫的業(yè)務類可以直接修改而不用重新發(fā)布,怎么樣,是不是比較方便,詳細操作請參考Springframework 2.0 與 ZK 混合開發(fā)實例

    試一試!

    詳細使用請參考官方文檔
    posted @ 2007-01-09 20:01 Alex 閱讀(6517) | 評論 (7)編輯 收藏

    key words: 連接池 數(shù)據(jù)庫

    發(fā)現(xiàn)一個有意思的現(xiàn)象,好多人在開發(fā)過程中不知道是出于訓練自己編碼還是為了重新發(fā)明輪子,總之明明已經存在的功能他非要自己實現(xiàn)一遍。

    今天又碰到一個。

    jdbc的連接,好多人也喜歡自己實現(xiàn)一個連接池,但是對于app server來說本身一般都有支持連接池的,為什么不用呢?
    寫了一通又長又臭的代碼,自己以為牛B的很,其實算個球啊。

    不要浪費,不要自己發(fā)明輪子,你不是最牛的,一定還有比你更牛的!

    對于weblogic或者oracle以及ibm的產品來說,大家還是比較習慣于用容器的jndi,但是即使對于tomcat,我個人也建議用tomcat自帶的。

    附: jndi連接數(shù)據(jù)庫

    public?final?static?synchronized?Connection?getConnection(String?inputJNDI)?throws
    ??????DBMException?
    {
    ????Connection?conn?
    =?null;
    ????String?strConnJNDI?
    =?null;
    ????
    try?{
    ??????Context?ctx?
    =?new?InitialContext();
    ??????_log.debug(ctx);

    ??????
    if?(null?!=?inputJNDI)?{
    ????????
    if(inputJNDI.length()?>?0)
    ??????????strConnJNDI?
    =?inputJNDI;
    ????????
    else
    ??????????strConnJNDI?
    =?dbJndiName;
    ??????}

    ??????
    else?{
    ????????strConnJNDI?
    =?dbJndiName;
    ??????}

    ??????DataSource?ds?
    =?(DataSource)?ctx.lookup(strConnJNDI);
    ??????_log.debug(ds);
    ??????conn?
    =?ds.getConnection();
    ????}

    ????
    catch?(Exception?ex)?{
    ??????_log.error(
    "It's?error?to?get?connection",?ex);
    ??????
    throw?new?DBMException("Error?to?get?connection");
    ????}

    ????_log.debug(conn);
    ????
    return?conn;
    ??}


    以此類推,類似于xml解析等的工作也沒有必要自己一步一步地用dom或者什么亂七八糟的sax自己去搞一遍,搞了半天就使為了得到其中的一個value,何苦來著???? 如果你不是為了做研究,那么,效率第一,安全第一.

    隨便說說,也許有人不同意我的觀點,沒關系,盡管談談,哈哈? :)
    posted @ 2007-01-04 20:58 Alex 閱讀(1949) | 評論 (8)編輯 收藏

    key words: 2007 plans

    新的一年開始了,制定一個計劃吧

    說說你有什么計劃

    如圖:

    2007-plans.png
    posted @ 2007-01-03 23:31 Alex 閱讀(1505) | 評論 (12)編輯 收藏

    key words: tomcat,數(shù)據(jù)源配置,datasource

    把一個應用從4.1移到5.5數(shù)據(jù)源死活不出來,用probe察看了一下居然datasource配置錯誤.

    4.x的配置如下:

    <Context?path="/cpms"?docBase="cpms"???debug="99"?privileged="true">
    ????????????
    <Resource?name="jdbc/report"?auth="Container"?type="javax.sql.DataSource"/>
    ????????????
    <ResourceParams?name="jdbc/report">?
    ????????????????
    <parameter>
    ????????????????????
    <name>username</name>
    ????????????????????
    <value>root</value>
    ????????????????
    </parameter>
    ????????????????
    <parameter>
    ????????????????????
    <name>password</name>
    ????????????????????
    <value>XXX</value>
    ????????????????
    </parameter>
    ????????????????
    <parameter>
    ????????????????????
    <name>driverClassName</name>?
    ????????????????????
    <value>org.gjt.mm.mysql.Driver</value>
    ????????????????
    </parameter>
    ????????????????
    <parameter>
    ????????????????????
    <name>url</name>?
    ????????????????????
    <value>jdbc:mysql://localhost/app</value>
    ????????????????
    </parameter>?
    ????????????????
    <parameter>
    ??????????
    <name>RemoveAbandoned</name>
    ??????????
    <value>true</value>
    ????????
    </parameter>
    ????????
    <parameter>
    ??????????
    <name>LogAbandoned</name>
    ??????????
    <value>true</value>
    ????????
    </parameter>
    ????????
    <parameter>
    ??????????
    <name>RemoveAbandonedTimeout</name>
    ??????????
    <value>60</value>
    ????????
    </parameter>
    ??????????????
    </ResourceParams>?
    ????
    </Context>??


    5.x的配置如下:

    <Context?path="/app"?docBase="cpms"
    ????????debug
    ="5"?reloadable="true"?crossContext="true">



    ??
    <Resource?name="jdbc/report"?auth="Container"?type="javax.sql.DataSource"
    ???????????????maxActive
    ="100"?maxIdle="30"?maxWait="10000"
    ???????????????username
    ="develop"?password="XX"?driverClassName="com.mysql.jdbc.Driver"
    ???????????????url
    ="jdbc:mysql://localhost:3306/app?autoReconnect=true"/>
    </Context>


    沒有具體看原因.知道的兄弟可以發(fā)表高見

    tomcat的管理和監(jiān)控推薦用probe,自帶的那個admin管理太濫了。

    posted @ 2006-12-22 12:04 Alex 閱讀(1720) | 評論 (1)編輯 收藏

    key words: sql server,單用戶,master恢復

    ?作者:jankie
    日期:2006-12-1

    一、MASTER數(shù)據(jù)庫備份與恢復
    ? ?1、數(shù)據(jù)庫master正常情況下對master進行(完全)備份;
    若要恢復:
    ? ?2、停止SQL Server服務;
    ? ?3、以單用戶實例的方式啟動SQL Server,啟動時不要把窗口關閉;(具體看二)
    ? ?4、然后再對MASTE數(shù)據(jù)庫進行恢復即可;

    二、MSSQL單用戶實例的啟動方法:
    ??如何在單用戶模式下啟動SQL Server的命名實例(命令提示符)? ?
    ??在單用戶模式下從命令提示符啟動SQL Server 的命名實例? ???
    ??從命令提示符輸入:? ???
    ??sqlservr.exe -c??-m? ?-s? ?{instancename}? ?

    例1:
    ??1、sqlserver.exe -c -m 回車(默認實例)
    ??2、sqlserver.exe -c -m -s benet (實例名為benet)
    ? ?
    ??說明在啟動 sqlservr.exe之前,必須在命令窗口中切換到適當?shù)哪夸?br />如:c:\program files\microsoft sql server\mssql\bin目錄下
    posted @ 2006-12-21 15:08 Alex 閱讀(506) | 評論 (0)編輯 收藏

    key words: dll,ocx,注冊控件

    最近項目中用到了收銀,需要在顧顯上顯示金額.


    1.將.dll、.ocx等考到system32下。
    2.用命令注冊regsvr32.exe? .dll。(eg:regsvr32.exe? OWC11.dll)
    3.在注冊表中查看:利用名稱或與其唯一對應的clsid("clsid:0002E55D-0000-0000-C000-???000000000046")可查找到相關信息
    posted @ 2006-12-20 15:13 Alex 閱讀(697) | 評論 (0)編輯 收藏

         摘要: key words: bea world2006 ,workshop studio, 快速開發(fā)

    bea world 2006 北京已經過去好幾天了,早就想記錄一下一直忙 :)
      閱讀全文
    posted @ 2006-12-20 11:39 Alex 閱讀(2665) | 評論 (10)編輯 收藏

    key words: commons log,log4j,apache log

    前言: 對于log4j雖然在用,但是也存在一個疑問,怎么有的用apache的commons logging有的直接用log4j,下面的這篇文章解釋了我的疑問.

    轉自 here

    Apache組織開發(fā)了一套用于支持Logging的Log4J,Java?1.4版本也引入了一套內置的 Logging框架,如果開發(fā)者想在這兩套Logging系統(tǒng)之間自由的切換,該怎么辦呢?答案就是,使用Commons?Logging。 Commons?Logging定義了一套抽象的Logging接口,用戶可以通過配置,使這些接口指向任何一個已存在的Logging系統(tǒng)。

    ?使用抽象Logging接口
    問題:
    你在編寫一個可以重復使用的庫,需要寫入Log信息,但你不想使你的Logging功能綁定在Apache?Log4J或者JDK?1.4?Logging框架上。
    解決方案:

    public?static?void?main(String[]?args)?{//自己替換[]

    ??System.setProperty("org.apache.commons.logging.Log",
    ??????"org.apache.commons.logging.impl.Jdk14Logger");
    ??Log?log?=?LogFactory.getLog("com.discursive.jccook.SomeApp");

    ??if?(log.isTraceEnabled())?{
    ????log.trace("This?is?a?trace?message");
    ??}

    ??if?(log.isDebugEnabled())?{
    ????log.debug("This?is?a?debug?message");
    ??}

    ??log.info("This?is?an?informational?message");
    ??log.warn("This?is?a?warning");
    ??log.error("This?is?an?error");
    ??log.fatal("This?is?fatal");

    }


    LogFactory.getLog方法會根據(jù)底層環(huán)境返回一個適當?shù)腖og實現(xiàn)。如果用戶想指定一個具體的Logging系統(tǒng)實現(xiàn),可以設置org.apache.commons.logging.Log系統(tǒng)屬性。例如:
    System.setProperty("org.apache.commons.logging.Log",
    "org.apache.commons.logging.impl.Log4JLogger");
    這樣就會使用Log4J作為Logging系統(tǒng)。
    org.apache.commons.logging.Log可以設定為:
    ?org.apache.commons.logging.impl.Log4JLogger??使用Log4J
    ?org.apache.commons.logging.impl.Jdk14Logger??使用JDK?1.4?Logging框架
    ?org.apache.commons.logging.impl.SimpleLog??使用Commons?Logging內置的簡單Log實現(xiàn)
    其他:
    總結一下,Commons?Logging會按照下列順序來指定具體的Log實現(xiàn)。
    ?如果定義了org.apache.commons.logging.Log系統(tǒng)參數(shù),實用指定的Logging實現(xiàn)。
    ?如果在CLASSPATH里發(fā)現(xiàn)了Log4J,使用Log4J。
    ?如果使用的是JDK1.4,使用JDK1.4內置的Logging框架。
    ?如果都沒有找到,則使用Commons?Logging內置的簡單Log實現(xiàn)。
    posted @ 2006-12-18 15:38 Alex 閱讀(714) | 評論 (0)編輯 收藏

    key words : 職業(yè)規(guī)劃? 高薪

    原文見robbin的pdf,我整理了一下腦圖

    職業(yè)規(guī)劃與高薪之路.png
    posted @ 2006-12-17 13:25 Alex 閱讀(3456) | 評論 (6)編輯 收藏

    注意:這篇文章是由無人工介入的自動的機器翻譯系統(tǒng)翻譯完成。這些文章是微軟為不懂英語的用戶提供的, 以使他們能夠理解這些文章的內容。微軟不保證機器翻譯的正確度,也不對由于內容的誤譯或者客戶對它的使用所引起的任何直接的, 或間接的可能的問題負責。

    概要

    Microsoft SQL Server 2000 支持同一計算機上同時運行的多個 SQLServer 數(shù)據(jù)庫引擎實例。 以下是兩種類型的 SQLServer 數(shù)據(jù)庫引擎實例: 默認和命名。 只能有, 任何計算機上運行一個默認實例并且由默認實例運行計算機上的名稱標識它。 通常指定以下列格式: 計算機名和實例名稱
    computer_name\instance_name
    要 MicrosoftSQLServer2000JDBC, 連接命名實例通過 SQL 服務器 2000 MicrosoftTextDriver 必須指定端口號與命名實例, 代替的命名實例名稱相關聯(lián)如前面。

    更多信息

    要查找 SQLServer 實例端口號, 請按照下列步驟:
    1.在 Microsoft SQL Server 2000 服務器, 啟動 SQL Server 網(wǎng)絡實用工具。
    2.要從 實例 下拉菜單實例依次, 常規(guī) 選項卡。
    3.TCP/IP, 依次 屬性 。 注意, 在 屬性 對話框中出現(xiàn)端口號為此實例。

    當您連接到 SQLServer 通過 JDBC 連接 URL 中使用只要有該值,。 下面是典型連接 URL 的示例:

    jdbc:microsoft:sqlserver: / 1433; yourServerName / 用戶 = yourUser ; 密碼 = yourPwd :
    在本示例, 使用默認端口是 1433。 將此默認替換端口號為您命名實例。
    posted @ 2006-12-17 00:35 Alex 閱讀(1239) | 評論 (0)編輯 收藏

    key words: jsp,jstl,1.0,1.1,fn函數(shù)

    原來一直用struts,最近項目里有人用jstl,我也就順便拿來用,感覺還是不錯。

    過程中碰到一些小的問題總結如下:

    一。版本問題
    jstl存在1.0和1.1的差異問題,用EL建議需要在1.1的版本下,1.1的URI的標志為:
    <%@?taglib?uri="http://java.sun.com/jsp/jstl/core"?prefix="c"%>
    <%@?taglib?uri="http://java.sun.com/jsp/jstl/functions"?prefix="fn"%>

    注意,1.0版本沒有/jsp/.

    如果用的1.0會出現(xiàn)如下異常
    org.apache.jasper.JasperException:?/public/left_tree.jsp(100,24)?According?to?TLD?or?attribute?directive?in?tag?file,?attribute?items?does?not?accept?any?expressions
    ????org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:
    510)
    ????org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
    375)
    ????org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
    314)
    ????org.apache.jasper.servlet.JspServlet.service(JspServlet.java:
    264)
    ????javax.servlet.http.HttpServlet.service(HttpServlet.java:
    802)
    ????org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:
    75)
    ????org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:
    77)
    ????com.wellsoon.zfzw.webapp.common.VabAccessFilter.doFilter(VabAccessFilter.java:
    43)


    root?cause?



    二。打開EL

    <%@?page?contentType="text/html;charset=gb2312"?language="java"?isELIgnored="false"?%>

    前提是容器支持2.0,即使支持默認也未必打開,最安全的方式就是顯示打開 isELIgnored="false"

    三.fn的用法
    對于Vo里的一個List作length的計算或判斷很方便
    <table?width="160"?border="0"?cellspacing="0"?cellpadding="4">
    ????????????????????????
    <c:forEach?items="${menuInfos}"?var="m">
    ????????????????????????????
    <c:if?test="${fn:length(m.subMenus)>0}">
    ??????????????????????????
    <tr>
    ????????????????????????????
    <td>
    ????????????????????????????????
    <script?language="JavaScript">
    ??????????????????????????????????????
    var?tObj?=?new?treeClass("A1")
    ??????????????????????????????????????tObj.start();
    ?????????????????????????????????????tObj.m_start(
    "<c:out?value="${m.menuModule}"/>",0);
    ????????????????????????????????????
    <c:forEach?items="${m.subMenus}"?var="sub">
    ??????????????????????????????????????tObj.add_Sub(
    "<c:out?value="${sub.menuName}"/>","<%=path%>
    <c:out?value=
    "${sub.url}"/>","mymain");
    ????????????????????????????????????
    </c:forEach>
    ?????????????????????????????????????tObj.m_end();
    ??????????????????????????????????????tObj.end();
    ??????????????????????????????????????tObj.print();
    ?????????????????????????????????
    </script>
    ????????????????????????????
    </td>
    ????????????????????????
    </tr>
    ????????????????????????????
    </c:if>
    ????????????????????????
    </c:forEach>

    ????????????????????
    </table>
    ?
    四.tld的聲明可以在web.xml作顯式聲明也可以用http作直接URL聲明
    推薦用本地的方式.

    posted @ 2006-12-11 19:21 Alex 閱讀(2803) | 評論 (2)編輯 收藏

    key words: MiddleGen,hibernate,many to many,多對多

    如果你有如下表結構

    user(user_id,user_name)
    role(role_id,role_name)

    user_role(id,user_id,role_id)

    那么默認MiddleGen生成的是兩個一對多,但我們更多的情況是用many to many

    需要修改middlegen的build.xml文件

    <many2many>
    ????????????
    <tablea?generate="true"?name="user"/>
    ????????????
    <jointable?name="user_role"?generate="false"/>
    ????????????
    <tableb?generate="true"?name="role"/>
    ?????????
    </many2many>

    posted @ 2006-12-07 20:26 Alex 閱讀(908) | 評論 (0)編輯 收藏

    越來越發(fā)現(xiàn)其實掌握 hibernate并不容易,Spring用起來其實簡單多了,但是在用hibernate的時候真的是需要一定的時間積累,對一個項目組來說如果采用hibernate最好有一個對hibernate比較清楚的人否則碰到問題就會成為項目的風險。
    我想告訴各位的是,掌握hibernate可能比你預期的難多了,當你輕松的告訴我,hibernate很簡單的時候該是你自己多反省了. (只有一種情況例外,你是一個牛人)

    好了,一個引子廢話那么多,其實今天只是想先說一說hibernate里的Fetch的作用.

    大家都知道,在hibernate里為了性能考慮,引進了lazy的概念,這里我們以Parent和Child為模型來說明,

    public?class?Parent?implements?Serializable?{

    ????
    /**?identifier?field?*/
    ????
    private?Long?id;

    ????
    /**?persistent?field?*/
    ????
    private?List?childs;

    ????
    //skip?all?getter/setter?method

    ??
    }??



    public?class?Child?implements?Serializable?{

    ????
    /**?identifier?field?*/
    ????
    private?Long?id;

    ????
    /**?persistent?field?*/
    ????
    private?net.foxlog.model.Parent?parent;

    ??? //skip all getter/setter method

    }

    在我們查詢Parent對象的時候,默認只有Parent的內容,并不包含childs的信息,如果在Parent.hbm.xml里設置lazy="false"的話才同時取出關聯(lián)的所有childs內容.

    問題是我既想要hibernate默認的性能又想要臨時的靈活性該怎么辦?? 這就是fetch的功能。我們可以把fetch與lazy="true"的關系類比為事務當中的編程式事務與聲明式事務,不太準確,但是大概是這個意思。

    總值,fetch就是在代碼這一層給你一個主動抓取得機會.

    Parent?parent?=?(Parent)hibernateTemplate.execute(new?HibernateCallback()?{
    ????????????
    public?Object?doInHibernate(Session?session)?throws?HibernateException,?SQLException?{
    ????????????????Query?q?
    =?session.createQuery(
    ????????????????????????
    "from?Parent?as?parent?"+
    ????????????????????????????????
    "?left?outer?join?fetch?parent.childs?"?+
    ????????????????????????????????
    "?where?parent.id?=?:id"
    ????????????????);
    ????????????????q.setParameter(
    "id",new?Long(15));
    ????????????????
    return?(Parent)q.uniqueResult();
    ????????????}

    ????????});

    ????????Assert.assertTrue(parent.getChilds().size()?
    >?0);


    你可以在lazy="true"的情況下把fetch去掉,就會報異常. 當然,如果lazy="false"就不需要fetch了


    有一個問題,使用Fetch會有重復記錄的現(xiàn)象發(fā)生,我們可以理解為Fetch實際上不是為Parent服務的,而是為Child服務的.所以直接取Parent會有不匹配的問題.



    參考一下下面的這篇文章
    Hibernate集合初始化

    ======================================================================

    update:以上有些結論錯誤,實際上在hibernate3.2.1版本下測試,可以不出現(xiàn)重復記錄,

    public?void?testNPlusOne()?throws?Exception{
    ????????List?list?
    =?(List)hibernateTemplate.execute(new?HibernateCallback()?{
    ????????????
    public?Object?doInHibernate(Session?session)?throws?HibernateException,?SQLException?{
    ????????????????Query?q?
    =?session.createQuery(
    ????????????????????????
    "select?distinct?p?from?net.foxlog.model.Parent?p?inner?join?fetch?p.childs"
    ????????????????);
    ????????????????
    return?q.list();
    ????????????}

    ????????});

    ????????
    //((Parent)(list.get(0))).getChilds();
    ????????System.out.println("list?size?=?"?+?list.size());
    ????????
    for(int?i=0;i<list.size();i++){
    ????????????Parent?p?
    =?(Parent)list.get(i);
    ????????????System.out.println(
    "===parent?=?"?+?p);
    ????????????System.out.println(
    "===parent's?child's?length?=?"?+?p.getChilds().size());
    ????????}

    ????}


    打印結果如下:
    Hibernate:?select?distinct?parent0_.id?as?id2_0_,?childs1_.id?as?id0_1_,?childs1_.parent_id?as?parent2_0_1_,?childs1_.parent_id?as?parent2_0__,?childs1_.id?as?id0__?from?parent?parent0_?inner?join?child?childs1_?on?parent0_.id=childs1_.parent_id
    list?size?
    =?3
    ===parent?=?net.foxlog.model.Parent@1401d28[id=14]
    ===parent's?child's?length?=?1
    ===parent?=?net.foxlog.model.Parent@14e0e90[id=15]
    ===parent's?child's?length?=?2
    ===parent?=?net.foxlog.model.Parent@62610b[id=17]
    ===parent's?child's?length?=?3

    另外,如果用open session in view模式的話一般不用fetch,但首先推薦fetch,如果非用的話因為有N+1的現(xiàn)象,所以可以結合batch模式來改善下性能.


    posted @ 2006-12-01 13:01 Alex 閱讀(19372) | 評論 (7)編輯 收藏

    主站蜘蛛池模板: 成人A片产无码免费视频在线观看| 中文免费观看视频网站| 久久成人国产精品免费软件| 国产乱子伦精品免费女| 亚洲av永久无码精品表情包| 亚洲精品成a人在线观看夫| 精品免费tv久久久久久久| 国内外成人免费视频| 亚洲AV无码乱码在线观看富二代| 中文字幕乱码亚洲无线三区| 中文精品人人永久免费| 成人免费a级毛片| 国产成人A人亚洲精品无码| 亚洲成a人片在线不卡一二三区| 国产免费一区二区视频| 国产成人免费a在线资源| 久久久国产精品亚洲一区| 日韩在线视频免费| 国产三级在线观看免费| 亚洲AV无码乱码国产麻豆穿越| 亚洲精品无码国产片| 97在线视频免费| 亚洲男人av香蕉爽爽爽爽| 亚洲久悠悠色悠在线播放| 久久黄色免费网站| 吃奶摸下高潮60分钟免费视频| 亚洲成人免费在线观看| 两个人日本WWW免费版| 在线观看免费精品国产| 亚洲女人影院想要爱| 国产色无码精品视频免费| 四虎亚洲国产成人久久精品| 亚洲一卡二卡三卡四卡无卡麻豆| 免费无码黄网站在线看| 亚洲国产精品第一区二区三区| 亚洲久悠悠色悠在线播放| 久久久久久曰本AV免费免费| 亚洲精品无码久久久久sm| 人妻免费久久久久久久了| 日韩a在线观看免费观看| 亚洲一区二区三区在线 |