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

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

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

    隨筆-75  評論-193  文章-5  trackbacks-0
      2008年8月9日
    var fixgeometry = function() {
        /* Some orientation changes leave the scroll position at something
         * that isn't 0,0. This is annoying for user experience. */
        scroll(0, 0);
        /* Calculate the geometry that our content area should take */
        var header = $(".header:visible");
        var footer = $(".footer:visible");
        var content = $(".content:visible");
        var viewport_height = $(window).height();
        
        var content_height = viewport_height - header.outerHeight() - footer.outerHeight();
        
        /* Trim margin/border/padding height */
        content_height -= (content.outerHeight() - content.height());
        content.height(content_height);
      }; /* fixgeometry */
      $(document).ready(function() {
        $(window).bind("orientationchange resize pageshow", fixgeometry);
      });
    posted @ 2013-01-28 10:59 The Matrix 閱讀(5194) | 評論 (1)編輯 收藏
    http://java.dzone.com/articles/hibernate-tuning-queries-using?page=0,0 
    posted @ 2012-05-14 14:28 The Matrix 閱讀(1214) | 評論 (0)編輯 收藏
    環(huán)境:
        
        Centos6.2(安裝在Vmware7.0中)
        Magento1.6.2
        Apache Httpd Server 2.2.15
        MySql 5.1.61
        PHP5.3.3

    安裝過程:

        apache http、mysql、php及相關(guān)擴(kuò)展安裝:
        其中apache http、Mysql、php都是利用centos的添加/刪除軟件功能進(jìn)行安裝。同時使用該功能安裝"php-xml"、"php-gd"、"php-pdo"、"php-mbstring"、"php-mysql"擴(kuò)展。
        使用chkconfig配置httpd和mysql為系統(tǒng)服務(wù)。命令如下:
        chkconfig httpd on
        chkconfig -add mysqld
        chkconfig mysqld on
        使用chkconfig --list 可以查看所有的服務(wù)配置狀態(tài)
        使用service httpd start、service mysqld start啟動httpd和mysqld服務(wù)。可以通過service httpd restart重啟相關(guān)服務(wù)。
        此時訪問本機(jī)的http://localhost可以看到apache的歡迎界面,同時編輯index.php文件,其內(nèi)容如下:
        <?php
            phpinfo();
        ?>
        并將該文件置于/var/www/html目錄下,訪問http://localhost/index.php,此時應(yīng)該不能看到php版本信息,僅能看到index.php的靜態(tài)文本內(nèi)容。
        修改/etc/httpd/conf/httpd.conf文件,修改如下:
        DirectoryIndex index.html index.html.var ->  DirectoryIndex index.html index.htm index.php
        增加:
        AddType application/x-httpd-php .php
        AddDefaultCharset -> AddDefaultCharset off  (解決中文亂碼問題)
        增加一段VirtualHost描述,如下(在配置文件的最后):
        <VirtualHost *:80>
            DocumentRoot /var/www/smallfive
            ServerName smallfive
            ServerAlias smallfive.com *.smallfive.com
        </VirtualHost>
        此時訪問http://localhost/index.php,應(yīng)該一切正常

        設(shè)置數(shù)據(jù)庫:
        使用mysqladmin -u root password 'newpassword'設(shè)置mysql數(shù)據(jù)庫的默認(rèn)密碼
        讓數(shù)據(jù)庫更安全:
        mysql -u root -p    進(jìn)入mysql
        mysql> DROP DATABASE test;                刪除test數(shù)據(jù)庫
        mysql> DELETE FROM mysql.user WHERE user = '';       刪除匿名帳戶
        mysql> FLUSH PRIVILEGES;                 重載權(quán)限
        創(chuàng)建magento數(shù)據(jù)庫
        mysql> CR   訪問magento數(shù)據(jù)庫,確保一切正常

        配置Magento:
        解壓縮magento1.6.2版本至/var/www/smallfive/magento目錄
        解壓命令:
       EATE DATABASE magento;
        mysql> GRANT ALL PRIVILEGES ON magento.* TO 'root'@'localhost' IDENTIFIED BY 'newpassword'; 
      tar zxvf magento1.6.2.tar.gz
        此時訪問http://localhost/magento,可根據(jù)magento的設(shè)置進(jìn)行配置
       
        注意如下問題:
        1、確保當(dāng)前用戶擁有對/var/www/smallfive/magento可讀可寫權(quán)限
        2、還需安裝mcrypt庫,安裝這個庫比較繁瑣,mcrypt依賴于Libmcrypt庫和mhash庫,我們需要下載Libmcrypt庫和mhash庫安裝它們,然后再編譯Mcrypt。
        在編譯之前,先做好如下準(zhǔn)備工作:
            a、安裝phpize:yum -y install php-devel
            b、安裝C++腳本編譯模塊:
                yum -y install gcc gcc-g++
                yum -y install gcc gcc-c++
        安裝mcrypt庫過程,如下:
            a、下載libmcrypt和mhash庫
                Libmcrypt:http://sourceforge.net/project/showfiles.php?group_id=87941&package_id=91774&release_id=487459
                mhash:http://sourceforge.net/project/showfiles.php?group_id=4286&package_id=4300&release_id=645636
            b、將上述兩個下載后,分別解壓,并執(zhí)行如下命令編譯:
                ./configure
                make && make install
            c、下載php對應(yīng)的源代碼,解壓,
                進(jìn)入php源代碼的 /ext/mcrypt目錄
                執(zhí)行phpize命令
                ./configure –with-php-config=/usr/bin/php-config
                make && make install
            d、在php.ini文件中增加如下內(nèi)容:
                extension=/usr/lib/php/modules/mcrypt.so
                mcrypt.so文件路徑在php-config文件中可以找到
            e、service httpd restart
       
        end!
         
        參考文章:
        http://www.eexu.com/article.asp?id=1730
        http://www.ruiwant.com/centos-6-0%E4%B8%8Bmagento%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%80%BB%E7%BB%93.html
        http://zixun.www.net.cn/qita/2344.html
        http://os.qudong.com/Linux/2010/0210/64441.html
    posted @ 2012-04-04 17:09 The Matrix 閱讀(3132) | 評論 (1)編輯 收藏
    有時在vmware里面安裝的系統(tǒng)或應(yīng)用有License時間的限制,可以通過修改虛擬機(jī)時間的方法來防止過期,此時需在.vmx文件中加入下面的內(nèi)容:
    tools.syncTime = "FALSE"
    time.synchronize.continue = "FALSE"
    time.synchronize.restore = "FALSE"
    time.synchronize.resume.disk = "FALSE"
    time.synchronize.shrink = "FALSE"
    rtc.startTime = 1183431600  #這是用來指定虛擬機(jī)啟動后的時間。數(shù)字是自1970年1月1日零時零分零秒以來的秒數(shù),可以通過如下網(wǎng)址將某個時間轉(zhuǎn)換為該數(shù)字(Unix時間戳):http://www.onlineconversion.com/unix_time.htm

    注意:同時還需在虛擬機(jī)操作系統(tǒng)的服務(wù)中,停用“VMware Tools Service”的服務(wù)。
    在Windows Server 2003中操作系統(tǒng)自身也有時間同步功能,需在時間設(shè)定中停用,同時停用“Windows Timer”服務(wù)。
    posted @ 2012-03-02 10:51 The Matrix 閱讀(8685) | 評論 (0)編輯 收藏
    主要參見:http://blog.chenlb.com/2011/03/install-apache-php-wordpress-windows.html

    在安裝好apache http server后,如果端口不正確,則修改"apache安裝目錄/conf/httpd.conf"文件中的如下信息:
    Listen 80  -> Listen 8060
    #ServerName localhost:80 -> ServerName localhost:8060

    Apache HTTP Server版本:2.2
    PHP版本:5.3.8
    WordPress版本:3.2.1
    posted @ 2011-11-27 21:28 The Matrix 閱讀(658) | 評論 (0)編輯 收藏

    1. 打開工具Oracle SQL Plus 以dba身份登錄sys用戶
    sqlplus /nolog
    conn sys@url as sysdba

    2. 創(chuàng)建用戶并指定表空間

    使用客戶端工具或者Web管理控制臺創(chuàng)建表空間以及用戶
    給用戶賦予connect、resource、dba權(quán)限
    grant connect,resource,dba to username;


    注意:給oracle用戶分配connect、resource角色時,此時connect 角色中有一個 UNLIMITED TABLESPACE 權(quán)限,也就是username這個用戶可以在其他表空間里隨意建表。
    revoke unlimited tablespce from username;     --撤銷username用戶在任意表空間建表的權(quán)限
    alter user username quota 0 on users;      --alter username quota 0 on Users;  // 還不是很清楚具體含義???
    alter user username quota unlimited on tablespacename;   --賦予username用戶在tablespacename表空間任意建表的權(quán)限;

     


    3. 使用imp工具導(dǎo)入dmp數(shù)據(jù)文件
    imp username/password@url file=c:\db.dmp fromuser=username1 touser=username log=c:\log.txt


    -------------------------------------------------------------------------------------------------------------
    其它命令:
    select * from dba_users;    --查詢用戶

    select * from dba_tables;    --查詢表
    select * from dba_views;    --查詢視圖
    select * from dba_tablespaces;    --查詢表空間


    oracle 10g,查詢表空間使用率
    Select * from sys.DBA_TABLESPACE_USAGE_METRICS;
    -------------------------------------------------------------------------------------------------------------

    drop user username cascade;

    ORA-01940:無法刪除當(dāng)前已連接的用戶

    select username, sid, serial# from v$session where username='username';

    alter system kill session'sid,serial#'

     

    posted @ 2011-05-31 16:43 The Matrix 閱讀(3897) | 評論 (0)編輯 收藏
    環(huán)境:Windows7 professional

    1、下載redmine1.1.3.zip、ruby1.8.7、rubygems-1.3.7.zip、mysql 5.0

    2、安裝MySQL5.0,cmd窗口下使用mysql -u root -p 登錄MySQL數(shù)據(jù)庫,執(zhí)行如下語句創(chuàng)建redmine數(shù)據(jù)庫及用戶:
    create database redmine character set utf8;
    create user 'redmine'@'localhost' identified by 'my_password';
    grant all privileges on redmine.* to 'redmine'@'localhost';
    注:
        使用MySQL5.5在后面進(jìn)行初始數(shù)據(jù)時Ruby會提示連接有問題
        在安裝完MySQL后,先不要進(jìn)行配置,至“MySQL安裝路徑\bin”目錄下,修改MySQLInstanceConfig.exe為“以管理員成分執(zhí)行此程序”,“以兼容模式運行該程序”
        進(jìn)行數(shù)據(jù)庫配置時,選擇字符集為utf8

    3、運行ruby1.8.7安裝包,解壓至d:/ruby187,將d:/ruby187/bin添加至path環(huán)境變量中
    安裝后可執(zhí)行 ruby -v查看ruby版本以檢驗安裝是否正確

    4、解壓rubygems-1.3.7.zip至d:/rubygems-1.3.7
    進(jìn)入d:/rubygems-1.3.7目錄,執(zhí)行ruby setup.rb
    注:Redmine需要rubygems 1.3.1 - 1.5.x,肯定不能用1.8.2版本

    5、執(zhí)行g(shù)em install rails -v=2.3.5 遠(yuǎn)程安裝rails2.3.5版本
    gem install mysql
    gem install -v=0.4.2 i18n

    6、解壓縮redmine1.1.3至d:/redmine1.1.3目錄
    進(jìn)入d:/redmine-1.1.3/config目錄,修改database.yml.example文件為database.yml,并修改該文件中的production數(shù)據(jù)庫連接配置為如下:
    production:
      adapter: mysql
      database: redmine
      host: localhost
      username: redmine
      password: my_password
      encoding: utf8

    進(jìn)入d:/redmine1.1.3目錄,執(zhí)行
    rake config/initializers/session_store.rb
    rake db:migrate RAILS_ENV="production"

    7、加載默認(rèn)配置數(shù)據(jù)
    rake redmine:load_default_data RAILS_ENV="production"
    默認(rèn)語言選擇"zh"

    8、運行
    ruby script/server webrick -e production

    9、訪問:http://localhost:3000
    使用admin/admin進(jìn)行登入
    進(jìn)入設(shè)置,把默認(rèn)語言設(shè)為“簡體中文”,然后設(shè)置當(dāng)前用戶的默認(rèn)語言設(shè)為“簡體中文”,這樣就是中文界面了

    -----------------------------------------

    繼續(xù),將redmine設(shè)置為windows 7的服務(wù)

    1、首先需要配置mysql為windows 7的服務(wù)

    2、Ruby提供一個安裝Ruby程序為服務(wù)的包:mongrel_service。安裝其實很簡單,運行:gem install mongrel_service

    3、安裝redmine為服務(wù),執(zhí)行mongrel_rails service::install -N RedMine -c C:\redmine-1.1.3 -p 3000 –e production
    注意:此處打開cmd窗口時,需要輸入cmd后,不是直接按Enter,而是按 Ctrl+Shift+Enter打開Cmd窗口,此時以管理員身份打開,否則安裝為服務(wù)時會提示拒絕訪問。

    4、安裝服務(wù)后,需檢查服務(wù)-e后的參數(shù)是不是production,如果不是production而是development,則在注冊表中把參數(shù)手動改為production。修改方法是:打開“注冊表編輯器”,展開分支“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”,選擇redmine服務(wù),找到ImagePath項,修改保存后在服務(wù)列表中啟動服務(wù),并把服務(wù)設(shè)置自動啟動。

    OK!
    posted @ 2011-05-20 10:25 The Matrix 閱讀(2791) | 評論 (0)編輯 收藏
    參見如下鏈接:
    http://www.41post.com/3255/programming/unity3d-creating-a-gui-with-both-3d-and-2d-elements
    posted @ 2011-03-25 21:33 The Matrix 閱讀(1208) | 評論 (0)編輯 收藏
    沒仔細(xì)研究,先把項目地址記下:http://arshaw.com/fullcalendar/

    這個博客中另有幾個推薦的類似項目:http://hi.baidu.com/freezesoul/blog/item/15c5d73fe4a315c17d1e71ec.html
    posted @ 2010-11-09 20:37 The Matrix 閱讀(1284) | 評論 (0)編輯 收藏

    這幾天在看郎咸平的《誰在謀殺中國經(jīng)濟(jì)》,這本書我基本看過一遍了,認(rèn)為全書的重點在于中華文化的四大茫然,整本書都是圍繞這四大茫然展開論述,中華文化的四大茫然如下:
    茫然之一:就知道賺錢
    茫然之二:不了解世界
    茫然之三:不了解別人為什么那么看你
    茫然之四:不了解自己的缺點

    大家有時間可以看看這本書,我覺得寫的不錯,至少我自己看完深有感觸,我覺得完全可以將這幾點套用到我們生活的很多方面,比如對于我們搞IT的技術(shù)人員來說,我認(rèn)為現(xiàn)在很多人也存在四大茫然:

    茫然之一:只知道完成任務(wù)。也許是我年齡大了點,但我覺得現(xiàn)在很多小朋友,尤其是85年以后出生的,工作的時候只是在完成任務(wù),事情做完了,有時也不測試,或者就是匆匆測試,匆匆結(jié)束,并沒有好好的想為什么這件事老大要讓我這樣做,這樣做有什么好處,會不會有缺點,我是不是有更好的方法。當(dāng)你不去想的時候,意味著你少了很多提高的機(jī)會。

    茫然之二:不追究為什么。很多人做事情就象第一條說的那樣,只是完成任務(wù),并不去想其中的原理是什么。面試過很多人,對于目前工作兩三年的大部分人來說(當(dāng)然我面試的不是好的學(xué)校畢業(yè)的,基本學(xué)校為中等偏下點),一旦涉及到Spring、Hibernate、Struts等框架深入點東西的時候,大都回答不上來,只是對框架能熟練應(yīng)用而已。這樣夠么?計算機(jī)的很多知識,當(dāng)你熟悉了其運作原理,框架對于你來說,只是手到擒來,看看學(xué)學(xué)就會用了。我問過好幾個同事,平時晚上回去都干嘛,很多人都回答我晚上回去看看電視,稍微看看書就睡覺了。我有點驚訝,我想如果你想成為一個技術(shù)高手,一個能拿高薪的程序員,你又沒有天份,又不付出超過常人的努力,憑什么你比別人強呢?

    茫然之三:不善于總結(jié)。很多人(又是很多人)過著做一天和尚撞一天鐘的日子,日子一天一天過去,基本不去總結(jié),只是過了好長一段時間會發(fā)覺,原來最近我啥也沒有進(jìn)步,啥也沒學(xué)到,還是老樣子。知識在于積累,你只有不斷總結(jié),知識才能更好的積累,才能更好的為你服務(wù)。

    茫然之四:沒有明確的目標(biāo)。一個人沒有目標(biāo)就決定了他不會有長足的進(jìn)步。你都沒有想過自己要成為一個架構(gòu)師,一個項目經(jīng)理,一個部門經(jīng)理,一個技術(shù)總監(jiān),都沒有想過要成為這樣的人需要具備什么樣的條件,你怎么可能知道自己欠缺什么?需要補充什么呢?長遠(yuǎn)目標(biāo)要明確,然后根據(jù)長遠(yuǎn)目標(biāo)進(jìn)行分析,我要達(dá)到這樣的目標(biāo),還有什么欠缺,據(jù)此制定短期目標(biāo),短期目標(biāo)一定要可實現(xiàn)可操作。這樣隨著你目標(biāo)的一步一步實現(xiàn),你各方面的能力也隨之提高了。

    寫了幾點,也作為對自己的鞭策。

    posted @ 2010-04-14 22:05 The Matrix 閱讀(6163) | 評論 (10)編輯 收藏

    2010年已經(jīng)過去一個月了,趕在農(nóng)歷春節(jié)前列一下今年的讀書清單,不能總把精力放在工作中了,也需要補充點新知識了,否則沒有新東西能貢獻(xiàn)出來了。

    1、《OSGI原理與最佳實踐》,結(jié)合這本書并研究SpringDM,做一些實例。

    2、《SQL語言藝術(shù)》

    3、《Oracle9i&10g編程藝術(shù)》

    4、《架構(gòu)之美》

    5、《UML和模式應(yīng)用》

    6、《UML彩色建模》

    7、《領(lǐng)域驅(qū)動設(shè)計與模式實戰(zhàn)》

    8、《敏捷軟件開發(fā) 原則、模式與實踐》

    9、《軟件開發(fā)的邊界》

    10、《軟件隨想錄》

    11、《走出軟件作坊》

    就這么多了,9、10、11去年都看過一遍了,但好多地方粗粗過了一下,還要仔細(xì)閱讀。

    另外也對自己提個要求,看書要做讀書筆記。

    2010年-我的讀書年!

    posted @ 2010-02-03 23:27 The Matrix 閱讀(2770) | 評論 (6)編輯 收藏

    摘自《軟件隨想錄》

    看了軟件隨想錄中下面一段話,覺得非常棒,作為一名軟件從業(yè)人員,不一定有機(jī)會能實現(xiàn)描述中的優(yōu)秀軟件產(chǎn)品,但這樣的理念需要貫穿我們每個人的心田,時刻記在心中:

    【創(chuàng)造一個有使用價值的軟件,你必須時時刻刻都在奮斗,每一次的修補,每一個功能,每一處小小的改進(jìn),你都在奮斗,目的只是為了再多創(chuàng)造一點空間,可以再多吸引一個用戶加入。沒有捷徑可走。你需要一點運氣,但是這不取決于你是否幸運。你之所以會有好運氣,那是因為你寸土必爭。

    每天你前進(jìn)一小步,將一件東西做得比昨天好一點點。這樣的改進(jìn)幾乎看不出可以讓誰獲益,幾乎沒有變化。但是,你前進(jìn)了一小步。

    有無數(shù)個要做的這樣微小的改進(jìn)。

    為了發(fā)現(xiàn)可以改進(jìn)的地方。你必須有一個思維定勢,始終如一的用批判的眼光看世界。隨便找一樣?xùn)|西,如果你看不出它的缺點,那么你的思維轉(zhuǎn)型還沒有成功。當(dāng)你成功的時候,你身邊親密的人會被你逼得發(fā)瘋。你的家人恨不得殺了你。當(dāng)你步行上班的時候,看到一個司機(jī)漫不經(jīng)心地開車,你幾乎用了所有的意志力才勉強忍不住沖上去告訴那個司機(jī),他這樣開車差點兒要了旁邊坐在輪椅上的那個可憐小孩的命。

    當(dāng)你改正了一個又一個這樣的小細(xì)節(jié)后,當(dāng)你磨光、定型、擦亮、修飾你的產(chǎn)品的每一個小邊角后,就會有神奇的事情發(fā)生。厘米變成分米,分米變成米,米變成了千米。你最后拿出來的是一件真正優(yōu)秀的產(chǎn)品。它第一眼就讓人覺得震撼,出類拔萃,工作起來完全符合直覺。就算100萬個用戶中有一個用戶某天突然要用到一個他100萬次使用中才會用到一次的罕見功能,他發(fā)現(xiàn)了這個功能不僅能用,而且還很沒:在你的軟件中,即使是看門人的小屋都鋪著大理石的地板,配有實心的橡木門和桃花心木的壁板。

    就是在這個時候,你意識到這是一個優(yōu)秀軟件。】

    posted @ 2010-01-05 21:25 The Matrix 閱讀(2298) | 評論 (11)編輯 收藏

    http://www.insideria.com/2009/05/flex-4-custom-layouts.html


    http://www.insideria.com/2009/10/easy-flex-skinning-with-firewo.html

    posted @ 2009-11-25 12:25 The Matrix 閱讀(592) | 評論 (0)編輯 收藏

    在Flash Builder 4 Beta 2版本中,使用mxml方式實現(xiàn)state的切換有了很大改進(jìn),使用起來更方便,具體可參見下文:

    http://onflex.org/learn/fx4/index.php?page=States

    看完這篇文章后,想到一個問題,如何用編程的方式實現(xiàn)切換呢,找了參考資料,實現(xiàn)了一個例子,代碼如下:

    開發(fā)環(huán)境:Flash Builder 4 Beta2

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application
        
    xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s
    ="library://ns.adobe.com/flex/spark"
        creationComplete
    ="creationCompleteHandler(event)">
        
    <fx:Script>
            
    <![CDATA[
                import mx.core.UIComponent;
                import mx.events.FlexEvent;
                import mx.states.SetProperty;
                import mx.states.State;
                
                import spark.components.Label;
                import spark.components.Panel;

                private var stateArray : Array;
                private var state1 : State;
                private var state2 : State;
                
                protected function creationCompleteHandler(event:FlexEvent):void
                {
                    state1 = new State();
                    state1.name="state1";
                    
                    state2 = new State();
                    state2.name="state2";
                    
                    var stateArray1:Array = new Array();
                    var stateArray2:Array = new Array();
                    
                    state1.overrides = stateArray1;
                    state2.overrides = stateArray2;
                    
                    stateArray = new Array();
                    stateArray.push(state1);
                    stateArray.push(state2);
                    this.states = stateArray;
                    
                    var panel:Panel = new Panel();
                    group.addElement(panel);
                    var label:Label = new Label();
                    panel.addElement(label);
                    
                    buildStates(stateArray1, stateArray2, panel, label);
                    this.currentState = "state1";
                }

                private function buildStates(stateArray1:Array, stateArray2:Array,
                    compenent1:UIComponent, compenent2:UIComponent) : void{
                    
                    stateArray1.push(makeSetProp(compenent1, "title", "Panel1"));            
                    stateArray1.push(makeSetProp(compenent2, "text", "One"));
                    
                    stateArray2.push(makeSetProp(compenent1, "title", "Panel2"));
                    stateArray2.push(makeSetProp(compenent2, "text", "Two"));
                }
                
                private function makeSetProp(target:UIComponent, name:String, value:*):SetProperty{
                    var sp:SetProperty = new SetProperty();
                    sp.target = target;
                    sp.name = name;
                    sp.value = value;
                    return sp;
                } 
            
    ]]>
        
    </fx:Script>
            
        
    <s:VGroup autoLayout="true" horizontalAlign="center">
            
    <s:HGroup horizontalCenter="0">            
                
    <s:Button label="One" 
                    click
    ="this.currentState='state1'"/>            
                
    <s:Button label="Two" 
                    click
    ="this.currentState='state2'"/>            
            
    </s:HGroup>
            
    <s:HGroup id="group" horizontalCenter="0">            
            
    </s:HGroup>
        
    </s:VGroup>
        
    </s:Application>
    posted @ 2009-11-11 21:59 The Matrix 閱讀(1629) | 評論 (0)編輯 收藏

        這是前幾天在別人的BLog上看到的一幅圖,覺得不錯,基本涵蓋了IT人員需要掌握的基礎(chǔ)知識這塊,從這幅圖中可以看出語言并不重要,關(guān)鍵是要搞明白整個環(huán)節(jié),這樣遇到任何問題就能有目的、有方法的學(xué)習(xí)了。

    計算機(jī)知識體系

    posted @ 2009-10-22 08:32 The Matrix 閱讀(968) | 評論 (0)編輯 收藏

    1、下載Ruby并安裝,下載地址:http://rubyforge.org/frs/?group_id=167

    下載了1.8.6-27 Release Candidate 2(ruby186-27_rc2.exe)版本

    2、在windows的命令行下,輸入 ruby –v,檢查ruby是否正確安裝,應(yīng)該出現(xiàn)如下信息:

    ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32]

    3、安裝rails,執(zhí)行g(shù)em install rails命令,安裝成功后,執(zhí)行rails -v檢查。

    我安裝了Rails2.3.2版本。使用gem install -version rails可以指定安裝的rails版本,具體如何使用gem,可以用gem help install查看幫助。

     

    參考:Ruby On Rails(ROR)安裝(http://enjoylog.cn/?p=8

     

    裝好了便到Ruby On Rails的官方網(wǎng)站(http://rubyonrails.org/),找到了

    Getting Started with Rails(http://guides.rubyonrails.org/getting_started.html)

    開始一步一步follow up。

    RubyOnRails的中文站上的翻譯文檔沒有完全跟進(jìn),還是看英文的吧。

     

    我使用的是MySQL的數(shù)據(jù)庫,操作系統(tǒng):Vista。

    到創(chuàng)建POSTS應(yīng)用的時候遇到了問題,創(chuàng)建數(shù)據(jù)后數(shù)據(jù)庫中有數(shù)據(jù),但是到Listing posts界面無法查看,總是報錯。

    網(wǎng)上Google了一下,果然有人遇到相同的問題,參照了如下解決方案,到

    http://instantrails.rubyforge.org/svn/trunk/InstantRails-win/InstantRails/mysql/bin/ 上下載了libmySQL.dll文件放到RUBY_HOME/bin/目錄下,問題解決。

    參考:升級2.2后mysql驅(qū)動的問題(http://www.javaeye.com/topic/283871?page=1

     

    感嘆一下,當(dāng)Listing Posts這個CRUD小應(yīng)用跑起來后,覺得Ruby On Rails的開發(fā)是比Java開發(fā)要快一些,看了一下它生成的代碼,貌似也不多。

     

    今天晚了,明天繼續(xù)。

    posted @ 2009-07-19 00:42 The Matrix 閱讀(1799) | 評論 (0)編輯 收藏

        最近在做一個很小的項目的功能改進(jìn),小小的項目中原來連接的是MySQL數(shù)據(jù)庫,現(xiàn)在需要新連接一個數(shù)據(jù)庫(Oracle),僅僅從一張表查詢數(shù)據(jù)即可,沒有添加、修改、刪除等等功能。本來這個小小的項目中用的是Hibernate,現(xiàn)在又要增加一個數(shù)據(jù)庫連接,覺得配置起來有點麻煩,忽然想起來,我干嗎還要用Hibernate呢,直接用JDBC不也挺好使么,想了便做,果然寫起JDBC來,很是快捷,一會就搞好了。

        做好了以后,忽然覺得有點迷茫,感覺不用Hibernate不也挺好的么,咱為什么現(xiàn)在開口閉口都是Hibernate呢,于是便有了今天的題目。

        很久以前沒有Hibernate的時候:

        第一階段:我們寫程序都是直接用JDBC,甚至在JSP頁面中直接去createConnection,然后執(zhí)行查詢,輸出到頁面。

        第二階段:后來覺得每次都是創(chuàng)建一個連接,好像效率不高,于是看了別人的介紹,要用數(shù)據(jù)庫連接池,好的,那便用數(shù)據(jù)庫連接池吧,每次都從pool中獲得一個Connection,然后查詢數(shù)據(jù)。

        第三階段:用了連接池,還是效率不高,那怎么辦呢?用緩存吧,自己實現(xiàn)緩存?可以,也可以用開源的緩存框架。

        第四階段:到了OO大流行的時代了,一切都要OO,恰逢Hibernate降臨人世,于是一切都用Hibernate來實現(xiàn)了,其實同期還是有不少其它ORMAP框架的,比如(TOPLINK、JDO、IBatis等,IBatis國內(nèi)用的還比較多,另外兩個好像用的比較少)。

        第五階段:忽然EJB大流行,事務(wù)的概念被廣為傳播(并不是原來沒有事務(wù)的概念,只是實現(xiàn)起來比較麻煩),借助EJB的廣為傳播,Spring+Hibernate的組合也慢慢占據(jù)了大半市場。此時事務(wù)用Spring AOP的聲明式事務(wù)來解決,緩存可以用開源的緩存框架(已經(jīng)和Hibernate無縫集成了),數(shù)據(jù)庫連接池也是通過配置的方式在SpringContext.xml文件中配置,貌似一切都很完美。

     

        真的到了第五階段,一切是不是真的完美了呢,如果一個很小的應(yīng)用,需要從好幾個數(shù)據(jù)庫查詢數(shù)據(jù),但是每個數(shù)據(jù)庫僅需要查詢那么一兩張表的數(shù)據(jù),偶爾添加、刪除幾條數(shù)據(jù),數(shù)據(jù)量也不大,此時我們是不是還用第一階段的方式會更好呢,好像有時配置多數(shù)據(jù)源也不是那么方便的事情。或者使用Spring中的JDBCTemplate,貌似也不錯。

        再往后看,難道Spring+Hibernate的組合就天下無敵了么?難道就沒有新的框架了么?前段時間,JavaEye上關(guān)于充血模型、貧血模型的討論吸引了多少眼球,以后是不是會有這么一個框架用于實現(xiàn)充血模型呢?

       說了這么多,最終只是想說明白這么一句:用恰當(dāng)?shù)募夹g(shù)做恰當(dāng)?shù)氖虑椋@真是一個艱難的選擇……,至于未來,更是迷茫,因為我們只是跟隨者,而不是領(lǐng)導(dǎo)者。

    posted @ 2009-07-06 22:06 The Matrix| 編輯 收藏

    前兩天出差在外,利用空余時間將《深入淺出EXT JS》這本書的前五章翻了一遍,后面的章節(jié)粗粗瀏覽了一下,覺得這本書寫的不錯,寫下自己的一點感悟:

    1、適合的讀者

    a、是一名Java開發(fā)程序員,做過WEB開發(fā)

    b、對Ajax開發(fā)的基礎(chǔ)知識有所了解

    2、書評:

            這本書我覺得應(yīng)該改成這個名字:《EXT JS CookBook》,可能使得書的內(nèi)容和名稱更貼切,呵呵。

            書中對Ext JS的基礎(chǔ)類、Grid、Form、Tree、布局管理器、數(shù)據(jù)獲取等各方面都做了詳細(xì)的描述,基本上開發(fā)中需要用到的知識點,在書中都會提到,而且書中的很多例子和實際工作還是非常貼切的,對于工作中需要用到EXT JS或者需要學(xué)習(xí)EXT JS的程序員來說還是會很有幫助的。

            最后提點缺點,這本書中對EXT JS的知識點都做了比較詳細(xì)的描述,但是缺乏對EXT JS的框架的深入分析。

    posted @ 2009-04-19 13:36 The Matrix 閱讀(2403) | 評論 (2)編輯 收藏

    前兩天在InfoQ上看到一篇文章:利用Clear Toolkit連接Flex與Java開發(fā),今天下載了說明文檔粗略了翻了一遍,Clear Toolkit包含五個部分,分別是:

    • Clear Data Builder,這是個Eclipse插件,可以根據(jù)SQL語句或Java數(shù)據(jù)傳輸對象為BlazeDS或LCDS自動生成CRUD應(yīng)用。
    • DTO2Fx,該插件會根據(jù)Java類型自動生成對應(yīng)的ActionScript類。
    • Log4Fx是個構(gòu)建于Flex logging API之上的Eclipse插件,它會自動化日志處理并且更加靈活,也更加友好。
    • Fx2Ant插件會為Flex Builder項目生成優(yōu)化的Ant構(gòu)建腳本。
    • clear.swc是個增強的Flex組件庫。

    暫時用不到這個工具,記錄留待備查。

    posted @ 2009-04-12 20:57 The Matrix 閱讀(673) | 評論 (0)編輯 收藏

    這篇Blog是原來寫在別的地方的,今天將其轉(zhuǎn)到BlogJava上來。
    -------------------------------------------------------------------------------

    今天仔仔細(xì)細(xì)的看了一下Hibernate的緩存,并做了實例實踐了一把。google一下,網(wǎng)上的教程、文章很多。
    自己小結(jié)一下:

    Hibernate的緩存分為:

    • 一級緩存:在Session級別的,在Session關(guān)閉的時候,一級緩存就失效了。
    • 二級緩存:在SessionFactory級別的,它可以使用不同的緩存實現(xiàn),如EhCache、JBossCache、OsCache等。

    緩存的注釋寫法如下,加在Entity的java類上:

    • @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

    緩存的方式有四種,分別為:

    • CacheConcurrencyStrategy.NONE
    • CacheConcurrencyStrategy.READ_ONLY,只讀模式,在此模式下,如果對數(shù)據(jù)進(jìn)行更新操作,會有異常;
    • CacheConcurrencyStrategy.READ_WRITE,讀寫模式在更新緩存的時候會把緩存里面的數(shù)據(jù)換成一個鎖,其它事務(wù)如果去取相應(yīng)的緩存數(shù)據(jù),發(fā)現(xiàn)被鎖了,直接就去數(shù)據(jù)庫查詢;
    • CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不嚴(yán)格的讀寫模式則不會的緩存數(shù)據(jù)加鎖;
    • CacheConcurrencyStrategy.TRANSACTIONAL,事務(wù)模式指緩存支持事務(wù),當(dāng)事務(wù)回滾時,緩存也能回滾,只支持JTA環(huán)境。

    另外還有如下注意事項:

    1、查詢緩存需要在Query的相應(yīng)方法執(zhí)行前加上這么一句:

    query.setCacheable(true);

    在使用Hibernate時,獲得的query有setCacheable方法,可以設(shè)置使用緩存,但當(dāng)使用JPA時,javax.persistence.Query并沒有setCacheable方法,此時如果JPA的實現(xiàn)是Hibernate時,可以將其進(jìn)行如下轉(zhuǎn)化,再調(diào)用setCacheable方法(如果JPA的實現(xiàn)是其它ORMAP框架,就不知道怎么做了)。

    if (query instanceof org.hibernate.ejb.QueryImpl) {
        ((org.hibernate.ejb.QueryImpl) query).getHibernateQuery().setCacheable(
    true);
    }

    2、還有就是查詢緩存的查詢執(zhí)行后,會將查詢結(jié)果放入二級緩存中,但是放入的形式是以ID為Key,實例作為一個Value。

    3、hibernate的配置文件中需加入如下信息:

    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
    <property name="hibernate.cache.use_second_level_cache" value="true" />
    <property name="hibernate.cache.use_query_cache" value="true" />


    posted @ 2009-04-07 22:54 The Matrix 閱讀(10138) | 評論 (3)編輯 收藏
         摘要:     前段時間對Spring的事務(wù)配置做了比較深入的研究,在此之間對Spring的事務(wù)配置雖說也配置過,但是一直沒有一個清楚的認(rèn)識。通過這次的學(xué)習(xí)發(fā)覺Spring的事務(wù)配置只要把思路理清,還是比較好掌握的。     總結(jié)如下:     Spring配置文件中關(guān)于事務(wù)配置總是由三個組成部分,分別是Data...  閱讀全文
    posted @ 2009-04-05 16:38 The Matrix 閱讀(332573) | 評論 (85)編輯 收藏

    今天在Javaeye的新聞頻道看到一個界面原型繪制工具,叫做“wireframesketcher”,下載試了試,感覺有如下幾個好處:

    1、使用方便,可以很容易的做tree和table,比visio中的tree和table好用

    2、集成在eclipse中,對于開發(fā)人員來說用起來更直接

    3、其界面原型文件為xml格式,可以使用比較工具比較

    唯一的缺點:

    不是免費開源的工具,但是現(xiàn)在可以申請免費的license

     

    隨便畫了一個圖,如下:

    temp

     

    感興趣的兄弟姐妹們可以到如下地址看看:

    http://wireframesketcher.com/index.html

    posted @ 2009-03-28 21:55 The Matrix 閱讀(4605) | 評論 (1)編輯 收藏

    由于要寫一個Spring的培訓(xùn)教材,要做Spring的事務(wù)樣例,于是開始寫樣例,寫好了一測,控制臺有SQL輸出,數(shù)據(jù)庫卻查詢不到數(shù)據(jù),查亞查亞,花了一個多小時,原來是獲取的Service不是經(jīng)過代理的Service,自然事務(wù)不起作用,數(shù)據(jù)庫里就沒有數(shù)據(jù)了,鄙視一下自己。

    配置文件樣例如下(已經(jīng)修改了dao和service的命名,減少了寫錯的可能性,以后命名問題一定要注意):

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context
    ="http://www.springframework.org/schema/context"
        xmlns:aop
    ="http://www.springframework.org/schema/aop"
        xmlns:tx
    ="http://www.springframework.org/schema/tx"
        xsi:schemaLocation
    ="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
    >

       
    <context:annotation-config />
       
    <context:component-scan base-package="com.*" />

       
    <bean id="sessionFactory" 
                class
    ="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
           
    <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
           
    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
       
    </bean> 

       
    <!-- 定義事務(wù)管理器(聲明式的事務(wù)) --> 
       
    <bean id="transactionManager"
            class
    ="org.springframework.orm.hibernate3.HibernateTransactionManager">
           
    <property name="sessionFactory" ref="sessionFactory" />
       
    </bean>
       
       
    <!-- 配置DAO -->
       
    <bean id="generatorDaoTarget" class="com.*.spring.dao.GeneratorDaoImpl">
           
    <property name="sessionFactory" ref="sessionFactory" />
       
    </bean>
       
       
    <bean id="generatorDao" 
            class
    ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
           
    <!-- 配置事務(wù)管理器 --> 
           
    <property name="transactionManager"><ref bean="transactionManager" /></property> 
           
    <property name="target"><ref bean="generatorDaoTarget" /></property> 
           
    <property name="proxyInterfaces"><value>com.*.spring.dao.GeneratorDao</value></property>
           
    <!-- 配置事務(wù)屬性 --> 
           
    <property name="transactionAttributes"> 
               
    <props> 
                   
    <prop key="*">PROPAGATION_REQUIRED</prop>
               
    </props> 
           
    </property> 
       
    </bean> 

       
    <bean id="plantDaoTarget" class="com.*.spring.dao.PlantDaoImpl">
           
    <property name="sessionFactory" ref="sessionFactory" />
       
    </bean>
       
       
    <bean id="plantDao" 
            class
    ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
              
    <!-- 配置事務(wù)管理器 --> 
           
    <property name="transactionManager"><ref bean="transactionManager" /></property>    
           
    <property name="target"><ref bean="plantDaoTarget" /></property> 
           
    <property name="proxyInterfaces"><value>com.*.spring.dao.PlantDao</value></property>          
           
    <!-- 配置事務(wù)屬性 --> 
           
    <property name="transactionAttributes"> 
               
    <props> 
                   
    <prop key="*">PROPAGATION_REQUIRED</prop>
               
    </props> 
           
    </property> 
       
    </bean>
       
       
    <!-- 配置Service -->
       
    <bean id="plantGeneratorServiceTarget" 
            class
    ="com.*.spring.service.PlantGeneratorServiceImpl"> 
           
    <property name="plantDao"> 
               
    <ref bean="plantDao" /> 
           
    </property> 
           
    <property name="generatorDao"> 
               
    <ref bean="generatorDao" /> 
           
    </property> 
       
    </bean>       
       
       
    <bean id="plantGeneratorService" 
            class
    ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
              
    <!-- 配置事務(wù)管理器 --> 
              
    <property name="transactionManager"><ref bean="transactionManager" /></property>    
           
    <property name="target"><ref bean="plantGeneratorServiceTarget" /></property> 
           
    <property name="proxyInterfaces"><value>com.*.spring.service.PlantGeneratorService</value></property>
           
    <!-- 配置事務(wù)屬性 --> 
           
    <property name="transactionAttributes"> 
               
    <props> 
                   
    <prop key="*">PROPAGATION_REQUIRED</prop> 
               
    </props> 
           
    </property> 
       
    </bean> 
    </beans>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
    >

    <hibernate-configuration>

    <session-factory>

       
    <!-- 各屬性的配置-->
       
    <!-- 為true表示將Hibernate發(fā)送給數(shù)據(jù)庫的sql顯示出來 -->
       
    <property name="hibernate.show_sql">true</property>
       
    <property name="hibernate.hbm2ddl.auto">none</property> 

       
    <!-- SQL方言,這邊設(shè)定的是MySQL -->
       
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
       
    <!--連接數(shù)據(jù)庫的Driver-->
       
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
       
    <!--數(shù)據(jù)庫連接url-->
       
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>

       
    <!--用戶名-->
       
    <property name="connection.username">root</property>
       
    <!--密碼-->
       
    <property name="connection.password">123456</property>

       
    <!-- 映射文件  -->
       
    <mapping class="com.*.spring.domain.Generator" />
       
    <mapping class="com.*.spring.domain.Plant" />
    </session-factory>
    </hibernate-configuration>
    public interface GeneratorDao {

       
    /**
         * 獲取所有機(jī)組數(shù)據(jù)
         *
    @return
        
    */
       
    public List<Generator> listGenerators();
       
       
    /**
         * 保存機(jī)組數(shù)據(jù)
         *
    @param generator 機(jī)組數(shù)據(jù)
        
    */
       
    public void save(Generator generator);   
    }
    public class GeneratorDaoImpl extends HibernateDaoSupport implements GeneratorDao {
          
        @SuppressWarnings(
    "unchecked")
       
    public List<Generator> listGenerators() {
           
    return this.getSession().createQuery("from Generator").list();
        }

       
    public void save(Generator generator) {
           
    this.getSession().save(generator);   
        }
    }
    posted @ 2009-03-16 22:24 The Matrix 閱讀(1550) | 評論 (0)編輯 收藏

        給自己做的這個程序起了個名字叫EasyWork,代碼可以從Google Code上下載,具體地址如下:

      http://easywork.googlecode.com/svn/trunk/

      由于時間關(guān)系,這個程序還存在不少問題,所以只能供大家參考,有問題不要罵我就行了:)

      簡要使用說明:

      1、開發(fā)環(huán)境+運行環(huán)境:MyEclipse6.0,JDK1.5,Tomcat6.0.14,MySQL5.0

      2、準(zhǔn)備好上述環(huán)境后,使用下載代碼sql目錄中的easywork_init.sql腳本創(chuàng)建數(shù)據(jù)庫表和初始數(shù)據(jù)。

      3、將項目導(dǎo)入Eclipse后,運行Tomcat(此過程就不詳細(xì)描述了)。

      4、使用http://localhost/easywork/system/login.jsp訪問登錄頁面,目前還沒有做index.html,默認(rèn)用戶名/密碼:admin/1。

     

      存在問題如下:

      1、任務(wù)管理功能還沒有完全完成,日志記錄還沒有做。

      2、超時或者沒有登錄訪問頁面時,只是報不能訪問的異常,沒有轉(zhuǎn)入登錄頁面。

      3、對資源類型(菜單、URL、字段、操作)的訪問限制還沒有做。

      4、很多界面的輸入信息校驗沒有做。

      5、基本沒有美工。

      6、總而言之,目前這個項目中的代碼只能做Struts2 + ExtJS如何使用的借鑒:)

    posted @ 2009-03-01 11:03 The Matrix 閱讀(6286) | 評論 (28)編輯 收藏

        很近沒有更新BLog了,這一陣子忙著學(xué)習(xí)Struts2和ExtJS,使用這兩者做了一個小程序,使用RBAC實現(xiàn)了基本的權(quán)限管理功能,還做了一個任務(wù)管理和日志記錄,任務(wù)管理用于記錄當(dāng)前需要處理的事情,日志記錄用于記錄每天的工作情況。

        用下來Struts2和ExtJS還是挺好用的。先貼幾張圖,后續(xù)再把學(xué)習(xí)過程中遇到的問題整理出來。

    任務(wù)管理

    task

    添加組

    addgroup

    添加權(quán)限

    addprivilege

    添加角色

     addrole

    posted @ 2009-02-26 07:14 The Matrix 閱讀(4333) | 評論 (15)編輯 收藏

        由于前段時間使用JSF做了一個項目,不少使用JSF的兄弟們對JSF評價并不好,因此在學(xué)習(xí)的過程中一直在想,JSF究竟是不是應(yīng)該繼續(xù)學(xué)習(xí)繼續(xù)研究使用下去,在看完Seam In Action的第三章后,這個星期又對Struts2簡單學(xué)習(xí)了一下,終于決定結(jié)束JSF和JBoss Seam的學(xué)習(xí)了。

        因為從JSF的學(xué)習(xí)和Struts2的學(xué)習(xí)對比中明顯覺得JSF復(fù)雜,對于一個技術(shù)力量不是非常強的項目組來說,使用JSF當(dāng)你遇到一些問題時,絕對是一件痛苦的事情。

        從自己的實踐中覺得JSF至少有兩個致命傷:

        1、覺得JSF貌似把簡單的事情搞得復(fù)雜化了,在傳統(tǒng)的MVC框架如Struts中,從request中獲取param很容易,也可以將param封裝為對象,在JSF中,希望將這一切都模型化,一切都以組件為中心,類似于Swing的架構(gòu),但是http的無狀態(tài)以及web的本質(zhì),使得一般JSF只能將組件樹存放在服務(wù)端,同時又不能象CS程序那樣方便的查看組件的狀態(tài)、屬性等信息。對于通常情況來說,JSF將其封裝的很好,不用我們開發(fā)者操心,但是當(dāng)遇到一些問題時,對于開發(fā)者想去調(diào)試查看問題時,問題就顯得很復(fù)雜了。

        2、JSF的自定義組件感覺超復(fù)雜,難度應(yīng)該比當(dāng)年自定義JSP標(biāo)簽更要高,試想一下,如果哪個組件不合意了,想改一下,還是比較困難的,除非對JSF組件有相當(dāng)?shù)纳钊肓私狻?/p>

        順便把項目中遇到的一個RichFaces的缺點列出來:

        RichFaces在生成組件的html時,大量使用了Div,曾經(jīng)有過一個頁面有1千多行(在一個table中),頁面上還有一個RichFaces的下拉菜單,從而導(dǎo)致菜單響應(yīng)非常之慢,后來只有將rich:datatable換為普通的html:table,就沒有問題了。

        再看看Seam In Action中總結(jié)的JSF的缺點:

        1、在JSF中初次請求的處理流程太過簡單,而后續(xù)請求則執(zhí)行了完整的復(fù)雜的處理流程。在JSF中假設(shè)第一個調(diào)用應(yīng)該是在頁面被渲染后執(zhí)行,但實際中有時我們需要在第一次請求時就執(zhí)行某些操作。在JSF中缺少象Struts中的Controller。

        2、所有的請求都是POST。瀏覽器處理POST請求是比較草率,當(dāng)用戶執(zhí)行了一個JSF Action操作后,點擊瀏覽器的刷新按鈕時,瀏覽器會詢問用戶是否重新提交,這會令用戶非常困惑。

        3、僅僅擁有簡單基礎(chǔ)的頁面導(dǎo)向機(jī)制。

        4、過度復(fù)雜的生命周期。

        JBossSeam宣稱對于JSF存在的缺點都提供了解決方法,但是有一種更復(fù)雜的感覺。

        在Seam中,生成選擇的項目時,有EAR和WAR的選項,如果選擇了EAR選項,那么Seam會生成四個項目,分別為war、ear、ejb、test四個類型的項目。有一次我將生成的項目從一個目錄拷貝到另一個目錄,切換了Eclipse的workspace,此時問題來了,ejb項目提示編譯錯誤,提示無法找到某些class,找來找去找來找去......后來將項目關(guān)閉了一下,再打開錯誤提示就沒有了。

        由這個問題我忽然想到,使用Seam集成JSF、EJB是不是太重量級了,如果采用EJB作為替代普通的POJO,對于一個小型的項目組來說,一般的規(guī)模就是三至五個人(我個人的理解),開發(fā)人員本來就不多,還要面對Seam劃分的四個項目,好像比較繁瑣,當(dāng)然采用war模式另當(dāng)別論。

        相比較而言,這個星期看了一些Struts2的資料,覺得Struts2的架構(gòu)非常清晰,易于理解。

        翻了很早之前的JavaEye上的一個帖子,提到JSF是面向開發(fā)工具的,如果能做到象VB那樣,就大有前途了,4年過去了,不要提JSF的開發(fā)工具了,就是Java各個方面的GUI開發(fā)工具,又有哪個能和VB相比呢,看來選擇JSF作為一個方向不是一個好選擇........還是及早放棄吧,哎...


        最后我覺得可以用這么一句話可以形容JSF,看起來很美,用起來不爽。

    posted @ 2008-12-25 23:35 The Matrix 閱讀(2329) | 評論 (6)編輯 收藏

    這個事情去年做過一次,不過沒有留下記錄,今天又要做一次,記錄下來,呵呵

    環(huán)境:

    Spring版本為1.2,Tomcat為5.5.26,JDK為Jdk1.5.0_11。

    1、下載Axis1.4,解壓后將其jar文件添加到web項目的lib目錄中。

    2、配置Axis Servlet,在web.xml文件中加入如下信息:

    <servlet>
       
    <servlet-name>AxisServlet</servlet-name>
       
    <servlet-class>
            org.apache.axis.transport.http.AxisServlet
       
    </servlet-class>
    </servlet>

    <servlet-mapping>
       
    <servlet-name>AxisServlet</servlet-name>
       
    <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
       
    <servlet-name>AxisServlet</servlet-name>
       
    <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
       
    <servlet-name>AxisServlet</servlet-name>
       
    <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

     
    3、編寫java類,樣例如下。

    接口:

    public interface InterchangeDataService {
       
    public String getMonthInterchange(String marketDate);
    }

    實現(xiàn)類:

    public class InterchangeDataServiceImpl extends ServletEndpointSupport implements InterchangeDataService {

       
    public InterchangeDataServiceImpl() {
        }

       
    public String getMonthInterchange(String marketDate) {
            
    return "getMonthInterchange";
        }

    }

    注意實現(xiàn)類需要繼承ServletEndpointSupport類,該類是由Spring提供的。


    4、配置service-config.wsdd。

    <?xml version="1.0" encoding="utf-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
        xmlns:java
    ="http://xml.apache.org/axis/wsdd/providers/java">
       
    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
       
    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
       
    <service name="interchangeDataService" provider="java:RPC" style="rpc" use="literal">
           
    <parameter name="wsdlTargetNamespace" value="urn:soap.axisspring"/>
           
    <parameter name="className" value="com.ecgit.eccm.webservice.InterchangeDataServiceImpl"/>
           
    <parameter name="allowedMethods" value="*"/>
       
    </service>
       
    <transport name="http">
           
    <requestFlow>
               
    <handler type="URLMapper"/>
               
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
           
    </requestFlow>
           
    <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
           
    <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
           
    <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
       
    </transport>
       
    <transport name="local">
           
    <responseFlow>
               
    <handler type="LocalResponder"/>
           
    </responseFlow>
       
    </transport>
    </deployment>

     
    5、測試web service服務(wù),代碼如下。

    至項目的WEB-INF目錄下,執(zhí)行如下命令:

    Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/services/interchangeDataService?WSDL

    會在WEB-INF目錄中生成四個JAVA文件,它們分別是:

    • InterchangeDataServiceImpl.java   定義了Web服務(wù)接口,接口中的方法與InterchangeDataService中的方法一致。
    • InterchangeDataServiceImplService.java 定義了用于獲取Web服務(wù)接口的方法。
    • InterchangeDataServiceImplServiceLocator.java 接口InterchangeDataServiceImplService的具體實現(xiàn)。
    • InterchangeDataServiceImplSoapBindingStub.java Web服務(wù)客戶端樁,通過該類與服務(wù)器交互。

    最后編寫一個Main方法,調(diào)用如下方法即可進(jìn)行測試:

    InterchangeDataServiceImplServiceLocator serviceLocator = new InterchangeDataServiceImplServiceLocator();
    InterchangeDataServiceImpl service
    = serviceLocator.getinterchangeDataService();
    String monthSchedule
    = service.getMonthInterchange("2008-05-30");
    posted @ 2008-12-19 17:16 The Matrix 閱讀(3417) | 評論 (1)編輯 收藏

        上次使用Seam自動生成了一個CRUD的例子,后來想還是自己白手起家做一個例子看看,于是開始動手。

        首先使用JBossTools工具生成項目,在生成項目的向?qū)е校绻椖款愋瓦x擇ear,則會生成四個項目,分別對應(yīng)war、ear、ejb、test,覺得這樣太過繁瑣,還是選擇war類型,又想要不使用tomcat作為運行服務(wù)器吧,因為JBoss也不太熟悉。沒想到這一試倒試出問題來了,如果完全使用向?qū)身椖浚x擇tomcat作為運行服務(wù)器,則項目根本無法運行起來,總是提示缺少這個jar,那個jar。好,又換回JBoss,沒問題了。仔細(xì)看了一下,原來在自動生成項目的WebContent/WEB-INF/lib目錄中,只有大概十幾個jar,連Hibernate的jar都沒有,而在JBoss的Server/default/lib目錄下則什么jar都有,怪不得不出錯。

    第一個教訓(xùn):還是先使用JBoss作為運行環(huán)境,等整個Seam都搞熟了,再配一個Tomcat的運行環(huán)境。

        繼續(xù),將原來項目中的一個通用DAO和一個UserService拷貝過來,代碼如下,啟動服務(wù)器報錯。分別為如下錯誤信息:

    第二個錯誤解決:Caused by: java.lang.IllegalArgumentException: @PersistenceContext may only be used on session bean or message driven bean components: genericDao

        既然提示@PersistenceContext只能用在SessionBean中,因為原來的代碼是使用的Spring框架,想了好長時間,在WebContent/WEB-INF/component.xml中看到這么一段,那么是不是通過@In來注入entityManager呢,修改@PersistenceContext為@In,編輯器自動提示沒有發(fā)現(xiàn)名稱為em的Component(這點好像不錯),于是再修改為@In("entityManager") ,重啟服務(wù)器,該問題解決。

    <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{testEntityManagerFactory}"/>

    第三個錯誤解決:Caused by org.jboss.seam.RequiredException with message: "@In attribute requires non-null value: userService.genericDao"

        將UserService中的@In修改為@In(create = true, required = true)解決此問題。

        解決上述幾個問題后,自己的例子終于運行起來了 :-)

        下一篇關(guān)于Seam In Action中對JSF的介紹及Seam如何增強JSF。

    -------------------------------------------------------------------------------------------------

        項目生成的代碼被分為兩個目錄,分別為Action和Model目錄,檢查JBoss中項目部署的目錄,發(fā)覺Action目錄下的代碼編譯生成的class文件被存放至WEB-INF/dev目錄下,Model目錄下的代碼編譯生成的class文件被存放至WEB-INF/classes目錄下,google了一下,發(fā)現(xiàn)在Seam Reference中提到這是Seam的增量式重部署,支持對JavaBean組件的增量重部署,可以加快編輯/編譯/測試的速度。

    代碼如下:

    public interface GenericDao {
        public Object get(Class clazz, Serializable id);
        public
    void save(Object object);
        public
    void update(Object object);
        public
    void remove(Class clazz, Serializable id);
        public
    void remove(Object obj);
       
    }


    @Name("genericDao")
    public class GenericDaoImpl implements GenericDao {
        @PersistenceContext 
    ---->   @In("entityManager")
        private EntityManager em;

        public Object get(Class clazz, Serializable id) {
           
    if (id == nullreturn null;
           
    else return em.find(clazz, id);
        }
       
    }


    public interface UserService {
        public
    void findAllUsers();
    }

    @Name(
    "userService")
    public class UserServiceImpl implements UserService, SecurityUserService {

        @In
    ----> @In(create = true, required = true)
        protected GenericDao genericDao;
        private List
    <User> resultList = null;

        public List
    <User> getResultList() {
           
    if (resultList == null) {
               
    this.findAllUsers();
            }
           
    return resultList;
        }

        public
    void setResultList(List<User> resultList) {
           
    this.resultList = resultList;
        }


        public
    void findAllUsers() {
            String hql
    = "from User order by userCode";
            resultList
    = this.genericDao.query(hql);
        }
    }

    // 實體類
    @Entity
    @Table(name = "USER")
    public class User implements IUser, Serializable {
        // 用戶編碼
        @Id
        private String userCode;

        // 用戶姓名
        private String userName;
    }


    <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
        xmlns:s
    ="http://jboss.com/products/seam/taglib"
        xmlns:ui
    ="http://java.sun.com/jsf/facelets"
        xmlns:f
    ="http://java.sun.com/jsf/core"
        xmlns:h
    ="http://java.sun.com/jsf/html"
        xmlns:rich
    ="http://richfaces.org/rich"
        template
    ="layout/template.xhtml">

    <ui:define name="body">
       
    <rich:panel>
           
    <f:facet name="header">User Search Results</f:facet>
           
    <rich:dataTable id="userServiceTable"
                       
    var="user"
                      value
    ="#{userService.resultList}">
               
    <h:column>
                   
    <f:facet name="header">
                       
    <h:outputText value="UserCode"/>
                   
    </f:facet>
                   
    <h:outputText value="#{user.userCode}"/>
               
    </h:column>
               
    <h:column>
                   
    <f:facet name="header">
                       
    <h:outputText value="UserName"/>
                   
    </f:facet>
                   
    <h:outputText value="#{user.userName}"/>
               
    </h:column>
           
    </rich:dataTable>
          
    </rich:panel>
    </ui:define>
    </ui:composition>

    通過這個實踐,小結(jié)一下:

    1、發(fā)覺Seam確實簡化了JSF開發(fā),但由于它涉及的新東西相對較多,與傳統(tǒng)的SSH走的路線不太一致,還是覺得其學(xué)習(xí)曲線比較陡峭,需要對Seam熟練掌握后(包括開發(fā)環(huán)境的搭建等)才能真正提高開發(fā)效率。

    2、Seam提供了IOC的功能,有時需要跳出Spring,從一個新的角度去審視Seam。

    posted @ 2008-12-18 23:46 The Matrix 閱讀(2165) | 評論 (0)編輯 收藏

        這個星期的后半周主要搞了kettle的試驗,做了兩個例子出來,在后續(xù)工作中這兩個例子應(yīng)該也能派上用場,本來以為kettle的文檔不多,后來單獨下載了kettle的doc壓縮包,發(fā)覺里面的內(nèi)容還是不少的,真要將kettle搞熟的話,這些文檔還是需要仔細(xì)研讀一番的。另外kettle doc解壓后文檔目錄挺奇怪的,都是數(shù)字命名的目錄名,不知有啥具體含義。

        下周的學(xué)習(xí)重點還是要轉(zhuǎn)回到JBoss Seam中了 :-)

    posted @ 2008-12-14 22:13 The Matrix 閱讀(1278) | 評論 (3)編輯 收藏

    需求:

    kettletest1數(shù)據(jù)庫中有table_source數(shù)據(jù)表,結(jié)構(gòu)如下:

    1. Id                主鍵
    2. t_id             數(shù)據(jù)時間
    3. part_id        實例ID
    4. yg               數(shù)據(jù)字段1
    5. wg              數(shù)據(jù)字段2

    該表中的數(shù)據(jù)對于不同的實例ID,一分鐘一條數(shù)據(jù),t_id字段表示數(shù)據(jù)的時間,精確到分鐘。

    kettletest2數(shù)據(jù)庫中有table_target數(shù)據(jù)表,結(jié)構(gòu)如下:

    1. Id                     主鍵
    2. marketdate      數(shù)據(jù)日期,格式為 yyyy-MM-dd
    3. pointtime        時間,格式為 HH:mm
    4. pointnumber   時間的數(shù)字表示,00:01表示為1,00:00表示為1440
    5. plantcode        實例Code
    6. yg                    數(shù)據(jù)字段1
    7. wg                   數(shù)據(jù)字段2

    需定期將table_source表中的數(shù)據(jù)獲取至table_target表中,并進(jìn)行如下處理:

    1、將t_id數(shù)據(jù)時間字段拆分為三個字段,分別為marketdate、pointtime、pointnumber。

            a、marketdate取t_id的日期部分。
            b、pointtime取t_id的時間部分。
            c、pointnumber為時間的數(shù)字表示,等于hour*60+minute。
            d、但當(dāng)t_id的時間為某日的00:00時,需將其轉(zhuǎn)化為24:00,并且marketdate需取日期的前一天。如t_id為2008-12-04 00:00,則marketdate為2008-12-03,pointtime為24:00,pointnumber為1440。

    2、將part_id字段映射為plantcode字段,并根據(jù)如下規(guī)則進(jìn)行轉(zhuǎn)換:
            part_id                 plantcode
             3206                        P01
             3207                        P02
             3208                        P03

    測試中使用的數(shù)據(jù)庫均為mysql數(shù)據(jù)庫。

    實戰(zhàn):

    整個轉(zhuǎn)換工作共分為三個步驟,如下圖:

    job

    1、定義需獲取的數(shù)據(jù)的日期

    trans1

    2、刪除table_target表中已有數(shù)據(jù),注意一定要將“執(zhí)行SQl語句”面板中的“變量替換”要選上,否則SQL語句中的變量不會被替換,我剛開始沒注意到這個地方,找問題找了半天。

    trans2

    3、獲取table_source中的數(shù)據(jù),并將其插入table_target表

    trans3

            3-1、獲取table_source表的數(shù)據(jù)

    trans3-1

            3-2、值映射

    trans3-2

            3-3、字段選擇

    trans3-3

            3-4、對t_id字段進(jìn)行處理,增加了pointnumber字段。在這一步驟中發(fā)現(xiàn)kettle的一個bug,就是不能在JavaScript中使用str2date函數(shù),錯誤的具體信息參見:http://jira.pentaho.com/browse/PDI-1827。這個問題也折騰了好長時間,剛開始怎么也想不通這個函數(shù)使用時怎么會報錯呢,后來只好從字符串中截取年、月、日信息。

           該步驟中還存在另外一個使人困惑的問題,就是點擊“測試腳本”按鈕,會報錯,但是執(zhí)行job和transformation時則不會報錯。

    trans3-4

            3-5、增加pointnumber字段至輸出結(jié)果中

    trans3-5

            3-6、插入數(shù)據(jù)至table_target表

    trans3-6

     

    3-4步驟中的JavaScript代碼如下:

    var pointTimeStr = pointtime.getString();
    var pointnumber = 1;

    if (pointTimeStr == "00:00") {

       
    var marketDateStr = marketdate.getString();
       
    var marketDateYear = substr(marketDateStr, 0, 4);
       
    var marketDateMonth = str2num(substr(marketDateStr, 5, 2))-1;
       
    var marketDateDay = substr(marketDateStr, 8, 2);

       
    var date = new Date();
        date.setYear(marketDateYear);
        date.setMonth(marketDateMonth);
        date.setDate(marketDateDay);

       
    var temp1 = dateAdd(date, "d", -1);
        marketdate.setValue(date2str(temp1,
    "yyyy-MM-dd"));
        pointtime.setValue(
    "24:00");

        pointnumber
    = 1440;
    }
    else {   
       
    var hourStr = pointTimeStr.substr(0, 2);
       
    var hour = str2num(hourStr);
       
    var minuteStr = pointTimeStr.substr(3, 5);
       
    var minute = str2num(minuteStr);
       
        pointnumber
    = hour * 60 + minute;
    }

     

    至此,整個轉(zhuǎn)換工作完成,小結(jié)一下:

        如果對kettle等etl工具比較熟悉的話,使用etl工具進(jìn)行數(shù)據(jù)轉(zhuǎn)換、抽取等事情還是比較方便的,比起寫程序還是有優(yōu)勢的。但是這個轉(zhuǎn)換過程中遇到的kettle的兩個bug比較讓人頭疼,覺得kettle好像還不是很穩(wěn)定。

    posted @ 2008-12-14 21:55 The Matrix 閱讀(34334) | 評論 (5)編輯 收藏

    這個實踐其實不難,主要是有一個地方要注意,就是文件名通配符的寫法,如果文件名格式為“TRANS_yyyymmdd.txt”,如TRANS_20081101.txt。如果想匹配所有以TRANS開頭的文本文件,在kettle中要寫成這樣:TRANS_.*[0-9].txt。

    最后在windows操作系統(tǒng)中配置定時任務(wù)就可以定期執(zhí)行該Job了。

    Job的圖:

    total

    FTP配置信息:

    get ftp config put ftp config

    posted @ 2008-12-12 15:20 The Matrix 閱讀(17070) | 評論 (0)編輯 收藏

    一定要給SQL Server2000打上sp3a補丁,打上補丁后,使用telnet訪問1433端口一切正常。

    另外學(xué)了一個查詢SQL Server版本的語句:select @@version

    posted @ 2008-12-12 12:07 The Matrix 閱讀(1447) | 評論 (1)編輯 收藏

    DATE_FORMAT(date,format)
    根據(jù)format字符串格式化date值。下列修飾符可以被用在format字符串中: %M 月名字(January……December)
    %W 星期名字(Sunday……Saturday)
    %D 有英語前綴的月份的日期(1st, 2nd, 3rd, 等等。)
    %Y 年, 數(shù)字, 4 位
    %y 年, 數(shù)字, 2 位
    %a 縮寫的星期名字(Sun……Sat)
    %d 月份中的天數(shù), 數(shù)字(00……31)
    %e 月份中的天數(shù), 數(shù)字(0……31)
    %m 月, 數(shù)字(01……12)
    %c 月, 數(shù)字(1……12)
    %b 縮寫的月份名字(Jan……Dec)
    %j 一年中的天數(shù)(001……366)
    %H 小時(00……23)
    %k 小時(0……23)
    %h 小時(01……12)
    %I 小時(01……12)
    %l 小時(1……12)
    %i 分鐘, 數(shù)字(00……59)
    %r 時間,12 小時(hh:mm:ss [AP]M)
    %T 時間,24 小時(hh:mm:ss)
    %S 秒(00……59)
    %s 秒(00……59)
    %p AM或PM
    %w 一個星期中的天數(shù)(0=Sunday ……6=Saturday )
    %U 星期(0……52), 這里星期天是星期的第一天
    %u 星期(0……52), 這里星期一是星期的第一天
    %% 一個文字“%”。

    posted @ 2008-12-10 09:18 The Matrix 閱讀(738) | 評論 (0)編輯 收藏

            看了Seam的例子,也看了Seam的簡介,禁不住手癢,還是先做一個例子吧,遵照《seam_reference》第三章中的指導(dǎo),使用JBossTool生成了自己的第一個例子,過程如下:

    1、生成Sem web項目

    step1

    2、輸入項目的相關(guān)信息,如下圖:

    step2

          注意,如果是第一次使用Eclipse,需要配置Target Runtime和Target Server。

    3、然后一路next,到最后一步時,如果是第一次使用,也要注意配置Seam Runtime和Connection Profile,如下圖。最后點擊finish按鈕,即可創(chuàng)建Seam項目。

    step3

    4、生成項目后,在Eclipse中共出現(xiàn)了四個項目,如下:

    • seamfirst (web項目)
    • seamfirst-ear (ear項目,集成web和ejb)
    • seamfirst-jar (ejb項目)
    • seamfirst-test (測試項目,進(jìn)行單元測試)

          此時運行JBossServer服務(wù)器,訪問http://localhost:8080/seamfirst鏈接,出現(xiàn)如下圖頁面,此時Seam幫我們生成了一個框架,包含了基本的登錄和退出功能,還有一個首頁。

    step5

    5、繼續(xù)!使用Seam生成單表的CRUD操作。本步驟前提,有一個mysql數(shù)據(jù)庫,數(shù)據(jù)庫中有一個Customer表,該表有ID(int類型)、customername(varchar2類型)、customerdesc(varchar2類型)、createdate(date類型)、email(varchar2類型)五個字段。在seamfirst項目上點擊右鍵,選擇Seam Generate Entities菜單,彈出界面如下圖:

    step6

    step7

          單擊finish按鈕后,再運行JBoss Server服務(wù)器,訪問http://localhost:8080/seamfirst,發(fā)覺菜單欄上多了一個Customer List菜單,單擊此鏈接,即可進(jìn)行Customer的添加、刪除、修改、查詢操作,雖然生成的界面不是很好看,也不是很符合我自己的操作習(xí)慣,但是功能倒是完備。

          以后若是修改了Seam提供的代碼自動生成的模板,然后再使用該功能,想必生成的頁面就符合自己的項目要求了,記下一筆,先不管它。

     

    生成的代碼分析:

    生成的代碼主要有兩部分,一部分為Java代碼,一部分為頁面代碼。

    Java代碼包括如下三個類:

    • Customer.java ---- 實體類,映射到數(shù)據(jù)庫中的Customer表。
    • CustomerHome.java ---- SessionBean,提供了Customer類的創(chuàng)建、更新、刪除功能。繼承了org.jboss.seam.framework.EntityHome類,EntityHome類中提供創(chuàng)建、更新、刪除等基本功能。
    • CustomerList.java ---- SessionBean,提供了Customer類的查詢功能。繼承了org.jboss.seam.framework.EntityQuery類,EntityQuery類中提供了查詢功能。

          CustomerHome和CustomerList類中都使用了@Name annotation,這樣在頁面中就可以直接訪問Session Bean中的方法了,達(dá)到了Seam將表現(xiàn)層和業(yè)務(wù)層直接融合的目標(biāo)。

    頁面代碼包括如下文件:

    • Customer.xhtml
    • Customer.page.xml
    • CustomerEdit.xhtml
    • CustomerEdit.page.xml
    • CustomerList.xhtml
    • CustomerList.page.xml

          剛開始看這段代碼時,困惑我的有兩個地方

    • 一個是CustomerList.xhtml中rich:dataTable的value為"#{customerList.resultList}",customerList我明白指的是CustomerList SessionBean,但是我看遍了其代碼,也沒有發(fā)現(xiàn)有resultList屬性,后來仔細(xì)一看,才發(fā)覺該屬性在其父類EntityQuery中。
    • 另一個是每一個xhtml文件都有一個對應(yīng)的page.xml文件,想了半天也沒整明白這是怎么回事,后來只好繼續(xù)看Seam in Action的第三章,看著看著終于明白了,原來這是Seam對JSF的一個擴(kuò)展,增強了JSF的功能,具體含義后面詳細(xì)解釋。

    至此第一個使用JBossTools生成的Seam例子完成了,好像很簡單 :-)

    posted @ 2008-12-09 22:40 The Matrix 閱讀(2137) | 評論 (1)編輯 收藏

    需求:Oracle的數(shù)據(jù)庫文件都存放在C盤,由于數(shù)據(jù)文件越來越大,所以想把一些數(shù)據(jù)文件移至D盤

    環(huán)境:Oracle9i

    操作步驟:

    1. sqlplus /nolog
    2. connect / as sysdba;
    3. shutdown immediate;
    4. startup mount;
    5. alter database rename file 'c:\ora92\oradata\trans\trans.dbf' to 'd:\ora92\oradata\trans\trans.dbf';
    6. alter database open;
    注意點:
    • temp表空間的數(shù)據(jù)文件不能移動

     

    附Oracle的幾種啟動方式

    1、startup nomount

      非安裝啟動,這種方式啟動下可執(zhí)行:重建控制文件、重建數(shù)據(jù)庫。

      讀取init.ora文件,啟動instance,即啟動SGA和后臺進(jìn)程,這種啟動只需要init.ora文件。

    2、startup mount dbname

      安裝啟動,這種方式啟動下可執(zhí)行:數(shù)據(jù)庫日志歸檔、數(shù)據(jù)庫介質(zhì)恢復(fù)、使數(shù)據(jù)文件聯(lián)機(jī)或脫機(jī)、重新定位數(shù)據(jù)文件、重做日志文件。

      執(zhí)行“nomount”,然后打開控制文件,確認(rèn)數(shù)據(jù)文件和聯(lián)機(jī)日志文件的位置,但此時不對數(shù)據(jù)文件和日志文件進(jìn)行校驗檢查。

    3、startup open dbname

      先執(zhí)行“nomount”,然后執(zhí)行“mount”,再打開包括Redo log文件在內(nèi)的所有數(shù)據(jù)庫文件,這種方式下可訪問數(shù)據(jù)庫中的數(shù)據(jù)。

    4、startup,等于以下三個命令

      startup nomount

      alter database mount

      alter database open

    posted @ 2008-12-09 10:16 The Matrix 閱讀(2769) | 評論 (1)編輯 收藏

    用JBossTools生成項目,生成CRUD的代碼,然后訪問就報了如下異常:

    Exception during request processing:

    Caused by java.lang.IllegalStateException with message: "No phase id bound to current thread (make sure you do not have two SeamPhaseListener instances installed)"

    org.jboss.seam.contexts.PageContext.getPhaseId(PageContext.java:163)
    org.jboss.seam.contexts.PageContext.isBeforeInvokeApplicationPhase(PageContext.java:175)
    org.jboss.seam.contexts.PageContext.getCurrentWritableMap(PageContext.java:91)
    org.jboss.seam.contexts.PageContext.remove(PageContext.java:105)
    org.jboss.seam.Component.newInstance(Component.java:2102)
    org.jboss.seam.Component.getInstance(Component.java:1987)
    org.jboss.seam.Component.getInstance(Component.java:1966)
    org.jboss.seam.Component.getInstance(Component.java:1960)
    org.jboss.seam.Component.getInstance(Component.java:1933)
    org.jboss.seam.Component.getInstance(Component.java:1928)
    org.jboss.seam.faces.FacesPage.instance(FacesPage.java:92)
    org.jboss.seam.core.ConversationPropagation.restorePageContextConversationId(ConversationPropagation.java:84)
    org.jboss.seam.core.ConversationPropagation.restoreConversationId(ConversationPropagation.java:57)
    org.jboss.seam.jsf.SeamPhaseListener.afterRestoreView(SeamPhaseListener.java:389)
    org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:228)
    org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:194)
    com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
    com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:104)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
    org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:38)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:177)
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:267)
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:380)
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:507)
    org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:54)
    org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
    org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    java.lang.Thread.run(Thread.java:619)
    Google了一下,有人講是JBoss4.2.3GA版本的BUG,趕緊下載了JBoss4.2.2GA,再測試一切正常!
    不知還會不會有其它莫名的BUG了......
    posted @ 2008-12-07 22:03 The Matrix 閱讀(1029) | 評論 (0)編輯 收藏

            把環(huán)境配好之后,Seam的例子也運行起來了,看了seam_reference第一章中如下幾個例子講解:

    • the registration example
    • the messages example
    • the todo list example
    • the numberguess example

            又在滿江紅的網(wǎng)站上找了seam_reference2.0的中文文檔,主要看了《the contextual component model》一章,看完以后感覺Seam最核心的地方就是其contextual component model了,不過看完這一章以后只是對Seam有個大概的了解,對其具體的內(nèi)容,細(xì)節(jié)還缺乏進(jìn)一步的了解,對其優(yōu)點、缺點也缺乏進(jìn)一步的認(rèn)識。

            然后又找到了《Seam in Action》的電子書,看了一點之后還是覺得這本電子書寫得好,內(nèi)容組織的很好,不象seam_reference后面的章節(jié)僅僅是羅列seam的各項功能。

            今天把Seam in Action的第一章草草看了一遍,將第一章講述的內(nèi)容總結(jié)如下:

    1、什么是Seam

            在Seam in Action中,沒有將Seam稱之為web framework,而是將其稱為application stack。Seam將Java EE中的EJB3、JSF、JPA/Hibernate、JAAS等技術(shù)融合在一起,提供了更容易使用的方式,比如conversation、page flows、buisness precesses、rule-based security、JavaScript(Ajax) remoting、PDF rendering、email組合、charting、file uploads、Groovy integration等,用以簡化web開發(fā)。

    2、Seam的目標(biāo)

            簡化web開發(fā)

    3、Seam如何集成各類技術(shù)

        selected Seam集成了JSF、JPA和POJO Component

    selected1 在Seam中將EJB3.0中的Session Bean作為JSF的managed bean,直接將表現(xiàn)層和業(yè)務(wù)層銜接在一起,使得Session Bean可以直接訪問web相關(guān)數(shù)據(jù),比如request、session、application、JSF的FacesMessage、Component Tree等。而在不使用Seam時,一般都是使用JSF back bean來作為表現(xiàn)層和業(yè)務(wù)層之間的中介。

    selected1 使用annotation中的@Name標(biāo)注替代了JSF的faces-config.xml中關(guān)于managed bean的配置。

    selected1 Seam不一定必須使用EJB和JPA,也可以使用POJO、Hibernate作為替代。如下圖:

    seam 

        selected 上下文相關(guān)的組件模型(Seam中的核心概念)

    selected1 Seam提供了7種類型的上下文,其中屬于Seam特有的兩種上下文類型分別為:Conversation Context、Business process Context。

    selected1 Seam提供了統(tǒng)一的組件注冊、annotation、異常配置、方法攔截、統(tǒng)一的EL表達(dá)式等功能。其中Seam對其管理的組件攔截過程如下圖:

    seam1

    4、Seam的核心競爭力

        selected 更好的JSF

    selected1 增強的JSF

    • Seam對JSF最被認(rèn)可的改進(jìn)就是消除了在配置文件中聲明managed bean。
    • Prerender page actions
    • Managed request parameters (for a given page)
    • Intelligent stateless and stateful navigation
    • Transparent JSF data model and data model selection handling
    • Fine-grained exception handling
    • Page-level security (per view ID)
    • 基于Annotation的表單驗證
    • Bookmarkable command links (solving the “everything is a POST” problem)
    • Entity converter for pick lists
    • Conversation controls
    • Support for preventing lazy initialization exceptions and nontransactional data access in the view

    selected1 消除了連接Bean(ELIMINATING CONNECTOR BEANS)

          用一幅圖可以很好的說明這句話的含義

    seam2

    selected1 引入了有狀態(tài)的變量范圍(INTRODUCING STATEFUL VARIABLE SCOPES)

    seam3

    selected1 擴(kuò)展的Persistence Context

          Spring中提供了The Session In View Filter,使得persistence manage可以在一個請求中存在,避免了常見的LazyInitializationException。在Seam中,擴(kuò)展的Persistence Context可以跨越多個請求。其實擴(kuò)展的Persistence Context是Conversation Context、Business Process Context的基礎(chǔ)。

        selected get rich quick

            Seam提供了兩種方式將Ajax集成到Seam應(yīng)用中,一種是使用具有Ajax特性的JSF組件,如RichFaces和ICEFaces,另一種是可以在瀏覽器中使用JavaScript直接調(diào)用服務(wù)端的組件。

            Seam還提供了另外一種意義上的Rich,即將PDF、mail等功能集成到Seam應(yīng)用中。

        selected 提供了一個快速開發(fā)環(huán)境

    selected1 代碼自動生成

    selected1 熱部署

    selected1 Seam調(diào)試頁面

    selected1 不部署即可以進(jìn)行單元測試

            

    從目前我個人的理解來看,Seam的作用與能力如下:

    • Seam將EJB3與JSF整合在一起,消除了JSF與業(yè)務(wù)代碼之間的間隙,直接將表現(xiàn)層與業(yè)務(wù)層銜接在一起
    • Seam提出了Conversation Context的概念,將Stateful EJB引入到web開發(fā)中,直接與Conversation Context對應(yīng)
    • Seam提供了與Jbpm、itext、mail等一系列開源框架的整合,對于需要使用的相關(guān)功能的用戶來說,提供了便利性
    • 提供了開發(fā)工具的整合(Seam Gen與IDE),還可以自動生成部分代碼

            但由于Seam整合了如此多的框架,帶來的一個最大的缺點:學(xué)習(xí)曲線陡峭,在SSH非常流行的今天,需要面對很多新技術(shù)(JSF、EJB3、JPA等),對于一個新手來說難度比較大,如果想使Seam被更多的開發(fā)人員使用,必須加強它的文檔,目前的文檔還是太少了。

    posted @ 2008-12-06 23:51 The Matrix 閱讀(2283) | 評論 (0)編輯 收藏

            今天早上在網(wǎng)上看到了kettle發(fā)布了最新的版本,忽然想起最近其實做了不少工作應(yīng)該是ETL工具的拿手好戲,趕緊下載下來看看,看是否能夠在實際的工作中應(yīng)用起來。

            順便講一下,為啥看到kettle會兩眼發(fā)光。

            最近寫了好幾個小程序,用于從一個ftp去獲取數(shù)據(jù),然后轉(zhuǎn)發(fā)至另一個ftp去,或者是從一個數(shù)據(jù)庫獲取數(shù)據(jù)然后保存至本地的數(shù)據(jù)庫中,使用的是jdk中的Timer實現(xiàn)的定時調(diào)度,本來也沒什么問題,連續(xù)運行幾個月都不會出錯。

            可是最近網(wǎng)絡(luò)不是太好,周期性抽風(fēng),ping包時,每5分鐘大概會丟7-8個包,從而導(dǎo)致程序也會假死,過一段時間后就不正常干活了,估計是因為用了數(shù)據(jù)庫連接池的問題,要是每次發(fā)起數(shù)據(jù)庫連接可能就不會有問題了,偷懶也不想改了,因為網(wǎng)絡(luò)最終肯定是會修好的 :-) 但是想試試ETL工具,因為后面還有一些類似的東西要處理,不想寫代碼了,用別人的輪子感覺比較好,呵呵

            首先下載了kettle的最新版,kettle3.1,解壓后即可運行,一般的開發(fā)人員稍微摸索一下,看看例子簡單的轉(zhuǎn)換還是會做的,今天小試了一把,有幾個注意點記下來。

    1. 使用資源庫(repository)登錄時,默認(rèn)的用戶名和密碼是admin/admin
    2. 當(dāng)job是存放在資源庫(一般資源庫都使用數(shù)據(jù)庫)中時,使用Kitchen.bat執(zhí)行job時,需使用如下的命令行:
      Kitchen.bat /rep kettle /user admin /pass admin /job job名
    3. 當(dāng)job沒有存放在資源庫而存放在文件系統(tǒng)時,使用Kitchen.bat執(zhí)行job時,需使用如下的命令行:
      Kitchen.bat /norep /file user-transfer-job.kjb
    4. 可以使用命令行執(zhí)行job后,就可以使用windows或linux的任務(wù)調(diào)度來定時執(zhí)行任務(wù)了

            在一開始使用命令行方式執(zhí)行job時,總是報如下的錯誤,琢磨了好長時間總算整明白正確的方式了。

    Unexpected error during transformation metadata load
    No repository defined!

            下一步準(zhǔn)備按照實際情況定制Job,做好了再寫小結(jié)。

    posted @ 2008-12-04 22:48 The Matrix 閱讀(10360) | 評論 (13)編輯 收藏

            JBoss Envers目的是根據(jù)對實體的設(shè)置,提供記錄執(zhí)行數(shù)據(jù)變更歷史的功能(數(shù)據(jù)變更版本)。Envers的配置非常簡單,如果需要對某個實例進(jìn)行歷史數(shù)據(jù)版本記錄,只需要在實例上配置@Versioned annotation即可。針對每個實體的版本的歷史數(shù)據(jù),Envers都會創(chuàng)建一個單獨的數(shù)據(jù)表進(jìn)行存儲。

            目前Envers支持Hibernate和Hibernate-entitymanager(JPA實現(xiàn)).

            這個特點在需要對歷史數(shù)據(jù)進(jìn)行存檔時很實用,而且目前Envers已經(jīng)合并到Hibernate的新版本中去了,使用起來更方便,具體Hibernate哪個不太清楚。

            留個印記..............

    posted @ 2008-12-04 09:04 The Matrix 閱讀(298) | 評論 (0)編輯 收藏

    準(zhǔn)備深入學(xué)習(xí)JBossSeam,好好研究研究,具體學(xué)習(xí)路線基本遵循jboss-seam-2.1.1.CR1中的<<seam_reference.pdf>>。

    學(xué)習(xí)JBossSeam之前最好對相關(guān)技術(shù)有一定的了解,比如:

    • JSF
    • EJB3.0
    • JPA

    然后下載相關(guān)的軟件,如下:

    • jboss-seam-2.1.1.CR1
    • jboss-4.2.3.GA
    • JBossTools-3.0.0.Beta1-R200810311334-ALL-win32(開發(fā)環(huán)境)
    • eclipse-jee-ganymede-SR1-win32(開發(fā)環(huán)境)
    • apache-ant-1.7.0
    • jdk1.6.0_06

    環(huán)境的配置都比較簡單,基本都是解壓即可,有如下注意事項:

    • 在系統(tǒng)的環(huán)境變量中設(shè)置JAVA_HOME、ANT_HOME
    • JBossTools解壓后需拷貝至eclipse解壓后的目錄中。
    • jboss-seam-2.1.1.CR1解壓后,需設(shè)置其bulid目錄下的default.build.properties文件中的jboss.home為JBOSS_HOME(假定為jboss-4.2.3GA的安裝目錄)。

    上述配置好后,啟動JBoss Server,然后至SEAM_HOME(假定為Seam的安裝目錄)/examples/registration目錄下,運行ant explode命令,即可編譯部署registration應(yīng)用至JBoss Server中,最后訪問:http://localhost:8080/seam-registration 即可體驗Seam提供的第一個example程序 :-)

    posted @ 2008-12-03 23:03 The Matrix 閱讀(964) | 評論 (0)編輯 收藏

    考核系統(tǒng)快結(jié)束了,將此項目的經(jīng)歷回憶如下,也小結(jié)一下,先談這個項目中值得提倡的地方

    1、在開發(fā)之前進(jìn)行了完整的需求分析,形成了系統(tǒng)的需求文檔,需求文檔中最有用的部分感覺就是界面原型,還有系統(tǒng)的菜單,這樣給了用戶一個初步的直觀的印象,同時文檔中的一些對于界面原型的描述以及計算規(guī)則等內(nèi)容在后期的開發(fā)中也起了指導(dǎo)作用。

    2、在需求分析完成之后,進(jìn)行了概要設(shè)計,包括完整的數(shù)據(jù)庫設(shè)計,這樣在后期的開發(fā)中對數(shù)據(jù)庫表結(jié)構(gòu)方面沒有大的修改了,只是添加了一些表和視圖。

    再談?wù)?font color="#0080ff">項目中的缺點吧:

    1、首先就說說需求文檔,雖說需求文檔寫了很多,大概有100頁左右(word),但由于一篇文檔中集中的內(nèi)容太多,對于用戶來說只是關(guān)注了界面原型,系統(tǒng)菜單等部分,對于其它內(nèi)容用戶關(guān)注度不高;同時由于篇幅太大,開發(fā)人員打開查看或者后續(xù)修改也比較麻煩。

    對于以后的需求文檔是否可以這樣編寫:首先有一個正文,正文中包括大綱,然后將每一個具體的需求放在單獨的一個文檔中,最好能類似html鏈接那樣,這樣查看也方便,也一目了然。

    原來用RobotHelp寫過幫助,照此看來,豈不可以用來寫需求文檔了,呵呵

    2、再說數(shù)據(jù)庫設(shè)計,還不夠細(xì)致,很多應(yīng)用場景由于設(shè)計的不夠細(xì)致,導(dǎo)致數(shù)據(jù)庫表也有所欠缺,因此對于以后的項目設(shè)計有兩個注意點:

    a、加強應(yīng)用場景設(shè)計,具體可以用流程圖,甚至序列圖描述清晰的業(yè)務(wù)流程,完善數(shù)據(jù)庫表設(shè)計。

    b、要求一定先修改模型(這里指PowerDesigner中的數(shù)據(jù)庫設(shè)計),然后再去修改POJO類等具體代碼,最好不要先改代碼,再修改模型,這樣難免會有遺漏,時間久了,就會導(dǎo)致模型和代碼的不一致,慢慢的,模型文檔就沒有人看,也沒有人維護(hù)了。

    c、順便提一下,模型文檔的好處一是方便后來者,二是可以方便的導(dǎo)出數(shù)據(jù)字典。

    3、對于命名規(guī)范沒有在開發(fā)前考慮全面,雖然在開發(fā)前對命名規(guī)范有一定的規(guī)定,但是不夠全面,造成了后期開發(fā)中各人各人的命名有所偏差。

    4、分層架構(gòu)中的dao層和service層處理的不夠好,導(dǎo)致service層實際上是混雜了dao和service的功能,業(yè)務(wù)代碼不夠清晰。以后的項目考慮dao就是dao,提供數(shù)據(jù)訪問的操作,service層則提供業(yè)務(wù)處理方法,service與dao的關(guān)系應(yīng)該是多對多的關(guān)系。

    5、考核系統(tǒng)中使用了JSF/Richfaces做為表現(xiàn)層,好像不太好使,經(jīng)常會出現(xiàn)多次重復(fù)訪問方法的問題,后續(xù)還需要加強對JSF的學(xué)習(xí),避免類似問題。另外Richfaces在生成大數(shù)據(jù)量的頁面時,一個表格有1440行數(shù)據(jù),頁面巨慢無比:(,后來沒有使用RichaFaces的表格,直接使用jstl+html標(biāo)簽,速度倒是很快。

    6、項目中的日志輸出、異常處理不夠明晰,這個和命名規(guī)范一樣應(yīng)該在項目開始時給出清晰的思路,在具體開發(fā)中應(yīng)該經(jīng)常檢查。

    posted @ 2008-12-03 19:50 The Matrix 閱讀(1025) | 評論 (0)編輯 收藏

    具體內(nèi)容參見如下鏈接:

    http://www.javaworld.com.tw/roller/ingramchen/entry/2005_9_20_JBossSeamKingofStateful_

    posted @ 2008-12-03 13:11 The Matrix 閱讀(633) | 評論 (0)編輯 收藏

    今天在http://refcardz.dzone.com/上下載了《Getting Started with Hibernate Search》,乍一看標(biāo)題,以為是講如何使用Hibernate進(jìn)行查詢操作什么的,下載好以后打開一看,原來是Hibernate集成了lucene,用來對自己的數(shù)據(jù)庫進(jìn)行全文檢索,真是厲害!

    沒有仔細(xì)研究具體內(nèi)容,先記下一筆,日后有時間時,可以實踐一把。

    posted @ 2008-12-01 12:59 The Matrix 閱讀(465) | 評論 (0)編輯 收藏

        Template設(shè)計模式主要適用于需要按一定的步驟執(zhí)行的場合,但有的步驟在不同的場合執(zhí)行的內(nèi)容有不相同。如下類圖中的TemplateClass中的execute()方法會按照如下的順序進(jìn)行調(diào)用:

    public void execute() {
        step1();
        step2();
    }

        但由于step1在不同的場合執(zhí)行的內(nèi)容不一樣,此時就將step1設(shè)為抽象方法,在TemplateConcreteClass1和TemplateConcreteClass2中分別實現(xiàn),這樣就形成了Template設(shè)計模式,step1()方法也稱為模板方式。

        類圖如下:

        TemplateClassDiagram

    posted @ 2008-11-29 22:54 The Matrix 閱讀(809) | 評論 (0)編輯 收藏

    1、在菜單中選擇“Weblog”,然后選擇“Another Weblog Service”。
    2、在Weblog Homepage URL中輸入你的Blog主頁地址。
    3、輸入用戶名與密碼。
    4、在“Type of  weblog that you are using”中選擇“Custom(Metaweblog API)”。
    5、“Remote posting URL for your weblog”中輸入“http://www.cnblogs.com/用戶名/services/metaweblog.aspx”。

    posted @ 2008-11-28 22:56 The Matrix 閱讀(230) | 評論 (0)編輯 收藏
    具體過程參見:http://coenraets.org/flex-spring/

    簡要描述一下:
    1、首先要繼承FlexFactory,實現(xiàn)Spring與Flex的集成,上文中已經(jīng)提供了具體實現(xiàn),下載即可。

    2、在web.xml中配置Spring,如下:
       
        <context-param>
            
    <param-name>contextConfigLocation</param-name>
            
    <param-value>/WEB-INF/applicationContext.xml</param-value>
        
    </context-param>

        
    <listener>
            
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        
    </listener>

    3、在service-config.xml配置文件中添加
       
        <factories>
            
    <factory id="spring" class="flex.samples.factories.SpringFactory"/>
        
    </factories>

    4、修改remote-config.xml中原有的destination配置,原為:
           
        <properties>      
            <
    source>com.bluesky.flexpsp.PsPDataService</source>
       
    </properties>
        修改為:
        <properties>
            
    <factory>spring</factory><!-- spring為第三步中的factoryID-->
            
    <source>pspDataService</source><!-- pspDataService為bean的id -->
        
    </properties>

          
    posted @ 2008-08-09 23:58 The Matrix 閱讀(846) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲成av人在片观看| 美女被免费视频网站a| 久99久精品免费视频热77| 国产亚洲色视频在线| 视频一区在线免费观看| 特级淫片国产免费高清视频| 亚洲18在线天美| 免费观看国产网址你懂的| 亚洲国产美国国产综合一区二区| GOGOGO免费观看国语| 亚洲精品A在线观看| 午夜亚洲乱码伦小说区69堂| 日韩在线视频免费看| 亚洲日本中文字幕天天更新| 亚洲精品动漫免费二区| 亚洲免费人成视频观看| 午夜国产精品免费观看| 亚洲国产理论片在线播放| 国产精品成人观看视频免费| 亚洲高清无在码在线无弹窗| 99re免费99re在线视频手机版| 久久丫精品国产亚洲av| 最近2019中文字幕免费直播 | 亚洲日韩欧洲无码av夜夜摸| 亚洲成aⅴ人片在线观| 欧洲精品99毛片免费高清观看| 亚洲国产一区国产亚洲 | 亚洲AⅤ永久无码精品AA| 精品亚洲福利一区二区| 免费在线看片网站| 九九久久精品国产免费看小说| 亚洲日韩精品无码专区网站| 皇色在线免费视频| 精品国产亚洲一区二区三区| 久草免费手机视频| 亚洲美女一区二区三区| 国产免费丝袜调教视频| 亚洲偷偷自拍高清| 日韩免费高清视频| 免费精品国自产拍在线播放| 浮力影院亚洲国产第一页|