隨筆:45 文章:5 評(píng)論:25 引用:0
          BlogJava 首頁(yè) 發(fā)新隨筆
          發(fā)新文章 聯(lián)系 聚合管理

          2009年1月5日

          由于是別的人文章,在此就記下個(gè)LINK吧 http://blog.csdn.net/ferry_passion/article/details/7607489
          posted @ 2012-07-25 21:42 Hill 閱讀(251) | 評(píng)論 (0)編輯 收藏
           
          快過(guò)年了,但在2011年還有不到2個(gè)月的時(shí)候,發(fā)篇隨筆吧~
          今年的計(jì)劃到目前看,都基本實(shí)現(xiàn)了。但是,我知道,挑戰(zhàn)和未來(lái)的規(guī)劃也已經(jīng)開(kāi)始。
          以后一段日子本人將專(zhuān)注分布式應(yīng)用的學(xué)習(xí)和研究,希望能與大家分享一下心得體會(huì)吧。本論壇的高手很多,也希望能得到你們的指導(dǎo)。
          分布式計(jì)算、分布式存儲(chǔ)、虛擬化技術(shù)---->新的系統(tǒng)分析、設(shè)計(jì)方式;OSGI/Hadoop/Hbase....

          今年過(guò)年也有很重要的事要做~期待中~
          posted @ 2011-11-19 11:32 Hill 閱讀(354) | 評(píng)論 (1)編輯 收藏
           
               摘要: ORA-01461: can bind a LONG value only for insert into a LONG column(點(diǎn)睛)  閱讀全文
          posted @ 2009-10-13 15:11 Hill 閱讀(2263) | 評(píng)論 (0)編輯 收藏
           
               摘要: set_context與set_identifier  閱讀全文
          posted @ 2009-09-04 17:32 Hill 閱讀(348) | 評(píng)論 (0)編輯 收藏
           
               摘要: Ibatis中#和$兩個(gè)符號(hào)的使用區(qū)別  閱讀全文
          posted @ 2009-09-01 17:45 Hill 閱讀(1885) | 評(píng)論 (0)編輯 收藏
           
               摘要: java這樣也能寫(xiě),我還真沒(méi)用過(guò)。學(xué)習(xí)學(xué)習(xí)  閱讀全文
          posted @ 2009-07-15 16:16 Hill 閱讀(319) | 評(píng)論 (0)編輯 收藏
           
               摘要: 在很多大型應(yīng)用中都會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,并且采用多個(gè)數(shù)據(jù)庫(kù)實(shí)例進(jìn)行管理,這樣可以有效提高系統(tǒng)的水平伸縮性。而這樣的方案就會(huì)不同于常見(jiàn)的單一數(shù)據(jù)實(shí)例的方案,這就要程序在運(yùn)行時(shí)根據(jù)當(dāng)時(shí)的請(qǐng)求及系統(tǒng)狀態(tài)來(lái)動(dòng)態(tài)的決定將數(shù)據(jù)存儲(chǔ)在哪個(gè)數(shù)據(jù)庫(kù)實(shí)例中,以及從哪個(gè)數(shù)據(jù)庫(kù)提取數(shù)據(jù)。  閱讀全文
          posted @ 2009-07-11 19:24 Hill 閱讀(324) | 評(píng)論 (0)編輯 收藏
           
               摘要: 很多人在進(jìn)行數(shù)據(jù)遷移時(shí),希望把數(shù)據(jù)導(dǎo)入不同于原系統(tǒng)的表空間,在導(dǎo)入之后卻往往發(fā)現(xiàn),數(shù)據(jù)被導(dǎo)入了原表空間。
          本例舉例說(shuō)明解決這個(gè)問(wèn)題:  閱讀全文
          posted @ 2009-07-11 11:44 Hill 閱讀(258) | 評(píng)論 (0)編輯 收藏
           
               摘要: 很多人在進(jìn)行數(shù)據(jù)遷移時(shí),希望把數(shù)據(jù)導(dǎo)入不同于原系統(tǒng)的表空間,在導(dǎo)入之后卻往往發(fā)現(xiàn),數(shù)據(jù)被導(dǎo)入了原表空間。
          本例舉例說(shuō)明解決這個(gè)問(wèn)題:  閱讀全文
          posted @ 2009-07-11 11:44 Hill 閱讀(231) | 評(píng)論 (0)編輯 收藏
           
               摘要: 根據(jù)項(xiàng)目需要,最近在做一個(gè)關(guān)于owc透視表的功能(PivotTable),這個(gè)東西啊讓我可是郁悶了將近10天,網(wǎng)上很多資源都是直接連接數(shù)據(jù)源的方式,但對(duì)于實(shí)現(xiàn)系統(tǒng)開(kāi)發(fā)來(lái)說(shuō),不實(shí)用,因?yàn)閎/s系統(tǒng)多數(shù)是分層架構(gòu),并且部署實(shí)施時(shí),很難由客戶(hù)端直接向數(shù)據(jù)庫(kù)服務(wù)器發(fā)出請(qǐng)求。原因就不多說(shuō)了。
            閱讀全文
          posted @ 2009-07-02 12:02 Hill 閱讀(879) | 評(píng)論 (2)編輯 收藏
           
               摘要: Struts2上傳文件  閱讀全文
          posted @ 2009-06-15 17:41 Hill 閱讀(265) | 評(píng)論 (0)編輯 收藏
           
               摘要: 注意:在jdk1.4下運(yùn)行時(shí),不要多加jar包。struts2-core,xwork這兩個(gè)轉(zhuǎn)換成jdk1.4下的版本后,別的不會(huì)再轉(zhuǎn)了。如果使用別的包時(shí),轉(zhuǎn)一個(gè)加一個(gè)試試,struts2在加入jar包時(shí),可能有問(wèn)題,使用時(shí)小心。  閱讀全文
          posted @ 2009-06-12 15:40 Hill 閱讀(1258) | 評(píng)論 (0)編輯 收藏
           
               摘要: 在jsp中操作FCKeditor  閱讀全文
          posted @ 2009-06-09 14:34 Hill 閱讀(448) | 評(píng)論 (0)編輯 收藏
           
               摘要: row_number() /rank()/dense_rank()學(xué)習(xí)之二  閱讀全文
          posted @ 2009-06-08 14:27 Hill 閱讀(141) | 評(píng)論 (0)編輯 收藏
           
               摘要: ORACLE分析函數(shù)學(xué)習(xí)  閱讀全文
          posted @ 2009-06-08 14:04 Hill 閱讀(205) | 評(píng)論 (0)編輯 收藏
           
               摘要: Selecting the first n rows with Oracle  閱讀全文
          posted @ 2009-06-08 11:56 Hill 閱讀(181) | 評(píng)論 (0)編輯 收藏
           
               摘要: document.selection.createRange方法  閱讀全文
          posted @ 2009-05-31 13:51 Hill 閱讀(11250) | 評(píng)論 (3)編輯 收藏
           
               摘要: 處理中文問(wèn)題  閱讀全文
          posted @ 2009-05-27 17:16 Hill 閱讀(1970) | 評(píng)論 (0)編輯 收藏
           
               摘要: 向原作者學(xué)習(xí)一下,從感性上  閱讀全文
          posted @ 2009-05-27 14:59 Hill 閱讀(108) | 評(píng)論 (0)編輯 收藏
           
               摘要: 在以前的一篇文中介紹到,當(dāng)用parameterMap作為ibatis映射輸入?yún)?shù)時(shí),要在ibatis的配置文件中
          作相應(yīng)的聲明。但我們也可以不在ibatis映射文件中作聲明,應(yīng)用方法如下:   閱讀全文
          posted @ 2009-05-27 14:06 Hill 閱讀(3440) | 評(píng)論 (0)編輯 收藏
           
               摘要: 關(guān)于自動(dòng)完成的別人的例子,學(xué)習(xí)一下。  閱讀全文
          posted @ 2009-05-08 15:27 Hill 閱讀(180) | 評(píng)論 (0)編輯 收藏
           
               摘要: 今天遇到要用replaceAll(),看到很多人對(duì)其也有困惑.我在此記錄下來(lái)  閱讀全文
          posted @ 2009-04-29 10:59 Hill 閱讀(116734) | 評(píng)論 (5)編輯 收藏
           

          今天打算啟用一下Oracle Database 11g的Database Control,發(fā)現(xiàn)初始并未安裝:

          [oracle@test126 ~]$ emctl start
          EM Configuration issue. /opt/oracle/product/11.1.0/test126.hurray.com.cn_dodd not found.

           

          遇到這類(lèi)問(wèn)題,可以通過(guò)重新配置,來(lái)創(chuàng)建EM的配置文件:

          [oracle@test126 11.1.0]$ emca -config dbcontrol db -repos recreate

           

          STARTED EMCA at Aug 28, 2007 11:54:40 AM
          EM Configuration Assistant, Version 11.1.0.5.0 Production
          Copyright (c) 2003, 2005, Oracle. All rights reserved.

          Enter the following information:
          Database SID: dodd
          Listener port number: 1521
          Password for SYS user:
          Password for DBSNMP user:
          Password for SYSMAN user:
          Password for SYSMAN user: Email address for notifications (optional): eygle@eygle.com
          Outgoing Mail (SMTP) server for notifications (optional):
          -----------------------------------------------------------------

          You have specified the following settings

          Database ORACLE_HOME ................ /opt/oracle/product/11.1.0

          Local hostname ................ test126.hurray.com.cn
          Listener port number ................ 1521
          Database SID ................ dodd
          Email address for notifications ............... eygle@eygle.com
          Outgoing Mail (SMTP) server for notifications ...............

          -----------------------------------------------------------------
          Do you wish to continue? [yes(Y)/no(N)]: Y
          Aug 28, 2007 11:56:58 AM oracle.sysman.emcp.EMConfig perform
          INFO: This operation is being logged at /opt/oracle/cfgtoollogs/emca/dodd/emca_2007_08_28_11_54_40.log.
          Aug 28, 2007 11:57:01 AM oracle.sysman.emcp.EMReposConfig invoke
          INFO: Dropping the EM repository (this may take a while) ...
          Aug 28, 2007 11:57:16 AM oracle.sysman.emcp.EMReposConfig invoke
          INFO: Repository successfully dropped
          Aug 28, 2007 11:57:16 AM oracle.sysman.emcp.EMReposConfig createRepository
          INFO: Creating the EM repository (this may take a while) ...


          Aug 28, 2007 12:08:35 PM oracle.sysman.emcp.EMReposConfig invoke
          INFO: Repository successfully created
          Aug 28, 2007 12:08:47 PM oracle.sysman.emcp.EMReposConfig uploadConfigDataToRepository
          INFO: Uploading configuration data to EM repository (this may take a while) ...
          Aug 28, 2007 12:11:45 PM oracle.sysman.emcp.EMReposConfig invoke
          INFO: Uploaded configuration data successfully
          Aug 28, 2007 12:11:51 PM oracle.sysman.emcp.util.DBControlUtil configureSoftwareLib
          INFO: Software library configured successfully.
          Aug 28, 2007 12:11:51 PM oracle.sysman.emcp.EMDBPostConfig configureSoftwareLibrary
          INFO: Deploying Provisioning archives ...
          Aug 28, 2007 12:12:13 PM oracle.sysman.emcp.EMDBPostConfig configureSoftwareLibrary
          INFO: Provisioning archives deployed successfully.
          Aug 28, 2007 12:12:13 PM oracle.sysman.emcp.util.DBControlUtil secureDBConsole
          INFO: Securing Database Control (this may take a while) ...
          Aug 28, 2007 12:12:39 PM oracle.sysman.emcp.util.DBControlUtil secureDBConsole
          INFO: Database Control secured successfully.
          Aug 28, 2007 12:12:39 PM oracle.sysman.emcp.util.DBControlUtil startOMS
          INFO: Starting Database Control (this may take a while) ...
          Aug 28, 2007 12:14:04 PM oracle.sysman.emcp.EMDBPostConfig performConfiguration
          INFO: Database Control started successfully
          Aug 28, 2007 12:14:04 PM oracle.sysman.emcp.EMDBPostConfig performConfiguration
          INFO: >>>>>>>>>>> The Database Control URL is https://test126.hurray.com.cn:1158/em <<<<<<<<<<<
          Aug 28, 2007 12:14:16 PM oracle.sysman.emcp.EMDBPostConfig invoke
          WARNING:
          ************************ WARNING ************************

          Management Repository has been placed in secure mode wherein Enterprise Manager data will be encrypted. The encryption key has been placed in the file: /opt/oracle/product/11.1.0/test126.hurray.com.cn_dodd/sysman/config/emkey.ora. Please ensure this file is backed up as the encrypted data will become unusable if this file is lost.

          ***********************************************************
          Enterprise Manager configuration completed successfully
          FINISHED EMCA at Aug 28, 2007 12:14:16 PM

           

          Oracle 10g中,配置方法與此相同。
          配置完成之后就可以啟動(dòng)EM了:

          [oracle@test126 11.1.0]$ emctl start dbconsole
          Oracle Enterprise Manager 11g Database Control Release 11.1.0.6.0
          Copyright (c) 1996, 2007 Oracle Corporation. All rights reserved.
          https://test126.hurray.com.cn:1158/em/console/aboutApplication
          Starting Oracle Enterprise Manager 11g Database Control ........ started.
          ------------------------------------------------------------------
          Logs are generated in directory /opt/oracle/product/11.1.0/test126.hurray.com.cn_dodd/sysman/log

           

          如果是Linux環(huán)境,你可能還需要在iptables中開(kāi)放1158端口,增加如下一行:
          -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1158 -j ACCEPT

          重新啟動(dòng)防火墻之后就可以通過(guò)IE在遠(yuǎn)端連接EM的Database Control了:

          [root@test126 sysconfig]# service iptables restart
          Flushing firewall rules: [ OK ]
          Setting chains to policy ACCEPT: filter [ OK ]
          Unloading iptables modules: [ OK ]
          Applying iptables firewall rules: [ OK ]
          Loading additional iptables modules: ip_conntrack_netbios_ns [ OK ]

           


          -The End-

          posted @ 2009-04-23 15:13 Hill 閱讀(868) | 評(píng)論 (0)編輯 收藏
           
               摘要: 簡(jiǎn)單來(lái)說(shuō)序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化,流的概念這里不用多說(shuō)(就是I/O),我們可以對(duì)流化后的對(duì)象進(jìn)行讀寫(xiě)操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間(注:要想將對(duì)象傳輸于網(wǎng)絡(luò)必須進(jìn)行流化)!在對(duì)對(duì)象流進(jìn)行讀寫(xiě)操作時(shí)會(huì)引發(fā)一些問(wèn)題,而序列化機(jī)制正是用來(lái)解決這些問(wèn)題的!
            閱讀全文
          posted @ 2009-03-12 15:11 Hill 閱讀(557) | 評(píng)論 (1)編輯 收藏
           
               摘要: 是Logic 標(biāo)簽庫(kù)中最復(fù)雜的標(biāo)簽,也是用途最廣的一個(gè)標(biāo)簽,它能夠在一個(gè)循環(huán)中遍歷數(shù)組、Collection、Enumeration、Iterator 或 Map 中的所有元素。   閱讀全文
          posted @ 2009-03-09 10:34 Hill 閱讀(1524) | 評(píng)論 (0)編輯 收藏
           
               摘要: Tiles框架為創(chuàng)建Web頁(yè)面提供了一種模板機(jī)制,它能將網(wǎng)頁(yè)的布局和內(nèi)容分離。它允許先創(chuàng)建模板,然后在運(yùn)行時(shí)動(dòng)態(tài)地將內(nèi)容插入到模板中。Tiles 框架建立在JSP的include指令的基礎(chǔ)上,但它提供了比JSP的 include指令更強(qiáng)大的功能  閱讀全文
          posted @ 2009-03-06 11:20 Hill 閱讀(323) | 評(píng)論 (0)編輯 收藏
           
               摘要: 大家都清楚在用PowerDesigner的時(shí)候,當(dāng)你輸入Name的時(shí)候Code是會(huì)自動(dòng)幫你按照Name的內(nèi)容填上的.

          這個(gè)功能雖然好用,但是我需要在Name這一項(xiàng)加上一個(gè)中文的注釋,這個(gè)時(shí)候怎么辦呢?

          下面兩個(gè)例子,相信對(duì)你相當(dāng)有用.  閱讀全文
          posted @ 2009-03-02 17:45 Hill 閱讀(1498) | 評(píng)論 (0)編輯 收藏
           
               摘要: 近來(lái)讀了一篇《怎樣成為優(yōu)秀的軟件模型設(shè)計(jì)者》的文章,感觸頗深。仔細(xì)對(duì)比分析,發(fā)現(xiàn)原來(lái)我自己和周?chē)能浖_(kāi)發(fā)人員平常的一些自認(rèn)為對(duì)的做法,有很多是有問(wèn)題的。  閱讀全文
          posted @ 2009-02-25 18:20 Hill 閱讀(181) | 評(píng)論 (0)編輯 收藏
           
               摘要: 第一次感覺(jué)到“分享”的重要性,過(guò)去,只會(huì)想辦法去獲得,卻沒(méi)有意識(shí)到“分享”是更加值得去“獲得”的能力與心態(tài)  閱讀全文
          posted @ 2009-02-25 18:06 Hill 閱讀(130) | 評(píng)論 (0)編輯 收藏
           
          <a href="javascript:self.close()">close</a>
          <!--IE7 -->
          <a href="javascript:window.open('','_self','');window.close();">direct close</a>
          <!--IE6-->
          <input type="button" value="click" onclick="javascript:window.opener=null;window.close();return false;">
          posted @ 2009-02-24 15:11 Hill 閱讀(124) | 評(píng)論 (0)編輯 收藏
           
               摘要: 學(xué)習(xí)JavaMail可以借鑒一下。用到時(shí),可以參考  閱讀全文
          posted @ 2009-02-23 17:50 Hill 閱讀(181) | 評(píng)論 (0)編輯 收藏
           
               摘要: 介紹了oracle9i的xmltype數(shù)據(jù)類(lèi)型的基本使用
          包括:建立含有xmltype數(shù)據(jù)類(lèi)型的表
          插入(insert)數(shù)據(jù)
          查詢(xún)(select)數(shù)據(jù)
          更新(update)數(shù)據(jù)
          添加超過(guò)4k字節(jié)的xml文檔到xmltype型字段
          適合初學(xué)者。
            閱讀全文
          posted @ 2009-02-13 11:27 Hill 閱讀(2087) | 評(píng)論 (0)編輯 收藏
           
               摘要: RAC就是real application clusters的縮寫(xiě),Oracle Real Application Clusters (RAC)可以支持24 x 7 有效的數(shù)據(jù)庫(kù)應(yīng)用 系統(tǒng),您可以在由低成本的服務(wù)器構(gòu)成的高可用性系統(tǒng)上自由部署您的應(yīng)用,而無(wú)需修改您的應(yīng)用程序。已經(jīng)有超過(guò)4200個(gè)用戶(hù)從中受益。現(xiàn)在Oracle在 10g RAC中更提供免費(fèi)的集群軟件和存儲(chǔ)管理軟件,為您降低應(yīng)用成本。擁有RAC您無(wú)需再為成本而犧牲性能和 可靠性。
            閱讀全文
          posted @ 2009-02-04 10:39 Hill 閱讀(826) | 評(píng)論 (0)編輯 收藏
           
               摘要: 新人新問(wèn)題,感覺(jué)問(wèn)問(wèn)自己這些問(wèn)題,也算是指明一個(gè)學(xué)習(xí)方向吧,感覺(jué)也不容易啊,努力學(xué)習(xí)中  閱讀全文
          posted @ 2009-02-03 11:13 Hill 閱讀(408) | 評(píng)論 (8)編輯 收藏
           
               摘要: 本人是新人,要從頭學(xué)習(xí)起,希望老手們能介紹經(jīng)驗(yàn)啊,謝謝  閱讀全文
          posted @ 2009-02-03 11:11 Hill 閱讀(229) | 評(píng)論 (0)編輯 收藏
           
               摘要: 刪 除 數(shù) 據(jù)
          刪除表中數(shù)據(jù)的方法有兩種,在指定的表或視圖中刪除滿(mǎn)足給定條件的數(shù)據(jù)可以使用DELETE語(yǔ)句;如果要清除表中全部數(shù)據(jù),則還可以使用TRUNCATE TABLE語(yǔ)句  閱讀全文
          posted @ 2009-02-03 11:04 Hill 閱讀(1563) | 評(píng)論 (4)編輯 收藏
           
          1Z0-042
          安裝和配置 Oracle Database 10g
          監(jiān)控和維護(hù) Oracle Database 10g,并排除 Oracle Database 10g 中的故障
          為 Oracle Database 10g 配置 Oracle Net Services
          Oracle Database 10g 的備份和恢復(fù)
          在 Oracle Database 10g 中創(chuàng)建和管理用戶(hù)賬戶(hù)
          1Z0-043
          使用 RMAN 創(chuàng)建和管理備份集和映像副本
          將數(shù)據(jù)庫(kù)恢復(fù)到過(guò)去某一時(shí)刻的狀態(tài)
          使用 Oracle 閃回技術(shù)恢復(fù)數(shù)據(jù)庫(kù)
          檢測(cè)塊損壞情況并采取相應(yīng)的措施修復(fù)損壞的塊
          使用各種數(shù)據(jù)庫(kù) Advisor 來(lái)監(jiān)控和提高數(shù)據(jù)庫(kù)的性能
          使用資源管理器來(lái)控制數(shù)據(jù)庫(kù)資源的使用情況
          使用調(diào)度程序來(lái)簡(jiǎn)化管理任務(wù)
          提高監(jiān)聽(tīng)程序的安全性
          復(fù)查數(shù)據(jù)庫(kù)日志文件以便進(jìn)行診斷
          為數(shù)據(jù)庫(kù)和單獨(dú)的會(huì)話(huà)自定義基于語(yǔ)言的行為

          專(zhuān)題的研究如:RMAN、RAS、STATSPACT、 DATAGUARD、TUNING、BACKUP&RECOVER等等
          posted @ 2009-02-03 10:51 Hill 閱讀(172) | 評(píng)論 (0)編輯 收藏
           
               摘要: 我是剛參加工作不久的新人,想通過(guò)參加一些相關(guān)的認(rèn)證提高自己的工作能力,希望大家給點(diǎn)意見(jiàn),謝謝


          為了進(jìn)一步提高Oracle認(rèn)證的可選性,Oracle公司現(xiàn)在可以提供4種不同的認(rèn)證,這些都是專(zhuān)為從事Oracle領(lǐng)域工作的人員包括DBA、開(kāi)發(fā)人員以及管理人員所設(shè)計(jì)的  閱讀全文
          posted @ 2009-02-03 10:14 Hill 閱讀(148) | 評(píng)論 (0)編輯 收藏
           
               摘要: JdbcTemplate是core包的核心類(lèi)。它替我們完成了資源的創(chuàng)建以及釋放工作,從而簡(jiǎn)化了我們對(duì)JDBC的使用。它還可以幫助我們避免一些常見(jiàn)的錯(cuò)誤,比如忘記關(guān)閉數(shù)據(jù)庫(kù)連接。JdbcTemplate將完成JDBC核心處理流程,比如SQL語(yǔ)句的創(chuàng)建、執(zhí)行,而把SQL語(yǔ)句的生成以及查詢(xún)結(jié)果的提取工作留給我們的應(yīng)用代碼。它可以完成SQL查詢(xún)、更新以及調(diào)用存儲(chǔ)過(guò)程,可以對(duì)ResultSet進(jìn)行遍歷并加以提取。它還可以捕獲JDBC異常并將其轉(zhuǎn)換成org.springframework.dao包中定義的,通用的,信息更豐富的異常。

            閱讀全文
          posted @ 2009-01-13 18:07 Hill 閱讀(779) | 評(píng)論 (0)編輯 收藏
           
               摘要: 年關(guān)到了,商家忙著促銷(xiāo),網(wǎng)站忙著推廣,阿里軟件的服務(wù)集成平臺(tái)也面臨第一次多方大規(guī)模的壓力考驗(yàn)。根據(jù)該平臺(tái)5.3版本的壓力測(cè)試結(jié)果,我們估算了一下現(xiàn)有的推廣會(huì)帶來(lái)的壓力,基本上確定了服務(wù)集成平臺(tái)年底不需要擴(kuò)容。SA(System Administrator,系統(tǒng)管理員)為了保險(xiǎn)起見(jiàn)還是通過(guò)請(qǐng)求方式來(lái)做定時(shí)的心跳檢測(cè),保證服務(wù)集成平臺(tái)的可靠性。結(jié)果阿里旺旺推廣開(kāi)始的第一天,SA的報(bào)警短信就在幾個(gè)忙時(shí)段不停地發(fā)告警,但是查看生產(chǎn)環(huán)境的服務(wù)器狀況以及應(yīng)用狀況后看不出有什么問(wèn)題,于是開(kāi)始懷疑是否告警機(jī)制不是很合理。幾日的訪(fǎng)問(wèn)記錄統(tǒng)計(jì)報(bào)告看過(guò)以后,發(fā)現(xiàn)了幾個(gè)問(wèn)題,首先由于推廣是在IM登錄時(shí)段集中式的推廣,因此高峰期比較集中,壓力也很大,而告警發(fā)生的時(shí)刻也是那些時(shí)候;另外發(fā)現(xiàn)那些推廣使用的API的處理時(shí)間比較長(zhǎng),同時(shí)還有些出現(xiàn)了問(wèn)題,這幾天除了服務(wù)集成平臺(tái)告警以外,那些API服務(wù)器也在告警;因此可以看出問(wèn)題應(yīng)該是由于API提供商響應(yīng)速度慢而拖累了服務(wù)集成平臺(tái)的處理能力,監(jiān)控機(jī)制在高峰情況下沒(méi)有得到及時(shí)的響應(yīng),就認(rèn)為是服務(wù)器已經(jīng)處于無(wú)效狀態(tài)。  閱讀全文
          posted @ 2009-01-12 18:38 Hill 閱讀(200) | 評(píng)論 (0)編輯 收藏
           
               摘要: 原因:首先,JFreeChart和中文驗(yàn)證碼的亂碼問(wèn)題和jsp的編碼無(wú)關(guān),是由于Java虛擬機(jī)找不到字體文件造成的,所以同類(lèi)的Swing或者AWT的中文亂碼問(wèn)題也適用

            閱讀全文
          posted @ 2009-01-12 17:18 Hill 閱讀(4051) | 評(píng)論 (0)編輯 收藏
           
               摘要: JFreeChart真是個(gè)好東西,今天剛剛學(xué)習(xí)了一下,以后要是用時(shí),可以深入,大家要是不知道怎么在Web中畫(huà)出圖表,請(qǐng)參考,謝謝  閱讀全文
          posted @ 2009-01-12 16:41 Hill 閱讀(137) | 評(píng)論 (0)編輯 收藏
           

          Struts Validator驗(yàn)證器使用指南


          驗(yàn)證器:

          從0.5版,驗(yàn)證器在一些form中就已經(jīng)實(shí)現(xiàn)了,他最初包含在開(kāi)發(fā)人員包中,后來(lái)核心代碼挪到Jakarta Commons包中和Struts特別擴(kuò)展中作為 Struts 1.1的一部分。許多開(kāi)發(fā)者為方便一直使用struts驗(yàn)證器,這篇文檔首先概述驗(yàn)證器的核心功能性,然后大概介紹在 struts1.1中的變化和新增功能。

          如果你配置好驗(yàn)證器插件,你應(yīng)該擴(kuò)展ValidatorForm而不是ActionForm,以便它能加載你的Validator資源。他根據(jù)struts-config.xml文件中的action的name屬性為當(dāng)前form的調(diào)用相應(yīng)的驗(yàn)證器,因此在validator-rules.xml中的form元素的名稱(chēng)屬性應(yīng)該與action的name屬性值相匹配。

          另外一種選擇是擴(kuò)展ValidatorActionForm 而不是ValidatorForm,ValidatorActionForm使用struts-config.xml中action的path屬性,所以path屬性的值相應(yīng)的應(yīng)該與validator-rules.xml中的Form的name屬性匹配。

          一個(gè)分離的action可以定義給多頁(yè)form的每個(gè)頁(yè)面,而且驗(yàn)證規(guī)則可以與action關(guān)聯(lián)而不是與頁(yè)碼,就像驗(yàn)證范例中的多頁(yè)form范例那樣。
          國(guó)際化

          在validator-rules.xml 文件中form的驗(yàn)證規(guī)則可以組織為FormSet。FormSet 有與java.util.Locale 類(lèi)相應(yīng)的屬性:如語(yǔ)言, 國(guó)家以及變量型屬性,如果他們未定義,F(xiàn)ormSet 將把它設(shè)置為默認(rèn)值。一個(gè)FormSet 也可以有關(guān)聯(lián)的常量。另外還可以定義與FormSet 同一級(jí)別的全局global元素,他與FormSet同樣也有常量。

          注意:你必須在國(guó)際化的FormSet前聲明一個(gè)沒(méi)有國(guó)際化的默認(rèn)FormSet。這樣如果Validator沒(méi)有找到locale時(shí)可以有一個(gè)默認(rèn)版本。

                  可插入驗(yàn)證器的默認(rèn)錯(cuò)誤信息值可以被msg元素覆蓋。所以為mask驗(yàn)證器生成錯(cuò)誤信息的替代方法就是使用msg屬性,如果字段的name屬性與驗(yàn)證器的name屬性匹配,那末將使用字段的msg屬性。

                  error messages的可以設(shè)置arg0-arg3 等參數(shù)元素。如果沒(méi)有設(shè)置arg0-arg3的name屬性, error messages將使用他們作為默認(rèn)的構(gòu)建參數(shù)值。如果設(shè)置了name屬性,你就可以把參數(shù)指定給一特定的可插入驗(yàn)證器,然后這些參數(shù)將在構(gòu)造錯(cuò)誤信息時(shí)被使用。

          <field

          property="lastName"

          depends="required,mask">

          <msg

          name="mask"

          key="registrationForm.lastname.maskmsg"/>

          <arg0 key="registrationForm.lastname.displayname"/>

          <var>

          <var-name>mask</var-name>

          <var-value>^[a-zA-Z]*$</var-value>

          </var>

          </field>

          默認(rèn)的arg0-arg3元素將在消息資源中查找相應(yīng)的key,如果資源屬性設(shè)為false,她將把值直接傳進(jìn)去,而不從消息資源中查找。注意1.1版本中,你必須為每個(gè)模塊中明確地定義在驗(yàn)證中用到的消息資源,否則將使用top-level資源。

          <field

          property="integer"

          depends="required,integer,intRange">

          <arg0 key="typeForm.integer.displayname"/>

          <arg1

          name="range"

          key="${var:min}"

          resource="false"/>

          <arg2

          name="range"

          key="${var:max}"

          resource="false"/>

          <var>

          <var-name>min</var-name>

          <var-value>10</var-value>

          </var>

          <var>

          <var-name>max</var-name>

          <var-value>20</var-value>

          </var>

          </field>
          常量/變量

          全局的常量可以在全局標(biāo)簽中定義,F(xiàn)ormSet/本地常量能在formset 標(biāo)簽中創(chuàng)建。常量當(dāng)前僅僅是代替字段的property屬性,字段的var 元素的 value屬性,字段的msg 元素的 key屬性,字段的arg0-arg3 元素的 key屬性。字段的變量也可以在arg0-arg3 元素中被代替(例如:${var:min}))。替換的順序是FormSet/Locale常量第一,全局的常量第二,

          arg elements 變量最后。

          <global>

          <constant>

          <constant-name>zip</constant-name>

          <constant-value>^\d{5}(-\d{4})?$</constant-value>

          </constant>

          </global>

           

          <field

          property="zip"

          depends="required,mask">

          <arg0 key="registrationForm.zippostal.displayname"/>

          <var>

          <var-name>mask</var-name>

          <var-value>${zip}</var-value>

          </var>

          </field>

          驗(yàn)證器可以使用字段下面的變量部分來(lái)存儲(chǔ)變量,這些變量通過(guò)字段的getVar((String key)方法取得。

          <field

          property="integer"

          depends="required,integer,intRange">

          <arg0 key="typeForm.integer.displayname"/>

          <arg1

          name="range"

          key="${var:min}" resource="false"/>

          <arg2

          name="range"

          key="${var:max}" resource="false"/>

          <var>

          <var-name>min</var-name>

          <var-value>10</var-value>

          </var>

          <var>

          <var-name>max</var-name>

          <var-value>20</var-value>

          </var>

          </field>
          使用validwhen設(shè)計(jì)復(fù)雜的驗(yàn)證

          使用validwhen來(lái)設(shè)計(jì)復(fù)雜驗(yàn)證的一個(gè)經(jīng)常的要求就是根據(jù)一個(gè)字段驗(yàn)證另外一個(gè)字段(比如, 如果你要用戶(hù)兩次輸入口令來(lái)確認(rèn)值口令一致),另外一個(gè)就是表單中的一個(gè)字段只有另外一個(gè)字段有確定值的時(shí)候才是必須輸入的。新的validwhen驗(yàn)證規(guī)則將很快被包含在1.1后的STRUTS版本中,她就是用來(lái)處理這種情況的。

                  validwhen 規(guī)則處理單個(gè)的變量字段,叫測(cè)試。這變量的值是一個(gè)布爾的表達(dá)式,如果驗(yàn)證有效則它必須為真。可以包含這種變量的表達(dá)式有:

          u        單引號(hào)或雙引號(hào)字符串literals,

          u        十進(jìn)制、十六進(jìn)制、八進(jìn)制的Integer literals,

          u        null與null和空字符串匹配,

          u        其它可以用屬性名引用的form字段,例如customerAge,

          u        可以在外部因用得索引字段, 例如childLastName[2],

          u        可以默認(rèn)implicit因用得索引字段, 例如childLastName[], 她將作為被索引的字段使用同樣的索引到數(shù)組中,

          The literal *這里指它包含當(dāng)前測(cè)試字段的值,

          作為例子,考慮一個(gè)包含通訊地址和郵箱字段的form。如果通訊地址不為空則郵箱字段是必須的required。你能這樣定義validwhen 規(guī)則:

          <field property="emailAddress" depends="validwhen">

          <arg0 key="userinfo.emailAddress.label"/>

          <var>

          <var-name>test</var-name>

          <var-value>((sendNewsletter == null) or (*this* != null))</var-value>

          </var>

          </field>

          上面定義的意思是:如果通訊地址是空或不空時(shí)這個(gè)字段時(shí)有效的。

          這里有個(gè)稍微復(fù)雜的例子,它使用了索引字段。假定有一個(gè)表單,允許用戶(hù)輸入他們希望定購(gòu)的部件號(hào)和數(shù)量。類(lèi)orderLine 的bean的一數(shù)組被用來(lái)在稱(chēng)為orderLines 的一屬性保持輸入項(xiàng)。

          If you wished to verify that every line with part number also had a quantity entered, you could do it with:

          如果你希望校驗(yàn)訂單中有數(shù)量輸入得每一行,你可以這樣:

          <field

          property="quantity"

          indexedListProperty="orderLines"

          depends="validwhen">

          <arg0 key="orderform.quantity.label"/>

          <var>

          <var-name>test</var-name>

          <var-value>((orderLines[].partNumber == null) or (*this* != null))</var-value>

          </var>

          </field>

          這里的意思是:如果相應(yīng)的partNumber 字段是空, 或這字段是不空的,則這字段是有效的。

          最后一個(gè)例子,想象一表單,用戶(hù)必須輸入他們的以英寸為單位的高度,如果他們?cè)诟叨仍?0英寸以下,則出一錯(cuò)誤。(it is an error to have checked off nbaPointGuard as a career.)

          <field property="nbaPointGuard" depends="validwhen">

          <arg0 key="careers.nbaPointGuard.label"/>

          <var>

          <var-name>test</var-name>

          <var-value>((heightInInches >= 60) or (*this* == null))</var-value>

          </var>

          </field>

           

          給程序員的簡(jiǎn)單說(shuō)明:

          所有的比較關(guān)系必須在parens 封裝。All comparisons must be enclosed in parens.

          只有兩個(gè)itme時(shí)可以and或or鏈接。

          如果比較的兩item都可以轉(zhuǎn)為整數(shù),則使用numeric比較,否則使用字符串比較。
          可插入驗(yàn)證器

          驗(yàn)證是從validation.xml 文件中加載的,默認(rèn)的驗(yàn)證規(guī)則定義在validation.xml 文件中,默認(rèn)定義了required, mask ,byte, short, int, long, float, double, date (沒(méi)有本地支持), and a numeric range。

          " mask "方式依賴(lài)于默認(rèn)值安裝要求,那意味著"required "可以完成,在"'mask "將運(yùn)行以前"required "和" mask "方式被默認(rèn)包含進(jìn)框架中了。任何字段如果不是"required "而且是空或有零長(zhǎng)度將跳過(guò)其他驗(yàn)證。

          如果使用了Javascript 標(biāo)簽,客戶(hù)端javascript在validator's javascript 屬性中查找值而且產(chǎn)生一個(gè)有驗(yàn)證form方法的對(duì)象,要得到更多的關(guān)于Javascript Validator 標(biāo)簽工作細(xì)節(jié)的詳細(xì)的解釋,參閱html標(biāo)簽API參考。

          "'mask' "方式讓你用一正則表達(dá)式掩碼驗(yàn)證字段,它使用jakarta的正規(guī)表達(dá)式包,所有的有效性規(guī)則存儲(chǔ)在validator-rules.xml 文件,使用的主類(lèi)是org.apache.regexp.RE。

          validation.xml文件中的驗(yàn)證器配置范例:

          <validator name="required"

          classname="org.apache.struts.validator.FieldChecks"

          method="validateRequired"

          methodParams="java.lang.Object,

          org.apache.commons.validator.ValidatorAction,

          org.apache.commons.validator.Field,

          org.apache.struts.action.ActionErrors,

          javax.servlet.http.HttpServletRequest"

          msg="errors.required">

          <validator name="mask"

          classname="org.apache.struts.validator.FieldChecks"

          method="validateMask"

          methodParams="java.lang.Object,

          org.apache.commons.validator.ValidatorAction,

          org.apache.commons.validator.Field,

          org.apache.struts.action.ActionErrors,

          javax.servlet.http.HttpServletRequest"

          msg="errors.invalid">


          定義可插入驗(yàn)證器

          方法的參數(shù)是用逗號(hào)分隔的一些類(lèi)名稱(chēng)列表,方法屬性需要有一個(gè)符合上面的列表的簽名。列表由以下組合而成:

          java.lang.Object – 要驗(yàn)證的Bean。

          org.apache.commons.validator.ValidatorAction – 當(dāng)前ValidatorAction。

          org.apache.commons.validator.Field – 要驗(yàn)證的字段

          org.apache.struts.action.ActionErrors – 如果驗(yàn)證錯(cuò)誤將加入ActionError的錯(cuò)誤對(duì)象javax.servlet.http.HttpServletRequest –當(dāng)前request 對(duì)象。

          javax.servlet.ServletContext – 應(yīng)用的ServletContext。

          org.apache.commons.validator.Validator–當(dāng)前的org.apache.commons.validator.Validator實(shí)例。

          java.util.Locale – 當(dāng)前用戶(hù)的Locale。
          多頁(yè)面form

          字段部分有一可選的頁(yè)面屬性,它可以被設(shè)為整數(shù),頁(yè)上字段的所有驗(yàn)證小于或等于服務(wù)器端驗(yàn)證的當(dāng)前頁(yè),頁(yè)上字段的所有驗(yàn)證小于或等于客戶(hù)端頁(yè)上所有字段的驗(yàn)證小于或等于服務(wù)器端驗(yàn)證的當(dāng)前頁(yè)驗(yàn)證的當(dāng)前頁(yè)。一個(gè)mutli-part表單需要定義頁(yè)面屬性:

          <html:hidden property="page" value="1"/>。
          比較兩個(gè)字段

          這是一個(gè)展示你怎樣才能比較兩個(gè)字段是否有一樣的值的例子。比如“用戶(hù)改變他們的口令“一般會(huì)有口令字段和一確認(rèn)字段。

          <validator name="twofields"

          classname="com.mysite.StrutsValidator"

          method="validateTwoFields"

          msg="errors.twofields"/>

          <field property="password" depends="required,twofields">

          <arg0 key="typeForm.password.displayname"/>

          <var>

          <var-name>secondProperty</var-name>

          <var-value>password2</var-value>

          </var>

          </field>

           

          public static boolean validateTwoFields(

          Object bean, ValidatorAction va,  

          Field field, ActionErrors errors, HttpServletRequest request,  

          ServletContext application) {

          String value = ValidatorUtils.getValueAsString( bean,   field.getProperty());

          String sProperty2 = field.getVarValue("secondProperty");

          String value2 = ValidatorUtils.getValueAsString( bean,   sProperty2);

           

                  if (!GenericValidator.isBlankOrNull(value)) {

          try {

          if (!value.equals(value2)) {

          errors.add(field.getKey(),

          Resources.getActionError( application, request, va, field));

                                       return false;

          }

          } catch (Exception e) {

          errors.add(field.getKey(), Resources.getActionError( application, request, va, field));

          return false;

          }

          }

          }
          已知的bug

          Struts Validator依賴(lài)于Commons Validator包,所以問(wèn)題報(bào)告和增強(qiáng)需求可能在兩個(gè)產(chǎn)品中列出。

          ·    Struts Validator Bugzilla Reports

          ·    Commons Validator Bugzilla Reports
          變更和deprecations

          新建的標(biāo)記屬性。

          <html:javascript>標(biāo)記有新的屬性定義.

          使用commons-validator.jar中的DTD驗(yàn)證。

          當(dāng)前使用的驗(yàn)證XML文件是根據(jù)commons-validator.jar中的DTD。Struts不在為validator-rules.xml and validator.xml.單獨(dú)維護(hù)一個(gè)分離的DTD,另外,commons-validator 現(xiàn)在維護(hù)一個(gè)統(tǒng)一的validator.dtd。修改所有validator.xml文件的DTD引用為

          <!DOCTYPE form-validation PUBLIC

          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"

          "

          空字段。

          當(dāng)前默認(rèn)在所有得基礎(chǔ)驗(yàn)證類(lèi)型中忽略空白的字段,如果你要求一個(gè)字段必須輸入,那末在你的應(yīng)用的validator.xml 文件相應(yīng)的字段定義的depends屬性中添加 " required "。

          新建的范圍RANGE方法.

          JavaScript 和JAVA中都添加了intRange & floatRange 方法。

          有條件地REQUIRED字段.

          最大的修改是添加了基于其她字段的值的有條件地require驗(yàn)證的能力。它允許你定義邏輯如:“只有X字段非空的時(shí)候Y字段為’male’才有效”,這是實(shí)現(xiàn)上述邏輯的推薦方法,這種方法在1.1版后的第一版將實(shí)現(xiàn)。在1.1版中添加的Requiredif驗(yàn)證規(guī)則,將在新版中去掉。不過(guò),如果你正準(zhǔn)備使用requiredif,這里有一個(gè)簡(jiǎn)短的教程。

                  讓我們假定你有一個(gè)有3個(gè)字段的醫(yī)藥的信息表單,性別sex,懷孕測(cè)試pregnancyTest,測(cè)試結(jié)果testResult,如果性別為'f' or 'F',則懷孕測(cè)試pregnancyTest是required,如果pregnancyTest不是空,測(cè)試結(jié)果testResult是required。

          你的validation.xml 文件的輸入項(xiàng)應(yīng)該是這樣的:

          <form name="medicalStatusForm">

          <field property="pregnancyTest" depends="requiredif">

          <arg0 key="medicalStatusForm.pregnancyTest.label"/>

          <var>

          <var-name>field[0]</var-name>

          <var-value>sex</var-value>

          </var>

          <var>

          <var-name>fieldTest[0]</var-name>

          <var-value>EQUAL</var-value>

          </var>

          <var>

          <var-name>fieldValue[0]</var-name>

          <var-value>F</var-value>

          </var>

          <var>

          <var-name>field[1]</var-name>

          <var-value>sex</var-value>

          </var>

          <var>

          <var-name>fieldTest[1]</var-name>

          <var-value>EQUAL</var-value>

          </var>

          <var>

          <var-name>fieldValue[1]</var-name>

          <var-value>f</var-value>

          </var>

          <var>

          <var-name>fieldJoin</var-name>

          <var-value>OR</var-value>

          </var>

          </field>

          <field property="testResult" depends="requiredif">

          <arg0 key="medicalStatusForm.testResult.label"/>

          <var>

          <var-name>field[0]</var-name>

          <var-value>pregnancyTest</var-value>

          </var>

          <var>

          <var-name>fieldTest[0]</var-name>

          <var-value>NOTNULL</var-value>

          </var>

          </field>

          </form>

           

          這里有一個(gè)使用索引的屬性更復(fù)雜的例子,如果你的struts-config.xml 有這下面:

          <form-bean name="dependentlistForm"

          type="org.apache.struts.webapp.validator.forms.ValidatorForm">

          <form-property

          name="dependents"

          type="org.apache.struts.webapp.validator.Dependent[]" size="10"/>

          <form-property name="insureDependents" type="java.lang.Boolean" initial="false"/>

          </form-bean>

          這里dependentlistForm bean有l(wèi)astName,firstName,dob,coverageType四個(gè)屬性,你可以這樣定義一驗(yàn)證規(guī)則:

          <form name="dependentlistForm">

          <field

          property="firstName" indexedListProperty="dependents" depends="requiredif">

          <arg0 key="dependentlistForm.firstName.label"/>

          <var>

          <var-name>field[0]</var-name>

          <var-value>lastName</var-value>

          </var>

          <var>

          <var-name>fieldIndexed[0]</var-name>

          <var-value>true</var-value>

          </var>

          <var>

          <var-name>fieldTest[0]</var-name>

          <var-value>NOTNULL</var-value>

          </var>

          </field>

           

          <field

          property="dob" indexedListProperty="dependents" depends="requiredif,date">

          <arg0 key="dependentlistForm.dob.label"/>

          <var>

          <var-name>field[0]</var-name>

          <var-value>lastName</var-value>

          </var>

          <var>

          <var-name>fieldIndexed[0]</var-name>

          <var-value>true</var-value>

          </var>

          <var>

          <var-name>fieldTest[0]</var-name>

          <var-value>NOTNULL</var-value>

          </var>

          </field>

           

          <field

          property="coverageType" indexedListProperty="dependents" depends="requiredif">

          <arg0 key="dependentlistForm.coverageType.label"/>

          <var>

          <var-name>field[0]</var-name>

          <var-value>lastName</var-value>

          </var>

          <var>

          <var-name>fieldIndexed[0]</var-name>

          <var-value>true</var-value>

          </var>

          <var>

          <var-name>fieldTest[0]</var-name>

          <var-value>NOTNULL</var-value>

          </var>

          <var>

          <var-name>field[1]</var-name>

          <var-value>insureDependents</var-value>

          </var>

          <var>

          <var-name>fieldTest[1]</var-name>

          <var-value>EQUAL</var-value>

          </var>

          <var>

          <var-name>fieldValue[1]</var-name>

          <var-value>true</var-value>

          </var>

          <var>

          <var-name>fieldJoin</var-name>

          <var-value>AND</var-value>

          </var>

          </field>

          </form>

          這里的意思是:

          如果lastName 字段是非空的,firstName 字段required。因?yàn)樽侄蜪ndexed 為真,這它意味著lastName的indexed 必須與firstName 的索引的一樣,dob同理,除非date不為空。

          如果lastName 用樣索引時(shí)的值不空, 而且非索引字段insureDependents為真,則coverageType 是only require。

          你可以對(duì)字段在[n]中使用任意數(shù)字,唯一的限制是他們必須都是AND或OR,你無(wú)法混合使用。

          Deprecation:

          u        JavaScript 和Java的range方法.

          u        StrutsValidator &StrutsValidatorUtil 類(lèi)中的Deprecation方法
          驗(yàn)證器api指南

          一個(gè)簡(jiǎn)明的Struts驗(yàn)證器API指南 可以幫助你開(kāi)始。
          驗(yàn)證器資源

          Struts Validator: Validating Two Fields Match 作者M(jìn)att Raible。(兩個(gè)字段匹配驗(yàn)證)關(guān)于使用方法的文章。(范例部分為翻譯此文內(nèi)容)

          DynaForms and the Validator 作者James Turner and Kevin Bedell。Struts Kickstart的其中一章(動(dòng)態(tài)form和驗(yàn)證器),可以自由下載PDF).

          Validating user input 作者 David Winterfeldt and Ted Husted。Struts in Action的其中一章,可以自由下載(PDF)。

          posted @ 2009-01-07 09:52 Hill 閱讀(205) | 評(píng)論 (0)編輯 收藏
           

          首先,我先大概介紹一下jpetstore的整體架構(gòu),spring的這個(gè)版本主要使用了struts+spring+ibatis的框架組合,
          而在MVC層的框架,這個(gè)版本又同時(shí)提供了兩個(gè)實(shí)現(xiàn)版本,一個(gè)是struts,一個(gè)是spring 自帶的web框架,

          而數(shù)據(jù)庫(kù)持久層使用的是ibatis框架,這個(gè)框架是一個(gè)SQL映射框架,輕量級(jí)而且使用非常容易,基本上會(huì)

          使用JDBC的朋友看一兩個(gè)小時(shí)就會(huì)使用了。
          下圖是該應(yīng)用的一個(gè)簡(jiǎn)略架構(gòu)圖,沒(méi)有什么好的工具,就大概畫(huà)了一個(gè),雖然比較簡(jiǎn)單,不過(guò)也基本可以

          概括應(yīng)用的整體框架了,首先是JSP請(qǐng)求,通過(guò)struts-config.xml(這里只是根據(jù)struts來(lái)畫(huà)的,spring其實(shí)也差不多),

          請(qǐng)求轉(zhuǎn)到相應(yīng)的Action中,可以看到,這里有一個(gè)BaseAction,是所有Action實(shí)現(xiàn)的父類(lèi),這個(gè)類(lèi)的作用稍后再講,

          然后就是每個(gè)Action通過(guò)PetStoreFacade的對(duì)象調(diào)用后臺(tái)DAO對(duì)象,從而通過(guò)ibatis進(jìn)行數(shù)據(jù)的持久操作,

          這里使用了門(mén)面(Facade)模式,隔離了前臺(tái)與后臺(tái)耦合度,而PetStoreFacade就是這個(gè)門(mén)面。結(jié)合下圖,

          相信大家對(duì)整個(gè)jpetstore會(huì)有個(gè)大概的了解。

           

           

          好了,大概的結(jié)構(gòu)講了下,接下來(lái)我們就從代碼入手,在這里考慮到struts大家比較熟悉,因此,

          本文是以struts版本來(lái)講,同時(shí)聲明,本文并不會(huì)一段段代碼詳細(xì)講述,而只是提供一個(gè)學(xué)習(xí)的參考,

          大概講解一下流程,讓大家不再茫然不知從哪開(kāi)始,好了,廢話(huà)也不多說(shuō)了。

          既然是WEB應(yīng)用,那當(dāng)然首先從配置文件看起,那就非web.xml莫屬了,打開(kāi)WEB-INF目錄下的web.xml,

          我們挑出目前我們應(yīng)該關(guān)注的配置代碼:
          代碼  
          <servlet>    
             <servlet-name>petstore</servlet-name>    
             <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
             <load-on-startup>2</load-on-startup>    
          </servlet>    
             
          <servlet>    
             <servlet-name>action</servlet-name>    
             <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>    
             <load-on-startup>3</load-on-startup>    
          </servlet>    
             
          <servlet-mapping>    
             <servlet-name>petstore</servlet-name>    
             <!--   
             <servlet-name>action</servlet-name>   
             -->    
             <url-pattern>*.do</url-pattern>    
          </servlet-mapping>
          在這里可看到兩個(gè)servlet設(shè)置,以及一個(gè)servlet mapping,第一個(gè)petstore的servlet是用于spring web框架的,

          而第二個(gè)action的servlet就是用于struts的,而這個(gè)版本的mapping默認(rèn)的是使用spring web,可以看到,<servlet-name>action</servlet-name>這一行是被注釋掉了,我們要使用struts的話(huà),那就把這個(gè)注釋去掉,

          改為注釋掉<servlet-name>petstore</servlet-name>,好了,如此注釋以后,整個(gè)應(yīng)用就會(huì)以struts的框架運(yùn)行。

          (這些配置是什么意思?如果你還搞不懂的話(huà),建議你先去學(xué)學(xué)基礎(chǔ)再來(lái)研究應(yīng)用吧)

          接下來(lái)我們可以打開(kāi)strutc-config.xml文件,這里就是struts的默認(rèn)配置文件,在這里可以看到struts的相關(guān)配置信息。

          好了,接下來(lái)我們就以一個(gè)請(qǐng)求來(lái)講述基本的請(qǐng)求流程,以search為例,生成項(xiàng)目,再啟動(dòng),

          成功之后進(jìn)入應(yīng)用的首頁(yè),我們終于可以看到久違的鸚鵡界面了,激動(dòng)吧,呵呵,在界面的右上角,

          有一個(gè)Search文本框,我們就以這個(gè)Search為例子來(lái)講解,輸入一個(gè)關(guān)鍵字cat,然后點(diǎn)search,

          結(jié)果出來(lái)了,這個(gè)過(guò)程的內(nèi)部是如何運(yùn)作的呢?

          我們用鼠標(biāo)右鍵點(diǎn)擊頁(yè)面,然后選擇屬性,我們看到顯示的地址可能是:
          http://localhost:8080/shop/searchProducts.do;jsessionid=E2D01E327B82D068FEE9D073CA33A2A3

          這個(gè)地址就是我們剛才點(diǎn)擊查詢(xún)時(shí)提交的地址了,我們看到searchProducts.do這個(gè)字符串,

          我們之前在web.xml里面的設(shè)置大家還記得嗎?
          <servlet-mapping>
             <!--
             <servlet-name>petstore</servlet-name>
             -->
             <servlet-name>action</servlet-name>
             <url-pattern>*.do</url-pattern>
          </servlet-mapping>
          代表著所有以.do為結(jié)尾的請(qǐng)求,都將被名叫action的servlet處理,也就是通過(guò)struts-config配置進(jìn)行處理,那我們就去struts-config.xml里面看看,打開(kāi)struts-config.xml文件,ctrl+F彈出查詢(xún)界面,輸入searchProducts,我們就可查到
          <action path="/shop/searchProducts" type="org.springframework.samples.jpetstore.web.
          struts.SearchProductsAction" name="emptyForm" scope="session" validate="false">    
          <forward name="success" path="/WEB-INF/jsp/struts/SearchProducts.jsp"/>    
          </action>
          根據(jù)以上配置,我們可以得知,剛才我們的提交將會(huì)被SearchProductsAction處理,而該action的form是emptyForm,查找emptyForm這個(gè)別名,我們可以找到它指向一個(gè)BaseActionForm,打開(kāi)這個(gè)form我們可以看到,里面只有兩個(gè)validate方法和一個(gè)addErrorIfStringEmpty方法,沒(méi)有任何的屬性,那就是說(shuō)search這個(gè)提交并沒(méi)有把我們輸入的關(guān)鍵字保存在form里面,打開(kāi)SearchProductsAction,我們看到execute方法里的第一句就是

          String keyword = request.getParameter("keyword");
          也就是說(shuō)我們輸入的關(guān)鍵字是以參數(shù)的形式傳入到request里面,參數(shù)名字為“keyword”,我們打開(kāi)IncludeTop.jsp,這個(gè)文件在WEB-INF/jsp/struts目錄下。

          注意了,jsp目錄下分別有spring以及struts兩個(gè)目錄,這兩個(gè)目錄就是分別對(duì)應(yīng)兩個(gè)web框架的,我們使用的是struts所以jsp代碼就到struts目錄里面,為什么打開(kāi)IncludeTop.jsp呢,我們可以看到,無(wú)論我們進(jìn)入哪個(gè)頁(yè)面,search那個(gè)文本框都存在,也就是說(shuō),這個(gè)文本框是被當(dāng)作一個(gè)模板插入到所有頁(yè)面當(dāng)中去的,我們隨便打開(kāi)一個(gè)頁(yè)面,就可以看到頁(yè)面開(kāi)頭都是:

          <%@ include file="IncludeTop.jsp" %>
          這句就是把IncludeTop.jsp當(dāng)作頁(yè)面頭部包含進(jìn)來(lái),所以凡是包含這個(gè)頭頁(yè)面的頁(yè)面,他們的頭部都是一樣的,這也是我們?cè)陂_(kāi)發(fā)中常用的一種方式,統(tǒng)一界面的一種方式,我們也可以看到在這些文件尾部也有類(lèi)似的代碼,如:

          <%@ include file="IncludeBottom.jsp" %>

          其作用也是一樣。打開(kāi)IncludeTop.jsp后,我們看到其中有一段代碼:

          <form action="<c:url value="/shop/searchProducts.do"/>" method="post">
          <input type="hidden" name="search" value="true"/>
          <input name="keyword" size="14"/> <input border="0" src="../images/search.gif"

          type="image" name="search"/>
          </form>
          這段代碼就是我們search文本框以及提交鏈接的代碼,在這里就不做詳細(xì)介紹了。

          好了,接下來(lái)我們?cè)倏纯催@個(gè)action的后續(xù)代碼

          if (keyword != null) {  
          if (!StringUtils.hasLength(keyword)) {  
             request.setAttribute("message", "Please enter a keyword to search for,

          then press the search button.");  
             return mapping.findForward("failure");  
             }  
          PagedListHolder productList = new PagedListHolder(getPetStore().

          searchProductList(keyword.toLowerCase()));  
          productList.setPageSize(4);  
          request.getSession().setAttribute("SearchProductsAction_productList", productList);  
          request.setAttribute("productList", productList);  
          return mapping.findForward("success");  
          }

          這里第一句就是判斷keyword是否為空,不為空就執(zhí)行其中的代碼,我們search的時(shí)候這個(gè)keyword肯定是不為空的,

          那就是說(shuō)這段if包含的代碼就是我們search的處理代碼了,有的人也許會(huì)說(shuō),如果我不輸入關(guān)鍵字而直接點(diǎn)search呢,

          這keyword不就是為空了嗎?我想這個(gè)你在此處加個(gè)斷點(diǎn),再運(yùn)行一下就知道了,雖然你沒(méi)有輸入,

          但是keyword一樣不是null,它將是一個(gè)空字符串,而不是空對(duì)象。我們看到if里面還包含有一個(gè)if,

          這里就是判斷keyword是否為空字符串了,StringUtils.hasLength()方式是一個(gè)工具類(lèi),

          用來(lái)判斷keyword是否為空字符串,如果是空字符串就返回false,而這句判斷當(dāng)返回false時(shí),

          因?yàn)榍懊嬗袀€(gè)感嘆號(hào),所以值為false就執(zhí)行被if所包含的語(yǔ)句,里面的代碼就是保存一個(gè)錯(cuò)誤信息,然后return mapping.findForward("failure");,這句的意思就不再解釋了。

          現(xiàn)在假設(shè)我們正確輸入keyword,那么程序?qū)⒉粫?huì)執(zhí)行if語(yǔ)句中的代碼,直接向下執(zhí)行,我們看到


          PagedListHolder productList = new PagedListHolder(getPetStore().

          searchProductList(keyword.toLowerCase()));

          這句代碼,PagedListHolder是spring提供的一個(gè)用來(lái)保存查詢(xún)結(jié)構(gòu)類(lèi),通常用來(lái)進(jìn)行分頁(yè)處理,

          因此我們可以知道

          getPetStore().searchProductList(keyword.toLowerCase())
          這一句就是用來(lái)查詢(xún),并返回查詢(xún)結(jié)果的。getPetStore()這個(gè)方法是繼承自BaseAction的,它將獲得一個(gè)PetStoreFacade的實(shí)現(xiàn),我們打開(kāi)BaseAction的代碼,可以看到如下代碼

          public void setServlet(ActionServlet actionServlet) {  
                 super.setServlet(actionServlet);  
                 if (actionServlet != null) {  
                     ServletContext servletContext = actionServlet.getServletContext();  
                 WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);  
                 this.petStore = (PetStoreFacade) wac.getBean("petStore");  
                 }  
          }

          這句代碼里面最重要的一句就是

          WebApplicationContext wac = WebApplicationContextUtils.

          getRequiredWebApplicationContext(servletContext);
          這句代碼的作用就是獲取一個(gè)WebApplicationContext對(duì)象wac,在這里我們只需要知道這個(gè)對(duì)象的作用,而不對(duì)其進(jìn)行深入研究,通過(guò)這個(gè)對(duì)象,我們可以根據(jù)spring的配置文件,獲得相應(yīng)的Bean,下面這句就是用來(lái)獲取相應(yīng)bean的語(yǔ)句:


          this.petStore = (PetStoreFacade) wac.getBean("petStore");
          petStore這個(gè)就是bean的id,這個(gè)petStore的bean具體是哪個(gè)類(lèi)呢?我們打開(kāi)applicationContext.xml,可以找到以下配置代碼


          <bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
             <property name="accountDao" ref="accountDao"/>
             <property name="categoryDao" ref="categoryDao"/>
             <property name="productDao" ref="productDao"/>
             <property name="itemDao" ref="itemDao"/>
             <property name="orderDao" ref="orderDao"/>
          </bean>
          從這里可以看到,petStoreFacade的具體類(lèi)就是PetStoreImpl,而這個(gè)類(lèi)當(dāng)中,分別通過(guò)spring IOC注入了幾個(gè)DAO的bean,這幾個(gè)DAO的配置可以在dataAccessContext-local.xml文件里面找到,我們打開(kāi)PetStoreImpl這個(gè)實(shí)現(xiàn)類(lèi),我們看到類(lèi)里有一個(gè)searchProductList方法,這個(gè)方法就是我們?cè)贏ction當(dāng)中調(diào)用的方法

          return this.productDao.searchProductList(keywords);
          從這句代碼可以看出,這個(gè)方法是通過(guò)調(diào)用productDao的searchProductList方法來(lái)獲得結(jié)果的,

          productDao這個(gè)DAO從上面的配置文件可以看出,是通過(guò)IOC容器進(jìn)行注入的,我們打開(kāi)dataAccessContext-local.xml文件,可以看到

          <bean id="productDao" class="org.springframework.samples.jpetstore.dao.ibatis

          .SqlMapProductDao">
             <property name="sqlMapClient" ref="sqlMapClient"/>
          </bean>
          這句配置代表了productDao的實(shí)現(xiàn)類(lèi)就是SqlMapProductDao,同時(shí)這個(gè)類(lèi)包含有一個(gè)sqlMapClient的屬性對(duì)象,這個(gè)對(duì)象也是通過(guò)ioc注入的,再在這個(gè)配置文件里,我們可以找到如下一段代碼

          <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
             <property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
             <property name="dataSource" ref="dataSource"/>
          </bean>
          這段代碼就是sqlMapClient這個(gè)bean的配置,這里的實(shí)現(xiàn)是SqlMapClientFactoryBean,它是spring專(zhuān)門(mén)為ibatis框架提供的一個(gè)支持,通過(guò)這個(gè)對(duì)象就可以很好的集成ibatis框架,具體的介紹可以通過(guò)spring官方文檔或者是其他一些教程獲得,在這里就不多做介紹。

          好了,接下來(lái)我們知道了,實(shí)際查詢(xún)數(shù)據(jù)是通過(guò)DAO的實(shí)現(xiàn)類(lèi)SqlMapProductDao進(jìn)行的,而SqlMapProductDao當(dāng)中就是通過(guò)了ibatis進(jìn)行數(shù)據(jù)的查詢(xún),從而返回結(jié)果,這里也就不多做介紹了,大家可以通過(guò)ibatis的教程獲得ibatis的使用方法,非常的簡(jiǎn)單,search操作從前臺(tái)到后臺(tái)的大概流程就介紹到這里了。

          在這個(gè)參考文章中,我并沒(méi)有對(duì)具體技術(shù)做過(guò)多的講解,那是因?yàn)楸疚闹皇亲鳛橐粋€(gè)研究jpetstore的參考,提供一個(gè)可供參考的研究流程,主要是為了那些想開(kāi)始研究jpetstore但是又不知道從哪開(kāi)始或者是不知道如何進(jìn)行研究的新人朋友們而準(zhǔn)備的,如果具體的講解每一部分,那我想將不僅僅是一篇文章就可以完成的事情,因?yàn)檫@里涉及到struts,spring,ibatis等具體的框架技術(shù),每一個(gè)框架基本都可以寫(xiě)成一本書(shū),用一篇文章來(lái)講就不太實(shí)際了,而且我個(gè)人更傾向于遇到不理解的地方的時(shí)候,多使用google來(lái)搜索,這樣能夠進(jìn)一步加深自己對(duì)問(wèn)題的理解。

          好了,關(guān)于jpetstore源碼研究入門(mén)的文章就寫(xiě)到這里結(jié)束了,由于本人技術(shù)和文筆有限,有錯(cuò)漏或者表達(dá)不當(dāng)?shù)牡胤秸?qǐng)不要介意,歡迎各位朋友來(lái)指正。

          posted @ 2009-01-06 15:50 Hill 閱讀(3783) | 評(píng)論 (0)編輯 收藏
           
          本人剛轉(zhuǎn)到Java技術(shù)方向,希望能在這里與大家一起學(xué)習(xí),進(jìn)步。
          posted @ 2009-01-05 17:24 Hill 閱讀(384) | 評(píng)論 (0)編輯 收藏
          CALENDER
          <2009年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜


          Powered By: 博客園
          模板提供滬江博客

          主站蜘蛛池模板: 津南区| 应用必备| 东乌珠穆沁旗| 柞水县| 南康市| 玉林市| 三穗县| 黔西县| 双流县| 南平市| 长治县| 桐庐县| 广平县| 亚东县| 赣榆县| 临泽县| 云和县| 舟山市| 贵港市| 兴海县| 南丰县| 叙永县| 哈巴河县| 寿宁县| 始兴县| 西充县| 棋牌| 高碑店市| 溧阳市| 济宁市| 安龙县| 屯门区| 洛扎县| 曲水县| 陆川县| 遂溪县| 巫山县| 池州市| 军事| 区。| 永州市|