JaveShare&OpenSpace

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            7 Posts :: 0 Stories :: 7 Comments :: 0 Trackbacks

          2006年8月11日 #

          提問(wèn):茉莉花、太陽(yáng)花、玫瑰花哪一朵花最沒(méi)力?


          回答:茉莉花。


          原因:好一朵美麗(沒(méi)力)的茉莉花。


          提問(wèn):猩猩最討厭什么線?


          回答:平行線。


          原因:平行線沒(méi)有相交(香蕉)。


          提問(wèn):橡皮、老虎皮、獅子皮哪一個(gè)最不好?


          回答:橡皮。


          原因:橡皮擦(橡皮差)。


          提問(wèn):布和紙怕什么?


          回答:布怕一萬(wàn),紙怕萬(wàn)一。


          原因:不(布)怕一萬(wàn),只(紙)怕萬(wàn)一。


          提問(wèn):鉛筆姓什么?


          回答:蕭。


          原因:削(蕭)鉛筆。



          提問(wèn):麒麟到了北極會(huì)變成什么?



          回答:冰淇凌。



          原因:冰淇凌(冰麒麟)。



          提問(wèn):哪位歷史人物最欠扁?



          回答:蘇武。



          原因:蘇武牧羊北海邊(被海扁)。



          提問(wèn):從1到9哪個(gè)數(shù)字最勤勞,哪個(gè)數(shù)字最懶惰?



          回答:1懶惰;2勤勞。



          原因:一(1)不做二(2)不休。



          提問(wèn):怎樣使麻雀安靜下來(lái)?



          回答:壓它一下。



          原因:鴉雀無(wú)聲(壓雀無(wú)聲)。



          提問(wèn):歷史上哪個(gè)人跑的最快?



          回答:曹操



          原因:說(shuō)曹操曹操到



          問(wèn)題:米她媽是誰(shuí)



          答案:花



          原因:花生米



          小白加小白等于什么?



          等于小白兔



          原因:小白TWO




          30-50哪個(gè)數(shù)字比熊的大便厲害!!



          答案:40(事實(shí)勝于雄(熊)辯
          posted @ 2006-10-25 16:39 ~哈哈~ 閱讀(361) | 評(píng)論 (0)編輯 收藏

          一、集群的基本概念

          Cluster 集群技術(shù)可如下定義 : 一組相互獨(dú)立的服務(wù)器在網(wǎng)絡(luò)中表現(xiàn)為單一的系統(tǒng),并以單一系統(tǒng)的模式加以管理。此單一系統(tǒng)為客戶工作站提供高可靠性的服務(wù)。

          大多數(shù)模式下,集群中所有的計(jì)算機(jī)擁有一個(gè)共同的名稱(chēng),集群內(nèi)任一系統(tǒng)上運(yùn)行的服務(wù)可被所有的網(wǎng)絡(luò)客戶所使用。 Cluster 必須可以協(xié)調(diào)管理各分離的組件的錯(cuò)誤和失敗,并可透明地向 Cluster 中加入組件。

          一個(gè) Cluster 包含多臺(tái) ( 至少二臺(tái) ) 擁有共享數(shù)據(jù)存儲(chǔ)空間的服務(wù)器。任何一臺(tái)服務(wù)器運(yùn)行一個(gè)應(yīng)用時(shí),應(yīng)用數(shù)據(jù)被存儲(chǔ)在共享的數(shù)據(jù)空間內(nèi)。每臺(tái)服務(wù)器的操作系統(tǒng)和應(yīng)用程序文件存儲(chǔ)在其各自的本地儲(chǔ)存空間上。

          Cluster 內(nèi)各節(jié)點(diǎn)服務(wù)器通過(guò)一內(nèi)部局域網(wǎng)相互通訊。當(dāng)一臺(tái)節(jié)點(diǎn)服務(wù)器發(fā)生故障時(shí),這臺(tái)服務(wù)器上所運(yùn)行的應(yīng)用程序?qū)⒃诹硪还?jié)點(diǎn)服務(wù)器上被自動(dòng)接管。當(dāng)一個(gè)應(yīng)用服務(wù)發(fā)生故障時(shí),應(yīng)用服務(wù)將被重新啟動(dòng)或被另一臺(tái)服務(wù)器接管。當(dāng)以上任一故障發(fā)生時(shí),客戶將能很快連接到新的應(yīng)用服務(wù)上。

          二、jboss-4.0.2集群配置指南
          版權(quán)申明: 轉(zhuǎn)載請(qǐng)保留以下作者信息
          作者:
          bromon原創(chuàng)
          關(guān)鍵詞:JBoss 4.0.2??Clustering

          本文主要講解JBoss cluster的基本知識(shí)以及簡(jiǎn)單的配置方法,其間涉及了一些jboss的補(bǔ)充知識(shí)。

          一、材料準(zhǔn)備:

          1、JBoss 4.0.2 ??

          JBoss各個(gè)版本之間差異比較大,即使同為jboss 4.x的版本,內(nèi)部組件的版本也不一致,所以請(qǐng)盡量使用同一版本的server。目前已經(jīng)證明可以配置cluster的版本多為jboss 3.2.6和jboss 4.0.2。

          2、Apache 2.0.54
          ?? 下載地址:http://archive.apache.org/dist/httpd/httpd-2.0.54.tar.gz
          3、Apache mod_jk-1-2-13-apache-2-0-54
          ?? 下載地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.14/jakarta-tomcat-connectors-jk-1.2.14-linux-rhel3-i386-prefork.so

          二、安裝:

          1、jboss4.0.2與apache 2.0.54的安裝請(qǐng)自行搞定。假設(shè)jboss的安裝目錄為%jboss%,apache安裝目錄為%apache%。

          2、mod_jk的安裝。

          從apache.org獲得文件mod_jk-1-2-13-apache-2-0-54.so,將該文件拷貝到%apache%\ modules。

          三、jboss cluster入門(mén)

          ????Jboss 支持如下類(lèi)型的cluster:EJB、web、JNDI、JMS,我們主要了解web cluster。

          Web cluster實(shí)際上可以劃分為兩個(gè)話題:負(fù)載均衡 (load balance) 和狀態(tài)同步。它們是互相獨(dú)立的,單獨(dú)配置。

          負(fù)載均衡的概念比較簡(jiǎn)單,重要的是負(fù)載均衡的粒度。可以選擇針對(duì)每個(gè)request的均衡,或者是針對(duì)每個(gè)用戶的均衡。選擇不同的粒度,需要不同的狀態(tài)同步方式。

          1、基于request的負(fù)載均衡

          ???? 該種方式下,負(fù)載均衡器 (load balancer)會(huì)根據(jù)各個(gè)node的狀況,把每個(gè)http request進(jìn)行分發(fā)。使用這樣的均衡策略,就必須在多個(gè)node之間復(fù)制用戶的session,實(shí)時(shí)保持整個(gè)cluster的用戶狀態(tài)同步,這種操作被稱(chēng)為session復(fù)制 (session replication)。Jboss的實(shí)現(xiàn)原理是使用攔截器(interceptor),根據(jù)用戶的同步策略攔截request,做同步處理后再交給server產(chǎn)生響應(yīng)。

          ????該方法的優(yōu)點(diǎn)是客戶不會(huì)被綁定都具體的node,只要還有一個(gè)node存活,用戶狀態(tài)都不會(huì)丟失,cluster都能夠繼續(xù)工作。缺點(diǎn)是node之間通信頻繁,響應(yīng)速度有影響,多并發(fā)、高頻操作的情況下性能下降比較厲害。

          2、基于用戶的負(fù)載均衡

          該種方式下,當(dāng)用戶發(fā)出第一個(gè)request后,負(fù)載均衡器動(dòng)態(tài)的把該用戶分配到某個(gè)節(jié)點(diǎn),并記錄該節(jié)點(diǎn)的jvm路由,以后該用戶的所有request都會(huì)被綁定這個(gè)jvm路由,用戶只會(huì)與該server發(fā)生交互,這種策略被稱(chēng)為粘性session(session sticky)。

          該方法的優(yōu)點(diǎn)是響應(yīng)速度快,多個(gè)節(jié)點(diǎn)之間無(wú)須通信。缺點(diǎn)也很明顯,某個(gè)node死掉以后,它負(fù)責(zé)的所有用戶都會(huì)丟失session。

          四、實(shí)戰(zhàn)

          1、負(fù)載均衡

          ????Jboss的負(fù)載均衡目前有兩種方案,一是使用apache的mod_jk,二是使用jboss自帶的負(fù)載均衡模塊。下面分別講解這兩種配置。

          mod_jk的配置

          1、請(qǐng)確認(rèn)%apache%\modules下已經(jīng)有mod_jk-1-2-13-apache-2-0-54.so文件。

          2、修改%apache%\conf\httpd.conf????在文件末尾添加:????Include conf/mod_jk2.conf

          3、在%apache%\conf下新建文件????mod_jk2.conf????????文件內(nèi)容如下:

          # Load mod_jk module. Specify the filename
          # of the mod_jk lib you’ve downloaded and
          # installed in the previous section
          LoadModule jk_module modules/mod_jk-1-2-13-apache-2-0-54.so
          # Where to find workers.properties
          JkWorkersFile conf/workers2.properties
          # Where to put jk logs
          JkLogFile logs/mod_jk.log
          # Set the jk log level [debug/error/info]
          JkLogLevel info
          # Select the log format
          JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
          # JkOptions indicate to send SSL KEY SIZE,
          JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
          # JkRequestLogFormat set the request format
          JkRequestLogFormat "%w %V %T"
          JkMount /* loadbalancer


          其中JkMount /* loadbalancer的意思是,把所有的請(qǐng)求都發(fā)給loadbalancer處理。可以通過(guò)修改url來(lái)控制發(fā)送某些request。

          4、在%apache%\conf下新建文件????workers2.properties????????其內(nèi)容為:

          worker.list=loadbalancer,server1,server2

          # Define the first node...
          worker.server1.port=8009
          worker.server1.host=172.16.0.116
          worker.server1.type=ajp13
          worker.server1.lbfactor=1
          worker.server1.local_worker=1
          worker.server1.cachesize=10

          # Define the first node...
          worker.server2.port=8009
          worker.server2.host=172.16.32.88
          worker.server2.type=ajp13
          worker.server2.lbfactor=1
          worker.server2.local_worker=1
          worker.server2.cachesize=10

          # Now we define the load-balancing behaviour
          worker.loadbalancer.type=lb
          worker.loadbalancer.balanced_workers=server1,server2
          worker.loadbalancer.sticky_session=1


          其中對(duì)于node的命名規(guī)則是worker.節(jié)點(diǎn)名.xxxx。所以上述文件定義了兩個(gè)節(jié)點(diǎn):server1和server2。8009端口是jboss默認(rèn)的ajp端口,另外需要注意的是worker.server2.lbfactor參數(shù),它是節(jié)點(diǎn)的負(fù)載加權(quán),它的值越大,獲得負(fù)載的機(jī)會(huì)就越大。可以根據(jù)node的硬件性能進(jìn)行調(diào)整。worker.loadbalancer.sticky_session參數(shù)是指定是否使用粘性session。

          所有需要負(fù)載均衡的節(jié)點(diǎn),都必須在worker.loadbalancer.balanced_workers參數(shù)中列舉出來(lái)。

          請(qǐng)記住所有node的名稱(chēng)和它對(duì)應(yīng)著哪臺(tái)機(jī)器,后面的配置中會(huì)使用。

          嘗試啟動(dòng)apache:%apache\bin\apache.exe,正常情況下沒(méi)有任何提示。如果你使用的jk是2.0的,那么配置文件的寫(xiě)法完全不同,由于mod_jk2已經(jīng)停止開(kāi)發(fā),所以apache并沒(méi)有提供任何講解,對(duì)于配置文件的編寫(xiě)也沒(méi)有任何指導(dǎo)。

          Jboss自帶均衡器的配置

          ???? 將文件夾%jboss%\docs\examples\varia\loadbalancer\loadbalancer.sar拷貝到%jboss%\ server\all\deploy下,并且修改loadbalancer.sar\loadbalancer.sar\META-INF\jboss- service.xml,在<host>標(biāo)簽中類(lèi)出所有節(jié)點(diǎn),在<sticky-session>標(biāo)簽中指定是否使用粘性 session。配置完成。

          ????該均衡器的缺點(diǎn)是負(fù)載能力相對(duì)不高,配置參數(shù)太少,比如無(wú)法指定不同節(jié)點(diǎn)的負(fù)載加權(quán),所以后面都以mod_jk為例,不再講解jboss自帶的負(fù)載均衡器的內(nèi)容。


          ????負(fù)載均衡的配置基本完成,啟動(dòng)jboss,其中過(guò)程中會(huì)列出DefaultPatition中所有的節(jié)點(diǎn):

          run.bat -c all

          2、session sticky配置

          ????apache 應(yīng)該會(huì)以粘性session的方式分發(fā)請(qǐng)求。部署一個(gè)應(yīng)用測(cè)試一下,你會(huì)發(fā)現(xiàn)粘性session沒(méi)有起作用。因?yàn)槲覀冞€沒(méi)有給jboss配置jvm路由 ( jvmRoute),apache就無(wú)法知道究竟哪些session是屬于哪個(gè)節(jié)點(diǎn)的。我們繼續(xù)往下:

          ????修改server1機(jī)器上的jboss的配置文件:%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ META-INF\ jboss-service.xml

          ????在110行有:<attribute name="UseJK">false</attribute>,將它改為true。值得注意的是在這行標(biāo)簽上面有一段注釋?zhuān)竽阍趕erver.xml中必須有:
          Engine name="jboss.web" jmvRoute="Node1" defaultHost="localhost"

          ????請(qǐng)注意這里有一個(gè)氣死人不償命的小bug,jboss的官方文檔把 jvmRoute寫(xiě)成了jmvRoute,就是v和m兩個(gè)字母的顛倒讓我郁悶了三天,翻遍了jboss.com和theserverside.com。都是直接拷貝的錯(cuò),吐血吐到脫水啊。

          ????下面需要修改server1上的%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ server.xml,在32行左右有:

          <Engine name="jboss.web" defaultHost="localhost">


          給它增加一個(gè)jvmRoute屬性:

          <Engine jvmRoute="server1" name="jboss.web" defaultHost="localhost">


          請(qǐng)注意,jvmRoute的值必須和mod_jk中的節(jié)點(diǎn)名字正確對(duì)應(yīng),否則無(wú)法正確路由。Cluster中的所有節(jié)點(diǎn)都應(yīng)該做相應(yīng)的配置。

          Jboss的配置完成了,下面需要在你的web應(yīng)用中修改配置文件,讓它支持集群。

          在WEB-INF\web.xml中加入屬性:????<distributable/>

          Ok,基于用戶的cluster完成了,每個(gè)用戶會(huì)綁定都某個(gè)節(jié)點(diǎn)上進(jìn)行交互。這種綁定是如何完成的呢?原來(lái)apache把客戶分發(fā)到節(jié)點(diǎn)后,該節(jié)點(diǎn)會(huì)在用戶的session id后面加上此節(jié)點(diǎn)的路由名稱(chēng),變成這個(gè)樣子:

          Efdfxxd98daja87daj76da2dka**,server1

          ????有了這個(gè)標(biāo)志,就能分辨該session屬于哪個(gè)節(jié)點(diǎn)。

          3、session replication配置

          ???? 下面要做的是基于request的cluster,也就讓各個(gè)節(jié)點(diǎn)之間互相復(fù)制session狀態(tài)。有兩種復(fù)制模式,同步與異步。使用同步的方式, jboss會(huì)把session復(fù)制的操作和對(duì)request的響應(yīng)放到一個(gè)應(yīng)用事務(wù)(application transaction),session 復(fù)制完成后才去處理request。異步復(fù)制則發(fā)送session復(fù)制的消息后馬上處理request,session復(fù)制則會(huì)稍有延遲。但是在多框架的 web頁(yè)面中,這樣的集群方式會(huì)有問(wèn)題。由于frame在同一時(shí)間發(fā)出多個(gè)request,會(huì)造成一些混亂,這也是采用基于用戶的集群方式的原因之一。

          ????JBoss 4.0.2 中采用了Jboss cache來(lái)實(shí)現(xiàn)session復(fù)制,實(shí)際上就是一個(gè)分布式緩存,由于session id中包含了jvm route,所以能夠分辨session屬于哪個(gè)節(jié)點(diǎn)。Session的更新類(lèi)似于hibernate中的樂(lè)觀鎖,有了更新之后就讓session的版本號(hào)增加,其他節(jié)點(diǎn)通過(guò)對(duì)比版本號(hào)來(lái)決定是否同步session狀態(tài)。

          ????配置session replication首先需要編輯
          %jboss% server\all\deploy\jbossweb-tomcat55.sar\META-INF\ jboss-service.xml,88行左右有:

          <attribute name="SnapshotMode">instant</attribute>


          這就是剛才提到的復(fù)制模式,instant為立即復(fù)制,如果設(shè)為interval 那么系統(tǒng)會(huì)在延遲一段時(shí)間再進(jìn)行復(fù)制,時(shí)間長(zhǎng)度在< attribute name="SnapshotInterval">2000</attribute>中指定,單位是毫秒。

          單獨(dú)配置這一個(gè)地方還不夠,在%jboss% server\all\deploy\ tc5-cluster-service.xml中有:

          <attribute name="CacheMode">REPL_ASYNC</attribute>


          這里才真正決定復(fù)制是同步的還是異步的,可以指定為REPL_ASYNC(異步)或者REPL_SYNC(同步)。

          在這個(gè)文件下面一點(diǎn),還有一個(gè)config標(biāo)簽,里面指定了各個(gè)節(jié)點(diǎn)在進(jìn)行session復(fù)制的時(shí)候如何通信,有udp和tcp兩種可選,如果使用udp方式,那么應(yīng)該將udp的lookback屬性指定為true,因?yàn)閣indows上有一個(gè)叫做media sense的東西會(huì)影響 udp multicast。注意如果你不了解multi address的ip規(guī)則,請(qǐng)不要隨便修改mcast_addr的值。如果采用tcp方式的話,應(yīng)該指定bind_addr的值為本機(jī)ip,并且在TCPPING標(biāo)簽的initial_hosts屬性中列出所有節(jié)點(diǎn),格式是”機(jī)器名[端口號(hào)]”,比如在我們的例子中,就應(yīng)該這樣配置tcp(以其中一個(gè)節(jié)點(diǎn)為例):

          <config>
          <TCP bind_addr="172.16.0.116" start_port="7810" loopback="true"/>
          <TCPPING initial_hosts="172.16.0.116[7810],172.16.32.88[7810]" port_range="3" timeout="3500"
          num_initial_members="3" up_thread="true" down_thread="true"/>
          <MERGE2 min_interval="5000" max_interval="10000"/>
          <FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" />
          <VERIFY_SUSPECT timeout="1500" down_thread="false" up_thread="false" />
          ????<pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100"
          ???????? retransmit_timeout="3000"/>
          ????<pbcast.STABLE desired_avg_gossip="20000" down_thread="false" up_thread="false" />
          ????<pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false"
          print_local_addr="true" down_thread="true" up_thread="true"/>
          <pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/>
          </config>


          ????JBoss的clustering版主建議盡量使用udp。不過(guò)在Sobey內(nèi)部,建議使用tcp方式,經(jīng)測(cè)試可能有不明物體在影響udp通信,導(dǎo)致Timeout異常。

          ???? 在%jboss%\ server\all\deploy\ cluster-service.xml中也有關(guān)于udp和tcp的配置信息,在4.0以前版本的jboss中,會(huì)以這個(gè)文件為主配置,4.0以后都以tc5-cluster-service.xml為主配置。

          ????Jboss的配置完成了,最后需要在web應(yīng)用中增加配置信息,控制session復(fù)制的粒度。在WEB-INF\????jboss-web.xml中增加以下內(nèi)容:

          <replication-config>
          ????<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
          ????<replication-granularity>SESSION</replication-granularity>
          ??</replication-config>


          其中replication-trigger是指定哪些操作引發(fā)session的版本更新,它的取值有:

          SET_AND_GET????????
          SET_AND_NON_PRIMITIVE_GET
          SET


          replication-granularity是復(fù)制粒度,可以取session或attribute。如果取為attribute有可能導(dǎo)致復(fù)制失敗,這是目前版本的jboss cache的一個(gè)bug,等待修正。

          部署項(xiàng)目,測(cè)試,如果配置沒(méi)有問(wèn)題,可以在%jboss%\0server\all\log\server.log中發(fā)現(xiàn)類(lèi)似于這樣的信息:

          DEBUG [org.jboss.web.tomcat.tc5.session.JBossCacheManager] check to see if needs to store and replicate session with id Im9-qpuaXppMS+xXwE3M+Q**.server1 

          DEBUG [org.jboss.web.tomcat.tc5.session.ClusteredSession] processSessionRepl(): session is dirty. Will increment version from: 20 and replicate.


          ????Session replication配置的成功率比較低,情況也很復(fù)雜,請(qǐng)仔細(xì)操作。

          五、分布式熱部署(distributable hot deploy)

          ???? 在一個(gè)節(jié)點(diǎn)很多的cluster中,如果部署應(yīng)用的時(shí)候必須把程序文件拷貝到每個(gè)機(jī)器上的話,那實(shí)在太愚蠢了,幸好通過(guò)all啟動(dòng)的jboss自動(dòng)支持分布式熱部署。把支持cluster的應(yīng)用(通常需要打包成war文件),放到%jboss%\server\all\farm下,那么處于同一 cluster中的其他節(jié)點(diǎn)會(huì)自動(dòng)下載并且部署,jboss把這個(gè)稱(chēng)為Farm deploy。如下圖:

          image

          posted @ 2006-10-25 11:15 ~哈哈~ 閱讀(786) | 評(píng)論 (0)編輯 收藏

          耶魯 CAS 配置

          拷貝 cas.war tomcat/webapps

          拷貝 casclient.jar tomcat/common/lib

          添加下面的配置到自己 war web.xml 頂部

          <filter>

          ??? <filter-name>CAS Filter</filter-name>

          ??? <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

          ??? <init-param>

          ????? <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

          ????? <param-value>https://localhost:8443/cas/login</param-value>

          ??? </init-param>

          ??? <init-param>

          ????? <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

          ????? <param-value>https://localhost:8443/cas/proxyValidate</param-value>

          ??? </init-param>

          ??? <init-param>

          ????? <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

          ????? <param-value>localhost:8080</param-value>

          ??? </init-param>

          ? </filter>

          ?

          ? <filter-mapping>

          ??? <filter-name>CAS Filter</filter-name>

          ??? <url-pattern>/*</url-pattern>

          ? </filter-mapping>

          ?

          tomcat/conf/server.xml 打開(kāi) 8443 那個(gè) connector.

          如果沒(méi)有就添加 :

          ?? <Connector port="8443" maxHttpHeaderSize="8192"

          ?????????????? maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

          ?????????????? enableLookups="false" disableUploadTimeout="true"

          ?????????????? acceptCount="100" scheme="https" secure="true"

          ?????????????? clientAuth="false" sslProtocol="TLS" />

          執(zhí)行 :

          %java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA

          ?

          名字 : localhost.

          密碼 :changeit

          其他 , 隨便

          Export the certificate from the .keystore file to a file called server.crt.

          ?

          ?????? %java_home%\bin\keytool -export -alias tomcat -file server.crt

          ?

          Import the certificate into the default jvm truststore.

          ?

          ?????? %java_home%\bin\keytool -import -file server.crt -keystore ./jre/lib/security/cacerts

          密碼 :changeit

          Test the SSL configuration by entering https://localhost:8443.

          訪問(wèn)應(yīng)用 :http://localhost:8080/…..


          配置是經(jīng)常遇到的報(bào)錯(cuò):

          1 C:\Program Files\Java\jdk1.5.0_06\bin>keytool -genkey -alias tomcat -keyalg RSA

          輸入 keystore 密碼: ? changeit

          keytool 錯(cuò)誤: java.io.IOException: Keystore was tampered with, or password was i

          ncorrect

          原因:系統(tǒng)中有了 *.keystore 文件,刪除此文件可解決問(wèn)題。此文件通常在 C:\Documents and Settings\Administrator 目錄之下。

          2 C:\Program Files\Java\jdk1.5.0_06>keytool -import -file server.crt -keystore ./j

          re/lib/security/cacerts

          輸入 keystore 密碼: ? changeit

          keytool 錯(cuò)誤: java.io.FileNotFoundException: server.crt ( 系統(tǒng)找不到指定的文件。 )

          原因:

          是否做了下面這一步:

          C:\Program Files\Java\jdk1.5.0_06\bin>keytool -export -alias tomcat -file server

          .crt

          輸入 keystore 密碼: ? changeit

          保存在文件中的認(rèn)證 <server.crt>

          做完這步之后,稍等片刻,因?yàn)?/span> server.crt 是在這步生成的,但是生成的時(shí)間比較長(zhǎng)。通常在你操作下一步的時(shí)候它還沒(méi)有生成,因此在配置的時(shí)候可能報(bào)錯(cuò)。

          ?

          操作過(guò)程:

          1 C:\Program Files\Java\jdk1.5.0_06\bin>keytool -genkey -alias tomcat -keyalg RSA

          輸入 keystore 密碼: ? changeit

          您的名字與姓氏是什么?

          ? [Unknown] ? localhost

          您的組織單位名稱(chēng)是什么?

          ? [Unknown] ? er

          您的組織名稱(chēng)是什么?

          ? [Unknown] ? se

          您所在的城市或區(qū)域名稱(chēng)是什么?

          ? [Unknown] ? sd

          您所在的州或省份名稱(chēng)是什么?

          ? [Unknown] ? sdf

          該單位的兩字母國(guó)家代碼是什么

          ? [Unknown] ? sdf

          CN=localhost, OU=er, O=se, L=sd, ST=sdf, C=sdf 正確嗎?

          ? [ ] ? y

          ?

          2 、輸入 <tomcat> 的主密碼

          ??????? (如果和 keystore 密碼相同,按回車(chē)): ? changeit

          ?

          3 C:\Program Files\Java\jdk1.5.0_06\bin>keytool -export -alias tomcat -file server

          .crt

          輸入 keystore 密碼: ? changeit

          保存在文件中的認(rèn)證 <server.crt>

          4 C:\Program Files\Java\jdk1.5.0_06>keytool -import -file server.crt -keystore ./j

          re/lib/security/cacerts

          輸入 keystore 密碼: ? changeit

          Owner: CN=localhost, OU=er, O=se, L=sd, ST=sdf, C=sdf

          發(fā)照者: CN=localhost, OU=er, O=se, L=sd, ST=sdf, C=sdf

          序號(hào): 4504c0e7

          有效期間: Mon Sep 11 09:50:31 CST 2006 至: Sun Dec 10 09:50:31 CST 2006

          認(rèn)證指紋:

          ???????? MD5 ? 58:1E:6A:C2:9C:BB:8C:DF:5B:5C:79:B9:2E:FF:EE:45

          ???????? SHA1 02:7C:32:16:24:B1:7F:32:8C:84:96:E6:77:87:0A:1C:31:7B:C8:32

          信任這個(gè)認(rèn)證? [ ] ? y

          認(rèn)證已添加至 keystore

          posted @ 2006-09-11 10:33 ~哈哈~ 閱讀(2822) | 評(píng)論 (2)編輯 收藏

          使用JDOM解析XML(轉(zhuǎn)載,簡(jiǎn)單又詳細(xì))

          一、前言
          ????JDOM是Breet Mclaughlin和Jason Hunter兩大Java高手的創(chuàng)作成果,2000年初,JDOM作為一個(gè)開(kāi)放源代碼項(xiàng)目正式開(kāi)始研發(fā)。JDOM是一種解析XML的Java工具包。

          ????DOM適合于當(dāng)今流行的各種語(yǔ)言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。它了為HTML和XML文檔提供了一個(gè)可應(yīng)用于不同平臺(tái)的編程接口。W3C DOM的最新信息可從http://www.w3.org/TR2001/WD-DOM-Lever-3-Core-20010913查閱。微軟在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmconxmldomuserguide.asp上也有DOM的詳細(xì)技術(shù)信息。

          ???DOM的設(shè)計(jì)為了適用于不同的語(yǔ)言,它保留了不同語(yǔ)言中非常相似的API。但是它并不適合于Java編程者的習(xí)慣。而JDOM作為一種輕量級(jí)API被制定,它最核心的要求是以Java為中心,只適合于Java語(yǔ)言,它遵循DOM的接口主要規(guī)則,除去了DOM中為了兼容各語(yǔ)言而與Java習(xí)慣的不同。

          二、使用JDOM的前提條件
          ???須要有SAX、DOM解析器的類(lèi)文件,JDOM只是一種適合Java程序員來(lái)使用的Java XML解析器,目前流行的Java XML解析器還有:Apache Xerces Java、JAXP。
          Xerces Java解析器是完全用Java編寫(xiě)的XML解析器,最新版本是2.5,它支持以下標(biāo)準(zhǔn)和API:
          (1) XML1.0規(guī)范(第二版本)
          (2) XML命名空間規(guī)范
          (3) DOM2核心標(biāo)準(zhǔn)規(guī)范
          (4) SAX2核心擴(kuò)展
          (5) JAXP1.2 :是Sun提供的使用Java處理XML的接口API。
          (6) XML Schema結(jié)構(gòu)和數(shù)據(jù)類(lèi)型標(biāo)準(zhǔn)

          ??????還有最好的是它開(kāi)放源代碼,我們可以在http://xml.apache.org/dist/xerces-j/ 處去下載。下載文件Xerces-J-bin.2.5.0.zip。
          解壓下載文件,得到四個(gè)壓縮包加到項(xiàng)目的路徑中(其實(shí)不要全加,但不熟的情況下考慮這么做)。
          JDOM的二進(jìn)制版本下載:http://www.jdom.org/downloads/index.html
          把解壓后的jdom.jar文件加到項(xiàng)目的類(lèi)路徑中,另外便于調(diào)試,還要下載它的源代碼。

          三、使用JDOM解析XML
          ?????好了,現(xiàn)在該是正題了。下面通過(guò)一個(gè)簡(jiǎn)單的例子說(shuō)明一下怎么用JDOM這一適合Java程序員習(xí)慣的工具包來(lái)解析XML文檔。
          為了簡(jiǎn)單,我用了如下XML作為要解析的XML文件:
          <?xml version="1.0" encoding="gb2312"?>
          <books>
          ???<book email="zhoujunhui">
          ?????<name>rjzjh</name>
          ?????<price>60.0</price>
          ??</book>
          </books>
          夠簡(jiǎn)單的吧,但它對(duì)于我們關(guān)心的東西都有了,子節(jié)點(diǎn),屬性。
          下面是用于解析這個(gè)XML文件的Java文件:

          								1 public class JDomParse {
          2	public JDomParse(){
          3		String xmlpath="library.xml";
          4		SAXBuilder builder=new SAXBuilder(false);
          5		try {
          6			Document doc=builder.build(xmlpath);
          7			Element books=doc.getRootElement();
          8			List booklist=books.getChildren("book");
          9			for (Iterator iter = booklist.iterator(); iter.hasNext();) {
          10				Element book = (Element) iter.next();
          11				String email=book.getAttributeValue("email");
          12				System.out.println(email);
          13				String name=book.getChildTextTrim("name");
          14				System.out.println(name);
          15				book.getChild("name").setText("alterrjzjh");
          16				
          17			}
          18			
          19			XMLOutputter outputter=new XMLOutputter();
          20			outputter.output(doc,new FileOutputStream(xmlpath));
          21			
          22		} catch (JDOMException e) {
          23			e.printStackTrace();
          24		} catch (IOException e) {
          25			e.printStackTrace();
          26		}
          27	}
          28	public static void main(String[] args) {
          29		new JDomParse();
          30	}
          31}
          						
          不到30行代碼,現(xiàn)在我對(duì)代碼解釋一下:
          四、解釋代碼
          引用的類(lèi):
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.util.Iterator;
          import java.util.List;
          //下面是引用到JDOM中的類(lèi)
          import org.jdom.Document;
          import org.jdom.Element;
          import org.jdom.JDOMException;
          import org.jdom.input.SAXBuilder;
          import org.jdom.output.XMLOutputter;
          (1)使用JDOM首先要指定使用什么解析器。如:
          ????????SAXBuilder builder=new SAXBuilder(false); 這表示使用的是默認(rèn)的解析器
          (2)得到Document,我們以后要進(jìn)行的所有操作都是對(duì)這個(gè)Document操作的:
          ????????Document doc=builder.build(xmlpath);
          (3)得到根元素:
          ????????Element books=doc.getRootElement();
          在JDOM中所有的節(jié)點(diǎn)(DOM中的概念)都是一個(gè)org.jdom.Element類(lèi),當(dāng)然他的子節(jié)點(diǎn)也是一個(gè)org.jdom.Element類(lèi)。
          (4)得到元素(節(jié)點(diǎn))的集合:
          ??????List booklist=books.getChildren("book");
          這表示得到“books”元素的所在名稱(chēng)為“book”的元素,并把這些元素都放到一個(gè)List集合中
          (5)輪循List集合
          ?????for (Iterator iter = booklist.iterator(); iter.hasNext();) {
          ???????Element book = (Element) iter.next();
          ????}
          還有一種輪循方法是:
          ????for(int i=0;I<booklist.size();I++){
          ??????Element book=(Element)booklist.get(i);
          ????}
          (6)取得元素的屬性:
          ????String email=book.getAttributeValue("email");
          ???取得元素book的屬性名為“email”的屬性值。
          (7)取得元素的子元素(為最低層元素)的值:
          ????String name=book.getChildTextTrim("name");
          ????注意的是,必須確定book元素的名為“name”的子元素只有一個(gè)。
          (8)改變?cè)兀樽畹蛯釉兀┑闹担?br />????book.getChild("name").setText("alterrjzjh");
          ????這只是對(duì)Document的修改,并沒(méi)有在實(shí)際的XML文檔中進(jìn)行修改
          (9)保存Document的修改到XML文件中:
          ???XMLOutputter outputter=new XMLOutputter();
          ????outputter.output(doc,new FileOutputStream(xmlpath));

          我們先要有一個(gè)XMLOutputter類(lèi),再把已經(jīng)修改了的Document保存進(jìn)XML文檔中。
          到此。用JDOM解析和處理XML文檔講解完了,麻雀雖小,五臟俱全。現(xiàn)在已對(duì)JDOM有個(gè)整體上的概念了吧
          posted @ 2006-09-01 16:58 ~哈哈~ 閱讀(5442) | 評(píng)論 (2)編輯 收藏

          Class Random的常用的Method:
          nextInt ()
          nextInt (int?n)
          nextBytes(byte[]?bytes)
          nextDouble()
          nextFloat()
          nextLong ()
          nextBoolean ()
          由于Random類(lèi)中沒(méi)有nextChar(),nextString()這樣的方法,所以要隨機(jī)產(chǎn)生一個(gè)字符或字符串應(yīng)該自己手動(dòng)編寫(xiě)Code
          下面的例子就是一個(gè)自動(dòng)產(chǎn)生字符的類(lèi)
          import java.util.*;

          public class RandomChar{
          ?private static Random rand=new Random();
          ?private static String? source="ABCEDFGHIGKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxuyz";
          ?private static char[] sur=source.toCharArray();
          ?public static char nextChar(){
          ??return sur[rand.nextInt(source.length())];
          ?}
          ?public static void main(String args[])
          ?{
          ??System.out.println(nextChar());
          ?}
          }

          再編寫(xiě)一個(gè)隨機(jī)產(chǎn)生字符串的類(lèi):
          import java.util.*;
          public? class RandomString{
          ?private static Random rand=new Random();
          private static int len;//字符串的長(zhǎng)度
          public RandomString(int len){ this.len=len;}
          private static String?? source="ABCEDFGHIGKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxuyz";
          ?private static char[] sur=source.toCharArray();
          public static char nextChar(){
          ? return sur[rand.nextInt(source.length())];
          ?}
          private static String nextString(){
          char [] buf=new char[len];
          for(int i=0;i<len;i++)
          buf[i]=nextChar();
          return new String(buf);}
          ?public static void main(String args[])
          ?{
          ? RandomString randStr=new RandomString(5);
          ? System.out.println(randStr.nextString());
          ?}

          }

          ?

          ?

          posted @ 2006-08-25 10:17 ~哈哈~ 閱讀(765) | 評(píng)論 (3)編輯 收藏

          Tapestry對(duì)頁(yè)面有自己的緩存策略。一旦頁(yè)面被第一次訪問(wèn),頁(yè)面對(duì)象就會(huì)被加載到緩存中。因此,每次對(duì)HTML、page或java的修改,效并不會(huì)馬上生,必須重新啟動(dòng)服務(wù)器。在我們開(kāi)發(fā)程序的時(shí)候,這樣相當(dāng)不方便。因此我們可以關(guān)閉Tapestry的緩存策略,等到項(xiàng)目發(fā)布的時(shí)候,再開(kāi)啟。

          可以禁止html在客戶端的瀏覽器中緩存,如果用戶點(diǎn)擊“后退”按鈕,瀏覽器自動(dòng)再次從服務(wù)器上獲得最新的頁(yè)面。

          HTML:
          <META?HTTP-EQUIV="pragma"?CONTENT="no-cache">
          <META?HTTP-EQUIV="Cache-Control"?CONTENT="no-store,?must-revalidate">
          <META?HTTP-EQUIV="expires"?CONTENT="Wed,?26?Feb?1997?08:21:57?GMT">
          <META?HTTP-EQUIV="expires"?CONTENT="0">

          在MyTapestry.application中添加:

          <meta key="org.apache.tapestry.disable-caching" value="true"/>
          <meta key="org.apache.tapestry.enable-reset-service" value="true"/>

          并在JVM中添加:

          -Dorg.apache.tapestry.disable-caching=true
          -Dorg.apache.tapestry.enable-reset-service=true



          部分資料摘自:干煸四季豆http://www.javaeye.com/pages/viewpage.action?pageId=717
          posted @ 2006-08-11 15:16 ~哈哈~ 閱讀(541) | 評(píng)論 (0)編輯 收藏

          http://www.javaeye.com/pages/viewpage.action?pageId=566?
          從這個(gè)例子中我們能掌握很多Tapestry的相關(guān)知識(shí),下面我把自己對(duì)這個(gè)例子理解以及涉及到的一些知識(shí)作一些介紹:
          購(gòu)物車(chē)較難的一部分就是客戶選擇的商品的保存問(wèn)題:
          此例提供了一個(gè)很好的解決方案,將客戶選擇的商品都放在session中:
          那么,在Tapestry中如何利用session呢?這就要從Tapestry中的Visit對(duì)象說(shuō)起。

          Visit對(duì)象是一個(gè)應(yīng)用程序空間,用來(lái)儲(chǔ)存應(yīng)用程序邏輯和數(shù)據(jù)。這個(gè)對(duì)象能被應(yīng)用程序中所有的頁(yè)面和組件訪問(wèn),并且包含WEB應(yīng)用程序中某一個(gè)客戶端的特殊信息。一個(gè)單一Visit對(duì)象實(shí)例被應(yīng)用程序中所有的頁(yè)面共享。該對(duì)象類(lèi)似HttpSession在典型servlet應(yīng)用程序中扮演的角色。實(shí)際上,Visit對(duì)象最終作為一個(gè)HttpSession屬性被儲(chǔ)存。

          為了在應(yīng)用程序中使用一些通用數(shù)據(jù),Tapestry認(rèn)可Visit對(duì)象。Tapestry并不知道也不關(guān)心Visit對(duì)象的類(lèi)型。在框架中也沒(méi)有定義特殊的Visit類(lèi),每一個(gè)應(yīng)用程序自己定義Visit類(lèi)。頁(yè)面方法訪問(wèn)Visit對(duì)象時(shí)并不會(huì)指定具體的類(lèi)型:

          public Object getVisit();

          注意強(qiáng)制轉(zhuǎn)換類(lèi)型:

          Visit visit = (Visit)getVisit();

          Visit對(duì)象是框架自動(dòng)生成的,在第一次運(yùn)行時(shí)被引用。你必須配置Tapestry提供實(shí)例化,一旦Visit對(duì)象生成,就將會(huì)持久化儲(chǔ)存在HttpSession中。

          ????? 此例子中還有一些其他的相關(guān)知識(shí)點(diǎn):
          ?????? Tapestry4.0中新增加的自定義的Validator功能
          ?????? 一段經(jīng)典的程序代碼:
          ValidationDelegate delegate = (ValidationDelegate)this.getBeans().getBean("delegate");
          if(delegate.getHasErrors()) {
          	returnthis.getPage().getPageName();
          }

          學(xué)習(xí)Tapestry4.0 過(guò)程中逐漸明白的一些東西
          從代碼開(kāi)始分析
          在EmploeeList.html文件中的一段代碼:
          <tr jwcid="@Foreach" source="ognl:userList" value="ognl:customer" element="tr">
          ????? <td width="7%"? align="center" bgcolor="#FFFFFF"><span jwcid="@Insert" value="ognl:(customer.getAttributeValue('sex')==1)?'Male':'Female'"/></td>
          ?????? <td width="19%" align="center" bgcolor="#FFFFFF"><span jwcid="@Insert" value="ognl:customer.getAttributeValue('workemail')"/></td>
          ?? <td width="7%"? align="center" bgcolor="#FFFFFF"><span jwcid="@ExternalLink" page="xmlsync/EmployeeUpdate"???????parameters="ognl:customer.getAttributeValue('employeecode')"> 修 改 </span></td>
          ?? <td width="8%"? align="center" bgcolor="#FFFFFF"><span jwcid="deleteUser" parameters="ognl:customer.getAttributeValue('employeecode')" onclick="javascript:return window.confirm('確定要?jiǎng)h除該用戶嗎?');">刪 除</span></td>
          </tr>
          在EmploeeList.page文件中的一段代碼:
          <page-specification class="com.ce.myceaas.tapestry.page.xmlsync.EmployeeList">
          ?<description>Login Page</description>
          ???? <property name="userList"/>
          ???? <property name="customer"/>
          ??? <component id="deleteUser" type="DirectLink">
          ?? <binding name="listener" value="listeners.deleteUser"/>
          ??? </component>
          </page-specification>?
          在EmploeeList.java文件中的一段代碼:
          public abstract class EmployeeList extends BasePage implements PageRenderListener {
          ?public abstract List getUserList();
          ?public abstract void setUserList(List list);
          ?@InjectObject("spring:xmlService")
          ?public abstract XmlService getXmlService();
          ?@InjectPage("xmlsync/EmployeeList")
          ?public abstract IPage getEmployeeList();
          ?public void pageBeginRender(PageEvent event) {
          ??this.setUserList(this.getXmlService().getUsersList());
          ?}
          ?
          ?public void deleteUser(IRequestCycle cycle) {
          ??Object[] obj = cycle.getServiceParameters();
          ??if (obj[0] != null) {
          ???if (obj[0] instanceof String) {
          ????getXmlService().deleteUsers(obj[0].toString());
          ????FowardUtil.forwardUrl((EmployeeList)getEmployeeList());
          ????
          ???} else {
          ????}
          ??} else {
          ???}
          }
          在XmlService.java文件中的一段代碼:
          public List getUsersList(){
          ??
          ??List list = new ArrayList();
          ??SAXBuilder builder = new SAXBuilder();
          ???? try {
          ?????? File inFile = new File(url);??? //get the xmlfile?
          ?????? Document doc = builder.build(inFile);
          ?????? Element root = doc.getRootElement();
          ?????
          ?????? list = root.getChildren("employeeinfo");
          ???? }
          ???? catch (JDOMException e) {
          ?????? System.out.println(" is not well-formed.");
          ?????? System.out.println(e.getMessage());
          ???? }?
          ???? catch (IOException e) {
          ?????? System.out.println(e);
          ???? }
          ??return list;
          ???}
          可以在EmploeeList.html看到這段代碼
          ?"ognl:(customer.getAttributeValue('sex')==1)?'Male':'Female"
          其中的customer是從<tr jwcid="@Foreach" source="ognl:userList" value="ognl:customer" element="tr">這里來(lái)的
          userList是List類(lèi)型 其中的元素是customer,customer的類(lèi)型是Element,再看customer.getAttributeValue('sex'),這里為什么能用getAttributeValue()呢,這就要問(wèn)Tapestry4.0的實(shí)現(xiàn)機(jī)制了,當(dāng)網(wǎng)頁(yè)表現(xiàn)時(shí)遇到ognl:userList時(shí)會(huì)在EmploeeList.page中找到
          <property name="userList"/>
          而在EmploeeList.java中有
          ????? public abstract List getUserList();
          ?public abstract void setUserList(List list);
          這兩個(gè)抽象函數(shù)將完成對(duì)ognl:userList的賦值與修改工作
          下面這段代碼
          ?????? @InjectObject("spring:xmlService")//調(diào)用XmlService對(duì)象
          ??????? ······
          ?public abstract XmlService getXmlService();
          ??public void pageBeginRender(PageEvent event) {
          ??this.setUserList(this.getXmlService().getUsersList());//真正的實(shí)現(xiàn)userList的傳遞的工作
          ?}
          這段代碼將EmploeeList.html和XmlService.java聯(lián)系起來(lái),這也就是為什么在 EmploeeList.html能用getAttributeValue('sex')方法的原因!
          posted @ 2006-08-11 13:32 ~哈哈~ 閱讀(504) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 广州市| 南部县| 崇州市| 德令哈市| 叶城县| 朝阳区| 墨江| 上饶县| 弥渡县| 张掖市| 桦甸市| 浦东新区| 资源县| 凤庆县| 三亚市| 绥德县| 九龙坡区| 剑阁县| 湛江市| 张家港市| 梅河口市| 林甸县| 西青区| 乐业县| 滨海县| 玉屏| 东兴市| 北票市| 大新县| 靖安县| 岳普湖县| 江西省| 南投市| 湖北省| 阿图什市| 太仆寺旗| 荔波县| 中宁县| 交口县| 海丰县| 彭州市|