<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年12月4日
    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 閱讀(5192) | 評論 (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)行安裝。同時(shí)使用該功能安裝"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啟動(dòng)httpd和mysqld服務(wù)。可以通過service httpd restart重啟相關(guān)服務(wù)。
        此時(shí)訪問本機(jī)的http://localhost可以看到apache的歡迎界面,同時(shí)編輯index.php文件,其內(nèi)容如下:
        <?php
            phpinfo();
        ?>
        并將該文件置于/var/www/html目錄下,訪問http://localhost/index.php,此時(shí)應(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>
        此時(shí)訪問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
        此時(shí)訪問http://localhost/magento,可根據(jù)magento的設(shè)置進(jìn)行配置
       
        注意如下問題:
        1、確保當(dāng)前用戶擁有對/var/www/smallfive/magento可讀可寫權(quán)限
        2、還需安裝mcrypt庫,安裝這個(gè)庫比較繁瑣,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、將上述兩個(gè)下載后,分別解壓,并執(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 閱讀(3131) | 評論 (1)編輯 收藏
    有時(shí)在vmware里面安裝的系統(tǒng)或應(yīng)用有License時(shí)間的限制,可以通過修改虛擬機(jī)時(shí)間的方法來防止過期,此時(shí)需在.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ī)啟動(dòng)后的時(shí)間。數(shù)字是自1970年1月1日零時(shí)零分零秒以來的秒數(shù),可以通過如下網(wǎng)址將某個(gè)時(shí)間轉(zhuǎn)換為該數(shù)字(Unix時(shí)間戳):http://www.onlineconversion.com/unix_time.htm

    注意:同時(shí)還需在虛擬機(jī)操作系統(tǒng)的服務(wù)中,停用“VMware Tools Service”的服務(wù)。
    在Windows Server 2003中操作系統(tǒng)自身也有時(shí)間同步功能,需在時(shí)間設(shè)定中停用,同時(shí)停用“Windows Timer”服務(wù)。
    posted @ 2012-03-02 10:51 The Matrix 閱讀(8684) | 評論 (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 閱讀(657) | 評論 (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角色時(shí),此時(shí)connect 角色中有一個(gè) UNLIMITED TABLESPACE 權(quán)限,也就是username這個(gè)用戶可以在其他表空間里隨意建表。
    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ù)時(shí)Ruby會(huì)提示連接有問題
        在安裝完MySQL后,先不要進(jìn)行配置,至“MySQL安裝路徑\bin”目錄下,修改MySQLInstanceConfig.exe為“以管理員成分執(zhí)行此程序”,“以兼容模式運(yùn)行該程序”
        進(jìn)行數(shù)據(jù)庫配置時(shí),選擇字符集為utf8

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

    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、運(yùn)行
    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提供一個(gè)安裝Ruby程序?yàn)榉?wù)的包:mongrel_service。安裝其實(shí)很簡單,運(yùn)行: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窗口時(shí),需要輸入cmd后,不是直接按Enter,而是按 Ctrl+Shift+Enter打開Cmd窗口,此時(shí)以管理員身份打開,否則安裝為服務(wù)時(shí)會(huì)提示拒絕訪問。

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

    OK!
    posted @ 2011-05-20 10:25 The Matrix 閱讀(2790) | 評論 (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ì)研究,先把項(xiàng)目地址記下:http://arshaw.com/fullcalendar/

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

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

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

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

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

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

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

    寫了幾點(diǎn),也作為對自己的鞭策。

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

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

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

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

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

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

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

    6、《UML彩色建模》

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

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

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

    10、《軟件隨想錄》

    11、《走出軟件作坊》

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

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

    2010年-我的讀書年!

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

    摘自《軟件隨想錄》

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

    【創(chuàng)造一個(gè)有使用價(jià)值的軟件,你必須時(shí)時(shí)刻刻都在奮斗,每一次的修補(bǔ),每一個(gè)功能,每一處小小的改進(jìn),你都在奮斗,目的只是為了再多創(chuàng)造一點(diǎn)空間,可以再多吸引一個(gè)用戶加入。沒有捷徑可走。你需要一點(diǎn)運(yùn)氣,但是這不取決于你是否幸運(yùn)。你之所以會(huì)有好運(yùn)氣,那是因?yàn)槟愦缤帘貭帯?/p>

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

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

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

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

    就是在這個(gè)時(shí)候,你意識到這是一個(gè)優(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方式實(shí)現(xiàn)state的切換有了很大改進(jìn),使用起來更方便,具體可參見下文:

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

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

    開發(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上看到的一幅圖,覺得不錯(cuò),基本涵蓋了IT人員需要掌握的基礎(chǔ)知識這塊,從這幅圖中可以看出語言并不重要,關(guān)鍵是要搞明白整個(gè)環(huán)節(jié),這樣遇到任何問題就能有目的、有方法的學(xué)習(xí)了。

    計(jì)算機(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)用的時(shí)候遇到了問題,創(chuàng)建數(shù)據(jù)后數(shù)據(jù)庫中有數(shù)據(jù),但是到Listing posts界面無法查看,總是報(bào)錯(cuò)。

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

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

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

     

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

     

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

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

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

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

        很久以前沒有Hibernate的時(shí)候:

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

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

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

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

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

     

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

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

       說了這么多,最終只是想說明白這么一句:用恰當(dāng)?shù)募夹g(shù)做恰當(dāng)?shù)氖虑椋@真是一個(gè)艱難的選擇……,至于未來,更是迷茫,因?yàn)槲覀冎皇歉S者,而不是領(lǐng)導(dǎo)者。

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

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

    1、適合的讀者

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

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

    2、書評:

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

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

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

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

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

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

    暫時(shí)用不到這個(gè)工具,記錄留待備查。

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

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

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

    Hibernate的緩存分為:

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

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

    • @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

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

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

    另外還有如下注意事項(xiàng):

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

    query.setCacheable(true);

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

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

    2、還有就是查詢緩存的查詢執(zhí)行后,會(huì)將查詢結(jié)果放入二級緩存中,但是放入的形式是以ID為Key,實(shí)例作為一個(gè)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 閱讀(10137) | 評論 (3)編輯 收藏
         摘要:     前段時(shí)間對Spring的事務(wù)配置做了比較深入的研究,在此之間對Spring的事務(wù)配置雖說也配置過,但是一直沒有一個(gè)清楚的認(rèn)識。通過這次的學(xué)習(xí)發(fā)覺Spring的事務(wù)配置只要把思路理清,還是比較好掌握的。     總結(jié)如下:     Spring配置文件中關(guān)于事務(wù)配置總是由三個(gè)組成部分,分別是Data...  閱讀全文
    posted @ 2009-04-05 16:38 The Matrix 閱讀(332572) | 評論 (85)編輯 收藏

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

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

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

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

    唯一的缺點(diǎn):

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

     

    隨便畫了一個(gè)圖,如下:

    temp

     

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

    http://wireframesketcher.com/index.html

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

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

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

    <?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)編輯 收藏

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

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

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

      簡要使用說明:

      1、開發(fā)環(huán)境+運(yù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、將項(xiàng)目導(dǎo)入Eclipse后,運(yùn)行Tomcat(此過程就不詳細(xì)描述了)。

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

     

      存在問題如下:

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

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

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

      4、很多界面的輸入信息校驗(yàn)沒有做。

      5、基本沒有美工。

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

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

        很近沒有更新BLog了,這一陣子忙著學(xué)習(xí)Struts2和ExtJS,使用這兩者做了一個(gè)小程序,使用RBAC實(shí)現(xiàn)了基本的權(quán)限管理功能,還做了一個(gè)任務(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)編輯 收藏

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

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

        從自己的實(shí)踐中覺得JSF至少有兩個(gè)致命傷:

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

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

        順便把項(xiàng)目中遇到的一個(gè)RichFaces的缺點(diǎn)列出來:

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

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

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

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

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

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

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

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

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

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

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


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

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

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

    環(huán)境:

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

    1、下載Axis1.4,解壓后將其jar文件添加到web項(xiàng)目的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);
    }

    實(shí)現(xiàn)類:

    public class InterchangeDataServiceImpl extends ServletEndpointSupport implements InterchangeDataService {

       
    public InterchangeDataServiceImpl() {
        }

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

    }

    注意實(shí)現(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ù),代碼如下。

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

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

    會(huì)在WEB-INF目錄中生成四個(gè)JAVA文件,它們分別是:

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

    最后編寫一個(gè)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自動(dòng)生成了一個(gè)CRUD的例子,后來想還是自己白手起家做一個(gè)例子看看,于是開始動(dòng)手。

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

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

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

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

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

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

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

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

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

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

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

        項(xiàng)目生成的代碼被分為兩個(gè)目錄,分別為Action和Model目錄,檢查JBoss中項(xiàng)目部署的目錄,發(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);
        }
    }

    // 實(shí)體類
    @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>

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

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

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

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

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

        下周的學(xué)習(xí)重點(diǎn)還是要轉(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ù)時(shí)間
    3. part_id        實(shí)例ID
    4. yg               數(shù)據(jù)字段1
    5. wg              數(shù)據(jù)字段2

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

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

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

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

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

            a、marketdate取t_id的日期部分。
            b、pointtime取t_id的時(shí)間部分。
            c、pointnumber為時(shí)間的數(shù)字表示,等于hour*60+minute。
            d、但當(dāng)t_id的時(shí)間為某日的00:00時(shí),需將其轉(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ù)庫。

    實(shí)戰(zhàn):

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

    job

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

    trans1

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

    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的一個(gè)bug,就是不能在JavaScript中使用str2date函數(shù),錯(cuò)誤的具體信息參見:http://jira.pentaho.com/browse/PDI-1827。這個(gè)問題也折騰了好長時(shí)間,剛開始怎么也想不通這個(gè)函數(shù)使用時(shí)怎么會(huì)報(bào)錯(cuò)呢,后來只好從字符串中截取年、月、日信息。

           該步驟中還存在另外一個(gè)使人困惑的問題,就是點(diǎn)擊“測試腳本”按鈕,會(huì)報(bào)錯(cuò),但是執(zhí)行job和transformation時(shí)則不會(huì)報(bào)錯(cuò)。

    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;
    }

     

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

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

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

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

    最后在windows操作系統(tǒng)中配置定時(shí)任務(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補(bǔ)丁,打上補(bǔ)丁后,使用telnet訪問1433端口一切正常。

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

    posted @ 2008-12-12 12:07 The Matrix 閱讀(1446) | 評論 (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 小時(shí)(00……23)
    %k 小時(shí)(0……23)
    %h 小時(shí)(01……12)
    %I 小時(shí)(01……12)
    %l 小時(shí)(1……12)
    %i 分鐘, 數(shù)字(00……59)
    %r 時(shí)間,12 小時(shí)(hh:mm:ss [AP]M)
    %T 時(shí)間,24 小時(shí)(hh:mm:ss)
    %S 秒(00……59)
    %s 秒(00……59)
    %p AM或PM
    %w 一個(gè)星期中的天數(shù)(0=Sunday ……6=Saturday )
    %U 星期(0……52), 這里星期天是星期的第一天
    %u 星期(0……52), 這里星期一是星期的第一天
    %% 一個(gè)文字“%”。

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

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

    1、生成Sem web項(xiàng)目

    step1

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

    step2

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

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

    step3

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

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

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

    step5

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

    step6

    step7

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

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

     

    生成的代碼分析:

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

    Java代碼包括如下三個(gè)類:

    • Customer.java ---- 實(shí)體類,映射到數(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

          剛開始看這段代碼時(shí),困惑我的有兩個(gè)地方

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

    至此第一個(gè)使用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;
    注意點(diǎn):
    • temp表空間的數(shù)據(jù)文件不能移動(dòng)

     

    附Oracle的幾種啟動(dòng)方式

    1、startup nomount

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

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

    2、startup mount dbname

      安裝啟動(dòng),這種方式啟動(dòng)下可執(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í)不對數(shù)據(jù)文件和日志文件進(jìn)行校驗(yàn)檢查。

    3、startup open dbname

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

    4、startup,等于以下三個(gè)命令

      startup nomount

      alter database mount

      alter database open

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

    用JBossTools生成項(xiàng)目,生成CRUD的代碼,然后訪問就報(bào)了如下異常:

    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,再測試一切正常!
    不知還會(huì)不會(huì)有其它莫名的BUG了......
    posted @ 2008-12-07 22:03 The Matrix 閱讀(1028) | 評論 (0)編輯 收藏

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

    • 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有個(gè)大概的了解,對其具體的內(nèi)容,細(xì)節(jié)還缺乏進(jìn)一步的了解,對其優(yōu)點(diǎn)、缺點(diǎn)也缺乏進(jìn)一步的認(rèn)識。

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

            今天把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時(shí),一般都是使用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 增強(qiáng)的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的表單驗(yàn)證
    • 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可以在一個(gè)請求中存在,避免了常見的LazyInitializationException。在Seam中,擴(kuò)展的Persistence Context可以跨越多個(gè)請求。其實(shí)擴(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 提供了一個(gè)快速開發(fā)環(huán)境

    selected1 代碼自動(dòng)生成

    selected1 熱部署

    selected1 Seam調(diào)試頁面

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

            

    從目前我個(gè)人的理解來看,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),還可以自動(dòng)生成部分代碼

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

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

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

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

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

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

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

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

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

    Unexpected error during transformation metadata load
    No repository defined!

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

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

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

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

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

            留個(gè)印記..............

    posted @ 2008-12-04 09:04 The Matrix 閱讀(298) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲国产成人综合精品| 亚洲丶国产丶欧美一区二区三区| 亚洲乱亚洲乱妇无码| 另类小说亚洲色图| 一个人看的在线免费视频| 免费萌白酱国产一区二区三区| 小草在线看片免费人成视久网| 久久国产免费福利永久| 精品免费国产一区二区| 久久亚洲av无码精品浪潮| 亚洲成在人天堂在线| 亚洲中文字幕一二三四区苍井空| 精品韩国亚洲av无码不卡区| 成人无码WWW免费视频| 亚洲国产一区二区视频网站| 亚洲国产精品热久久| 亚洲日韩国产AV无码无码精品| 日韩免费的视频在线观看香蕉| 妞干网手机免费视频| 亚洲午夜福利717| 亚洲人成毛片线播放| 全部一级一级毛片免费看| 99热这里有免费国产精品| 在线jyzzjyzz免费视频| 亚洲国产精品日韩在线观看| 免费无遮挡无码视频在线观看 | 在免费jizzjizz在线播| 永久免费av无码网站yy| 亚洲成aⅴ人片久青草影院| 911精品国产亚洲日本美国韩国| 亚洲AV永久无码精品一福利 | 中文字幕免费人成乱码中国| 91精品免费在线观看| 亚洲女同成人AⅤ人片在线观看| 亚洲色大成WWW亚洲女子| 久久精品国产免费| 免费v片在线观看品善网| 亚洲精品中文字幕乱码影院| 国产精品玖玖美女张开腿让男人桶爽免费看 | 免费毛片a在线观看67194| 久久久久亚洲精品无码网址|