DWR(Direct Web Remoting)是一個開源的類庫,可以幫助開發(fā)人員開發(fā)包含AJAX技術(shù)的網(wǎng)站.它可以允許在瀏覽器里的代碼使用運行在WEB服務(wù)器上的JAVA函數(shù),就像它就在瀏覽器里一樣.

          它包含兩個主要的部分:允許JavaScript從WEB服務(wù)器上一個遵循了AJAX原則的Servlet(小應(yīng)用程序)中獲取數(shù)據(jù).另外一方面一個JavaScript庫可以幫助網(wǎng)站開發(fā)人員輕松地利用獲取的數(shù)據(jù)來動態(tài)改變網(wǎng)頁的內(nèi)容.

          DWR采取了一個類似AJAX的新方法來動態(tài)生成基于JAVA類的JavaScript代碼.這樣WEB開發(fā)人員就可以在JavaScript里使用Java代碼就像它們是瀏覽器的本地代碼(客戶端代碼)一樣;但是Java代碼運行在WEB服務(wù)器端而且可以自由訪問WEB 服務(wù)器的資源.出于安全的理由,WEB開發(fā)者必須適當(dāng)?shù)嘏渲媚男㎎ava類可以安全的被外部使用.

          這個從JAVA到JavaScript的遠程功能方法給DWR的用戶帶來非常像傳統(tǒng)的RPC機制,就像RMI或者SOAP一樣,而且擁有運行在WEB上但是不需要瀏覽器插件的好處.

          DWR不認為瀏覽器/WEB服務(wù)器協(xié)議是重要的,而更樂于保證編程界面的簡單自然.對此最大的挑戰(zhàn)就是把AJAX的異步特性和正常JAVA方法調(diào)用的同步特性相結(jié)合.在異步模式下,結(jié)果數(shù)據(jù)在開始調(diào)用之后的一段時間之后才可以被異步訪問獲取到.DWR允許WEB開發(fā)人員傳遞一個回調(diào)函數(shù),來異步處理Java函數(shù)調(diào)用過程.

          其配置如下:
          1.1、dwr.xml的配置
          <dwr>
          <allow>
          <create creator="new" javascript="testClass" >

          <include method="testMethod1"/>
          </create>
          </allow>
          </dwr>
          <allow>標(biāo)簽中包括可以暴露給javascript訪問的東西。
          <create>標(biāo)簽中指定javascript中可以訪問的java類,并定義DWR應(yīng)當(dāng)如何獲得要進行遠程的類的實例。creator="new"屬性指定java類實例的生成方式,new意味著DWR應(yīng)當(dāng)調(diào)用類的默認構(gòu)造函數(shù)來獲得實例,其他的還有spring方式,通過與IOC容器Spring進行集成來獲得實例等等。javascript=" testClass "屬性指定javascript代碼訪問對象時使用的名稱。
          標(biāo)簽指定要公開給javascript的java類名。
          <include>標(biāo)簽指定要公開給javascript的方法。不指定的話就公開所有方法。
          <exclude>標(biāo)簽指定要防止被訪問的方法。
          1.2、javascript中調(diào)用
          首先,引入javascript腳本
          <script src='dwr/interface/ testClass.js'></script>
          <script src='dwr/engine.js'></script>
          <script src='dwr/util.js'></script>
          其中TestClass.js是dwr根據(jù)配置文件自動生成的,engine.js和util.js是dwr自帶的腳本文件。
          其次,編寫調(diào)用java方法的javascript函數(shù)
          Function callTestMethod1(){
          testClass.testMethod1();
          }
          2、調(diào)用有簡單返回值的java方法
          2.1、dwr.xml的配置
          配置同1.1
          <dwr>
          <allow>
          <create creator="new" javascript="testClass" >

          <include method="testMethod2"/>
          </create>
          </allow>
          </dwr>
          2.2、javascript中調(diào)用
          首先,引入javascript腳本
          其次,編寫調(diào)用java方法的javascript函數(shù)和接收返回值的回調(diào)函數(shù)
          Function callTestMethod2(){
          testClass.testMethod2(callBackFortestMethod2);
          }
          Function callBackFortestMethod2(data){
          //其中date接收方法的返回值
          //可以在這里對返回值進行處理和顯示等等
          alert("the return value is " + data);
          }
          其中callBackFortestMethod2是接收返回值的回調(diào)函數(shù)
          3、調(diào)用有簡單參數(shù)的java方法
          3.1、dwr.xml的配置
          配置同1.1
          <dwr>
          <allow>
          <create creator="new" javascript="testClass" >

          <include method="testMethod3"/>
          </create>
          </allow>
          </dwr>
          3.2、javascript中調(diào)用
          首先,引入javascript腳本
          其次,編寫調(diào)用java方法的javascript函數(shù)
          Function callTestMethod3(){
          //定義要傳到j(luò)ava方法中的參數(shù)
          var data;
          //構(gòu)造參數(shù)
          data = “test String”;
          testClass.testMethod3(data);
          }
          4、調(diào)用返回JavaBean的java方法
          4.1、dwr.xml的配置
          <dwr>
          <allow>
          <create creator="new" javascript="testClass" >

          <include method="testMethod4"/>
          </create>
          <convert converter="bean" match=""com.dwr.TestBean">

          </convert>
          </allow>
          </dwr>
          <creator>標(biāo)簽負責(zé)公開用于Web遠程的類和類的方法,<convertor>標(biāo)簽則負責(zé)這些方法的參數(shù)和返回類型。convert元素的作用是告訴DWR在服務(wù)器端Java 對象表示和序列化的JavaScript之間如何轉(zhuǎn)換數(shù)據(jù)類型。DWR自動地在Java和JavaScript表示之間調(diào)整簡單數(shù)據(jù)類型。這些類型包括Java原生類型和它們各自的封裝類表示,還有String、Date、數(shù)組和集合類型。DWR也能把JavaBean轉(zhuǎn)換成JavaScript 表示,但是出于安全性的原因,要求顯式的配置,<convertor>標(biāo)簽就是完成此功能的。converter="bean"屬性指定轉(zhuǎn)換的方式采用JavaBean命名規(guī)范,match=""com.dwr.TestBean"屬性指定要轉(zhuǎn)換的javabean名稱,標(biāo)簽指定要轉(zhuǎn)換的JavaBean屬性。
          4.2、javascript中調(diào)用
          首先,引入javascript腳本
          其次,編寫調(diào)用java方法的javascript函數(shù)和接收返回值的回調(diào)函數(shù)
          Function callTestMethod4(){
          testClass.testMethod4(callBackFortestMethod4);
          }
          Function callBackFortestMethod4(data){
          //其中date接收方法的返回值
          //對于JavaBean返回值,有兩種方式處理
          //不知道屬性名稱時,使用如下方法
          for(var property in data){
          alert("property:"+property);
          alert(property+":"+data[property]);
          }
          //知道屬性名稱時,使用如下方法
          alert(data.username);
          alert(data.password);
          }
          其中callBackFortestMethod4是接收返回值的回調(diào)函數(shù)
          5、調(diào)用有JavaBean參數(shù)的java方法
          5.1、dwr.xml的配置
          配置同4.1
          <dwr>
          <allow>
          <create creator="new" javascript="testClass" >

          <include method="testMethod5"/>
          </create>
          <convert converter="bean" match="com.dwr.TestBean">

          </convert>
          </allow>
          </dwr>
          5.2、javascript中調(diào)用
          首先,引入javascript腳本
          其次,編寫調(diào)用java方法的javascript函數(shù)
          Function callTestMethod5(){
          //定義要傳到j(luò)ava方法中的參數(shù)
          var data;
          //構(gòu)造參數(shù),date實際上是一個object
          data = { username:"user", password:"password" }
          testClass.testMethod5(data);
          }
          6、調(diào)用返回List、Set或者Map的java方法
          6.1、dwr.xml的配置
          配置同4.1
          <dwr>
          <allow>
          <create creator="new" javascript="testClass" >

          <include method="testMethod6"/>
          </create>
          <convert converter="bean" match="com.dwr.TestBean">

          </convert>
          </allow>
          </dwr>
          注意:如果List、Set或者Map中的元素均為簡單類型(包括其封裝類)或String、Date、數(shù)組和集合類型,則不需要<convert>標(biāo)簽。
          6.2、javascript中調(diào)用(以返回List為例,List的元素為TestBean)
          首先,引入javascript腳本
          其次,編寫調(diào)用java方法的javascript函數(shù)和接收返回值的回調(diào)函數(shù)
          Function callTestMethod6(){
          testClass.testMethod6(callBackFortestMethod6);
          }
          Function callBackFortestMethod6(data){
          //其中date接收方法的返回值
          //對于JavaBean返回值,有兩種方式處理
          //不知道屬性名稱時,使用如下方法
          for(var i=0;i<data.length;i++){
          for(var property in data){
          alert("property:"+property);
          alert(property+":"+data[property]);
          }
          }
          //知道屬性名稱時,使用如下方法
          for(var i=0;i<data.length;i++){
          alert(data.username);
          alert(data.password);
          }
          }
          7、調(diào)用有List、Set或者Map參數(shù)的java方法
          7.1、dwr.xml的配置
          <dwr>
          <allow>
          <create creator="new" javascript="testClass" >

          <include method="testMethod7"/>
          </create>
          <convert converter="bean" match="com.dwr.TestBean">

          </convert>
          </allow>
          <signatures>
          <![CDATA[
          import java.util.List;
          import com.dwr.TestClass;
          import com.dwr.TestBean;
          TestClass.testMethod7(List<TestBean>);
          ]]>
          </signatures>
          </dwr>
          <signatures>標(biāo)簽是用來聲明java方法中List、Set或者Map參數(shù)所包含的確切類,以便java代碼作出判斷。
          7.2、javascript中調(diào)用(以返回List為例,List的元素為TestBean)
          首先,引入javascript腳本
          其次,編寫調(diào)用java方法的javascript函數(shù)
          Function callTestMethod7(){
          //定義要傳到j(luò)ava方法中的參數(shù)
          var data;
          //構(gòu)造參數(shù),date實際上是一個object數(shù)組,即數(shù)組的每個元素均為object
          data = [
          {
          username:"user1",
          password:"password2"
          },
          {
          username:"user2",
          password:" password2"
          }
          ];
          testClass.testMethod7(data);
          }
          注意:
          1、對于第6種情況,如果java方法的返回值為Map,則在接收該返回值的javascript回調(diào)函數(shù)中如下處理:
          function callBackFortestMethod(data){
          //其中date接收方法的返回值
          for(var property in data){
          var bean = data[property];
          alert(bean.username);
          alert(bean.password);
          }
          }
          2、對于第7種情況,如果java的方法的參數(shù)為Map(假設(shè)其key為String,value為TestBean),則在調(diào)用該方法的javascript函數(shù)中用如下方法構(gòu)造要傳遞的參數(shù):
          function callTestMethod (){
          //定義要傳到j(luò)ava方法中的參數(shù)
          var data;
          //構(gòu)造參數(shù),date實際上是一個object,其屬性名為Map的key,屬性值為Map的value
          data = {
          "key1":{
          username:"user1",
          password:"password2"
          },
          "key2":{
          username:"user2",
          password:" password2"
          }
          };
          testClass.testMethod(data);
          }
          并且在dwr.xml中增加如下的配置段
          <signatures>
          <![CDATA[
          import java.util.List;
          import com.dwr.TestClass;
          import com.dwr.TestBean;
          TestClass.testMethod7(Map<String,TestBean>);
          ]]>
          </signatures>
          3、由以上可以發(fā)現(xiàn),對于java方法的返回值為List(Set)的情況,DWR將其轉(zhuǎn)化為Object數(shù)組,傳遞個javascript;對于java方法的返回值為Map的情況,DWR將其轉(zhuǎn)化為一個Object,其中Object的屬性為原Map的key值,屬性值為原Map相應(yīng)的value值。
          4、如果java方法的參數(shù)為List(Set)和Map的情況,javascript中也要根據(jù)3種所說,構(gòu)造相應(yīng)的javascript數(shù)據(jù)來傳遞到j(luò)ava中

          1. 安裝 DWR JAR 包
          下載 dwr.jar 文件,然后將它放在 web 程序的 WEB-INF/lib 目錄下面,很可能在這個目錄下已經(jīng)有一些 jar 文件了。
          2. 編輯 config 文件
          將下面的代碼添加到 WEB-INF/web.xml 文件中,<servlet>需要放在另外的<servlet>之后,<servlet-mapping>也是如此。
          <servlet>
          <servlet-name>dwr-invoker</servlet-name>
          <display-name>DWR Servlet</display-name>
          <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
          <init-param>
               debug</param-name>
               true</param-value>
          </init-param>
          </servlet>
          <servlet-mapping>
          <servlet-name>dwr-invoker</servlet-name>
          <url-pattern>/dwr/*</url-pattern>
          </servlet-mapping>
          接下來創(chuàng)建 dwr.xml 文件并將此放在 web.xml 所在的 WEB-INF 目錄下。文件中類似下面的內(nèi)容:
          <!DOCTYPE dwr PUBLIC
              ”-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN”
              ”http://www.getahead.ltd.uk/dwr/dwr10.dtd”>
          <dwr>
          <allow>
              <create creator=”new” javascript=”JDate”>
               
              </create>
              <create creator=”new” javascript=”Demo”>
               
              </create>
          </allow>
          </dwr>
          DWR 配置文件定義了由 DWR 創(chuàng)建和被 Javascript 遠程使用的類。在上面的例子中我們在遠程創(chuàng)建了2個類,并且給出了在 Javascript 中的類名。
          上面使用的 new creator 使用了所有的 JavaBeans 必須含有的公有(public)無參(no-args)的構(gòu)造函數(shù)。值得一提的是, DWR 還有一些限制:
          避免使用 JavaScript 保留字;以保留字命名的方法將自動被排除。大多數(shù) JavaScript 的保留字同時也是 Java 的保留字,因此無論如何你也不能使用一個名為 “try()” 的方法。但是最常用的一個詞 “delete()”,在 JavaScript 中有特殊的含義而在 Java 中沒有。
          重載方法(Overloaded methods)將會在調(diào)用的時候陷入未知的狀況,因此應(yīng)該避免重載方法。
          3. 訪問下面的地址
          http://localhost:8080/[YOUR-WEBAPP]/dwr/
          你應(yīng)該會看到一個頁面,上面顯示了剛才你在第二步所創(chuàng)建的類。進入一個鏈接之后你會看到所有等待調(diào)用方法的列表。這些動態(tài)產(chǎn)生的例子你也能通過 DWR 來實現(xiàn)。
          親自嘗試和體會下吧。
          怎樣應(yīng)用到你的 Web 程序中?
          在側(cè)邊欄有很多例子演示了怎樣改變網(wǎng)頁中的文本、更新列表、操作表單和動態(tài)修改表格。每一個例子都有詳細的說明。
          另外一個開始方法就是從頁面中查看源代碼,這些頁面你剛剛瀏覽過:
          進入 http://localhost:8080/[YOUR-WEBAPP]/dwr/ 然后點擊你創(chuàng)建的類;
          查看源代碼然后定位到你所感興趣的方法的代碼行;
          將這些文本粘貼到你 Web 程序的一個 HTML 或 JSP頁面中;
          包含下面的 javascrip 文件:
          <script src=’/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js’></script>
          <script src=’/[YOUR-WEBAPP]/dwr/engine.js’></script>
          你可以根據(jù)實際情況修改 /[YOUR-WEBAPP]/ 部分。
          關(guān)于怎樣書寫 DWR 控制的 Javascript 代碼請查看 腳本簡介。

          官方網(wǎng)站:http://getahead.org/dwr

          posted @ 2008-09-17 12:45 小馬歌 閱讀(207) | 評論 (0)編輯 收藏
           

           [摘抄自:http://blog.soufun.com/12766773/2394732/articledetail.htm]
              奧運已經(jīng)正離我們遠去倫敦的路上,潮水終于退去,使我們有機會看到真正裸泳的人。

          好不容易熬到“金九銀十”,在美國政府出手收購“兩房”之際,一篇洋洋灑灑的《萬科松山湖會議發(fā)言紀要》在國內(nèi)網(wǎng)上瘋傳,市場儼然有著“山雨欲來風(fēng)滿樓”的烏云遮蓋,令期待年底回暖與圖謀“抄底”的人再次覺得前景渺茫。

           一地雞毛

          越來越多的人已經(jīng)感覺到冬天的降臨。有人指出:房價的下跌根本原因不是政府調(diào)控,也不是剛需減少,而是房子失去了投資價值。當(dāng)盛宴變成“剩宴”的時候,只能是盤傾碗覆,一片狼藉。

          而深圳樓市的居住價值越來越多的人捫心自問:這是我們生活中必須要為之付出一輩子辛勞的安樂窩嗎?

          從誰都知道房子要漲價,炒房客蜂擁而入,開發(fā)商惜售捂盤,雇人排隊,分期開發(fā),瘋狂拿地,可憐的剛需人群,在這股洪流的脅裹之下,不得不忐忑不安又興奮而激動的成為房奴,為自己家的房子升值而高興,但卻又感覺好像和自己沒什么關(guān)系。

          觀望、拋售情緒濃厚,不是沒錢買,怕買樓被套、怕受傷,這乃當(dāng)今深圳樓市一大景象。

          準(zhǔn)備過冬

          學(xué)者認為:在三十年的中國變革歷程中,宏觀調(diào)控(在1992年之前稱為治理整頓)是一個定期出現(xiàn)的名詞。自1978年開始改革以來,1981年就發(fā)生了經(jīng)濟動蕩和政策緊縮,其后,每隔四到五年就會呈現(xiàn)類似的“過冬景象”,這些年份分別是:1984年、1989年、1993年、1998年、2004——其間,惟一的一次輸入式行業(yè)危機是2000年的互聯(lián)網(wǎng)泡沫破滅,不過,它對整體宏觀經(jīng)濟的影響不大——按此規(guī)律,2008年的“冬天”似乎是如期而止。對這一周期規(guī)律的警覺與漠視,是企業(yè)成敗的關(guān)鍵所在。
               所有的宏觀調(diào)控都是因為經(jīng)濟的超速成長所導(dǎo)致的。在一個狂熱成長的年份之后,接踵而至的就是一個驟然降溫的嚴酷冬天,緊縮政策的出臺往往是緊剎車式的,其間幾乎沒有任何過渡。這使得那些激進發(fā)展的企業(yè)因為缺乏風(fēng)險防范而導(dǎo)致窒息式的崩塌。在這次宏觀調(diào)控中,陷入困境的主要是兩類企業(yè):一類是在前兩年投入大量資金用于技術(shù)改造和規(guī)模擴張,一類是貿(mào)然進入了房地產(chǎn)等“暴利行業(yè)”,冬天驟至,頓時爆發(fā)資金危機。

           市場不必跟著萬科走

          昨天與一家老牌資質(zhì)開發(fā)商老總餐聚,席間他對當(dāng)前樓市感嘆許多。“在這輪調(diào)整中,深圳下跌最早,跌得最深,必然也在未來起來最早。”但現(xiàn)在二線城市的調(diào)整浪也剛剛展開,站起來的時間可能要大大推遲。

          “部分媒體惟恐天下不亂,開發(fā)商與媒體不是水火不相容的關(guān)系,開發(fā)商倒了,對媒體行業(yè)也沒有好處。報道出發(fā)點能否客觀些,樓市興衰媒體也有一定責(zé)任。前段時間傳出部分開發(fā)商密謀開會團結(jié)一致放出風(fēng)聲:如果媒體不調(diào)整”唱空“基調(diào)”的話,開發(fā)商也將被迫聯(lián)合起來自衛(wèi)。” 《萬科松山湖會議發(fā)言紀要》的降價預(yù)言使萬科十分尷尬,又使部分媒體“空軍”力量注入新鮮血液。

          現(xiàn)在看來,所謂《萬科松山湖會議發(fā)言紀要》真假難辯,萬科樓盤除了只會降價之外難道就毫無其他妙方了嗎?

          “今年以來,萬科對這波樓市調(diào)整的品牌影響力甚大,但萬科在全國的市場占有率才不過5%,在許多城市拿到的都是邊緣化的地塊,主流城區(qū)的定價權(quán)并不在萬科手里,在深圳、上海、廣州、北京、天津均是如此,為什么萬科一降價全國就跟“瘋”?這與中國房地產(chǎn)行業(yè)發(fā)展的不平衡不無關(guān)系。”

          在東莞,萬科進入這座城市才不過四年,但是東莞地產(chǎn)的主流定價權(quán)已經(jīng)被萬科牢牢掌握。接二連三的降價潮已經(jīng)將這座城市的投資客與自住客推向了風(fēng)口浪尖,本土開發(fā)商很受傷。但諸如光大、新世紀、富盈等掌握本土優(yōu)質(zhì)地塊的開發(fā)商對萬科這個“外來和尚”是又恨又無奈。

          “萬科在東莞并沒有降價清理門戶的資格。相對于本土巨頭而言,萬科的拿地成本比幾乎是零地價成本的本土企業(yè)毫無優(yōu)勢,就算降價也是本土企業(yè)先降。所以萬科降價出貨難免過于主觀臆斷,并有可能誤傷到自己。”一位東莞本土地產(chǎn)商告訴筆者。拿松山湖為例,光大錦繡山河項目幾千畝開發(fā)面積都沒有急于出貨,面對對手萬科的頻頻發(fā)難,光大戲言“所開發(fā)項目根本不在一個水平上,不與之玩了”,并稱旗下樓盤退出3月以來在東莞興起的價格戰(zhàn)游戲。

          當(dāng)股市、樓市失去投資價值的時候,當(dāng)市場剩下剛性需求的時候,可憐的剛需有能支撐多久呢?當(dāng)去年在淘金樓市中冒起來的成千上萬的百萬富翁、千萬富翁有的已經(jīng)成為“負翁”時,這場“千金散去”的數(shù)字游戲勝過哈佛教科書將令那些沒有經(jīng)歷過90年代泡沫地產(chǎn)的人們記憶猶新?,F(xiàn)在看來,推倒重來也許是最好的“救市”方法。

          “活著真好。”這位開發(fā)商老總慶幸自己樓盤去年沒有全國圈地,他認為深圳的開發(fā)商應(yīng)珍惜活著的機會,開發(fā)出好產(chǎn)品獻給這座充滿活力的城市。

           “冬天過去,必有春天,經(jīng)過冬天的人會更成熟起來,潮來潮去,天下沒有不散的宴席,塞翁失馬,焉知禍福?宴席散去,后會有期,祈禱深圳樓市一路走好。

          posted @ 2008-09-17 09:54 小馬歌 閱讀(152) | 評論 (0)編輯 收藏
           

          最初的xml解析器是sun的Crimson和IBM的Xerces,這兩個開源項目都捐給了apache組織,后來Xerces發(fā)展很快,Crimon基本沒有人使用。
          1.4 版本起,用于 XML 處理的 Java API 就已經(jīng)加入了Java 2 平臺中。 利用該 API,可通過一系列標(biāo)準(zhǔn)的 Java 平臺 API 來處理 XML 文檔。
           因此,也就無需另外添加 XML 處理包了。sun的JDK1.4使用Crimson,IBM的JDK使用Xerces。
          如果打算把sun 的jdk程序移植到IBM的JDK下,注意解析器不同,XML處理會出問題。這就說明了java不是“一次編譯,到處運行”,而是“一次編譯,到處調(diào)試”。
          如果你把IBM的JDK移植到SUN的JDK下,即使把Xerces包引入CLASSPATH,JDK還是使用Crimson,不信你運行java -verbose試一試。
          解決的辦法就是在在JRE\lib\目錄下,建立一個jaxp.properties的文件,
          內(nèi)容如下:
              javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
              javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
          就可以使用Xerces。
          或者使用命令行
          # Add the XML parser jars and set the JAXP factory names
          # Crimson parser JAXP setup(default)
          CLASSPATH=$CLASSPATH:../lib/crimson.jar
          JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
          JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl"

          # Add the XML parser jars and set the JAXP factory names
          # Xerces parser JAXP setup
          CLASSPATH=$CLASSPATH:../lib/xerces.jar
          JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
          JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl"
          最終sun還是指定JAXP規(guī)范,JSR 206 Java API for XML Processing(JAXP) 1.3,他已經(jīng)由JDK1.5實現(xiàn)。
          JAXP實現(xiàn)了XPath,但是xalan的org.apache.xpath.XPathAPI 類已經(jīng)移植到了 JRE 1.5 中,重構(gòu)為com.sun.org.apache.xpath.internal.XPathAPI。 
          如果在以前的JDK中,使用含 XPathAPI 類的 jar,例如 xalan-2.4.1.jar。 將該 jar 加入到 CLASSPATH(類路徑)。

          W3C的DOM標(biāo)準(zhǔn)API非常難用,于是有人開發(fā) Java專用的XML API,這就是jdom=java+DOM。其中一部分人,去開發(fā)dom4j,這個不是非常標(biāo)準(zhǔn),但是速度很快。
          使用JDOM隱含服務(wù)器風(fēng)險,因為JBoss和Webphere都是基于JDOM開發(fā)的,在這兩個服務(wù)器下使用JDOM,必須進行相應(yīng)的設(shè)置,而且你的JDOM版本必須與服務(wù)器使用的相近,
          因為JVM只加載一份相同的類,服務(wù)器優(yōu)先加載自己使用的JDOM,你開發(fā)用的JDOM不會被加載,你的應(yīng)用就會出錯。
          使用Dom4J隱含工程問題,主要是hibernate,如果你開發(fā)的項目和hibernate合并,Dom4J版本不兼容的話,尋找dom4j相同版本hibernate,或者你改程序適應(yīng)hibernate的Dom4j。
          java沒有windows的DLL地獄,但是java的jar地獄有過而無不及啊。

          posted @ 2008-09-12 11:06 小馬歌 閱讀(479) | 評論 (0)編輯 收藏
           

          sun和ibm都有一套xml的實現(xiàn),sun的實現(xiàn)是打到j(luò)dk里面了。
          但當(dāng)加載的時候,如果ibm的實現(xiàn)jar包xercesImpl.jar的接口 xml-apis.jar [j2ee1.4 library 有]文件導(dǎo)入到classpath 里了的話:
          1 如果xml-apis.jar先于 jre加載,那么 將采用 xercesImpl.jar的實現(xiàn);
          2 如果jre先加載,那么將用 sun的xml實現(xiàn),而取這個實現(xiàn)的類又分別按順序從4個位置取.

          • 使用 javax.xml.parsers.DocumentBuilderFactory 系統(tǒng)屬性。
          • 使用 JRE 文件夾中的屬性文件 "lib/jaxp.properties"。此配置文件格式為標(biāo)準(zhǔn)的 java.util.Properties 且包含實現(xiàn)類的完全限定名,其中實現(xiàn)類的鍵是上述定義的系統(tǒng)屬性。 JAXP 實現(xiàn)只讀取一次 jaxp.properties 文件,然后緩存其值供以后使用。如果首次嘗試讀取文件時,文件不存在,則不會再次嘗試檢查該文件是否存在。首次讀取 jaxp.properties 后,其中的屬性值不能再更改。
          • 如果可以,使用 Services API(在 JAR 規(guī)范中進行了詳細描述)來確定類名稱。Services API 將查找在運行時可用的 jar 中 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中的類名。
          • 平臺默認的 DocumentBuilderFactory 實例。

          這些過程,自己可以通過加vm參數(shù) "-verbose"的方式進行跟蹤

          posted @ 2008-09-12 10:40 小馬歌 閱讀(2190) | 評論 (0)編輯 收藏
           

          最近部署一個JAVA程序到Linux中的crontab,遇到了亂碼。因為以前一直都用英文信息,所以一直沒遇到這個問題。原來還是環(huán)境變量的問題,因為在crontab系統(tǒng)里不會攜帶用戶的環(huán)境參數(shù)。因此,需要額外添加。不過有點奇怪的是其中一些變量,不需要顯式export出來就可以了,比如PATH,JAVA_HOME之類的,而LANG參數(shù)則需要顯式export才可以,否則,就是好多問號,亂碼....


          crontab所引用的sync.cron
          #!/bin/bash
          CPATH=
          WEBLIB="/usr/local/apache-tomcat-5.5.20/webapps/banner/WEB-INF/lib"
          WEBCLASSPATH="/usr/local/apache-tomcat-5.5.20/webapps/banner/WEB-INF/classes"
          for i in "$WEBLIB"/*.jar;do
             CPATH="$CPATH":"$i"
          done
          CPATH="$WEBCLASSPATH":"$CPATH"

          export LANG="zh_CN.GB18030"
          /usr/local/jdk1.5.0/bin/java -cp $CPATH com.sandai.project.service.MailService


          執(zhí)行java程序的java命令,也要全路徑,否則也找不到該命令。
          posted @ 2008-09-12 09:51 小馬歌 閱讀(520) | 評論 (0)編輯 收藏
           
          試用rtx2007:
          1,rtx目前只支持windows平臺;
          2,二次開發(fā)支持很多語言,通過rtx server SDK實現(xiàn),跨平臺發(fā)提醒通過http cgi服務(wù)實現(xiàn);
          3,rtx client 支持web方式實現(xiàn)在線感知以及發(fā)起交談,發(fā)送文件等操作。

          /Files/xiaomage234/rtx-WEB-tool.rar

          /Files/xiaomage234/rtx_sdk_help.rar
          posted @ 2008-09-10 15:56 小馬歌 閱讀(668) | 評論 (0)編輯 收藏
           

          系統(tǒng)收到郵件都會保存在“/var/spool/mail/[linux用戶名]”文件中。
          在linux中輸入mail,就進行了收件箱,并顯示二十封郵件列表。

          此時命令提示符為"&"
          unread 標(biāo)記為未讀郵件
          h|headers 顯示當(dāng)前的郵件列表
          l|list 顯示當(dāng)前支持的命令列表
          ?|help 顯示多個查看郵件列表的命令參數(shù)用法
          d 刪除當(dāng)前郵件,指針并下移。 d 1-100 刪除第1到100封郵件
          f|from 只顯示當(dāng)前郵件的簡易信息。 f num 顯示某一個郵件的簡易信息
          f|from num 指針移動到某一封郵件
          z 顯示剛進行收件箱時的后面二十封郵件列表
          more|p|page 閱讀當(dāng)前指針?biāo)诘泥]件內(nèi)容 閱讀時,按空格鍵就是翻頁,按回車鍵就是下移一行
          t|type|more|p|page num 閱讀某一封郵件
          n|next|{什么都不填} 閱讀當(dāng)前指針?biāo)诘南乱环忄]件內(nèi)容
               閱讀時,按空格鍵就是翻頁,按回車鍵就是下移一行
          v|visual 當(dāng)前郵件進入純文本編輯模式
          n|next|{什么都不填} num 閱讀某一封郵件
          top 顯示當(dāng)前指針?biāo)诘泥]件的郵件頭
          file|folder 顯示系統(tǒng)郵件所在的文件,以及郵件總數(shù)等信息
          x 退出mail命令平臺,并不保存之前的操作,比如刪除郵件
          q 退出mail命令平臺,保存之前的操作,比如刪除已用d刪除的郵件,已閱讀郵件會轉(zhuǎn)存到當(dāng)前用戶家目錄下的mbox文件中。如果在mbox中刪除文件才會徹底刪除。
          在linux文本命令平臺輸入 mail -f mbox,就可以看到當(dāng)前目錄下的mbox中的郵件了。
          cd 改變當(dāng)前所在文件夾的位置
          寫信時,連按兩次Ctrl+C鍵則中斷工作,不送此信件。
          讀信時,按一次Ctrl+C,退出閱讀狀態(tài)。
          --------------------------------------
          Linux郵件命令用法

          1. 將文件當(dāng)做電子郵件的內(nèi)容送出
          語法:mail -s “主題”用戶名@地址< 文件
          例如:
          mail -s “program” user < file.c 將file.c

          當(dāng)做mail的內(nèi)容,送至user,主題為program。

          2. 傳送電子郵件給本系統(tǒng)用戶
          語法:mail 用戶名

          3. 傳送電子郵件至外地用戶
          語法: mail 用戶名@接受地址
          .../usr/lib/sendmail -bp
          ......“Mail queue is empty” ......mail ....

          例如:

          test@hotmail.com
          Subject : mail test
          :
          鍵入信文內(nèi)容
          : :
          按下Ctrl+D 鍵或. 鍵結(jié)束正文。
          連按兩次Ctrl+C鍵則中斷工作,不送此信件。
          Cc( Carbon copy) : 復(fù)制一份正文,給其他的收信人。

          4. 檢查所傳送的電子郵件是否送出,或滯留在郵件服務(wù)器中
          語法:/usr/lib/sendmail -bp
          若屏幕顯示為“Mail queue is empty” 的信息,表示mail 已送出。
          若為其他錯誤信息,表示電子郵件因故尚未送出。

          posted @ 2008-09-03 13:09 小馬歌 閱讀(704) | 評論 (0)編輯 收藏
           
          【Lighttpd 安裝配置】

          首先需要安裝:
          libpcre
          libz

          官方網(wǎng)址:http://www.lighttpd.net
          # cd /usr/local/src
          # wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.gz
          # tar -zxvf lighttpd-1.4.18.tar.gz
          # cd lighttpd-1.4.18

          # ./configure --prefix=/usr/local/lighttpd
          # make
          # make install

          # cd /usr/local/lighttpd
          # mkdir conf
          # cp /usr/local/src/lighttpd-1.4.18/doc/lighttpd.conf /usr/local/lighttpd/conf/
          # vi /usr/local/lighttpd/conf/lighttpd.conf
          ===============================================
          server.modules = (
          "mod_rewrite",
          "mod_redirect",
          "mod_alias",
          "mod_access",
          # "mod_cml",
          # "mod_trigger_b4_dl",
          # "mod_auth",
          # "mod_status",
          # "mod_setenv",
          # "mod_fastcgi",
          # "mod_proxy",
          "mod_simple_vhost",
          # "mod_evhost",
          # "mod_userdir",
          # "mod_cgi",
          "mod_compress",
          "mod_ssi",
          # "mod_usertrack",
          "mod_expire",
          # "mod_secdownload",
          # "mod_rrdtool",
          "mod_accesslog" )

          mimetype.assign = (
          ...
          ".rm" => "audio/x-pn-realaudio",
          ...
          ".smi" => "application/smil",
          ".smil" => "application/smil",
          ...
          )

          ssi.extension = ( ".shtml" )


          accesslog.filename = "/dev/null"
          accesslog.format = "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

          $HTTP["host"] == "home.cn.real.com" {
          accesslog.filename = "/real/WebSite/logs/backup/access_log.home"
          }


          $HTTP["url"] =~ "\.js|\.css|\.jpg|\.gif|\.swf|\/artistinfo\/|\/status\/|\.png|\.ico|\/player\/|\/radio\/sid\/" {
          accesslog.filename = "/dev/null"
          }

          dir-listing.activate = "disable"

          server.document-root = "/real/WebSite/htdocs/home.cn.real.com/"
          server.errorlog = "/usr/local/lighttpd/log/error.log"
          index-file.names = ( "index.html", "index.htm")
          server.pid-file = "/usr/local/lighttpd/log/lighttpd.pid"

          simple-vhost.server-root = "/real/WebSite/htdocs/"
          simple-vhost.default-host = "home.cn.real.com"
          simple-vhost.document-root = "/"

          compress.cache-dir = "/real/WebSite/cache/compress/"
          compress.filetype = ("text/plain", "text/html")



          #Performance
          server.max-keep-alive-requests = 2000
          server.max-keep-alive-idle = 10
          server.max-read-idle = 60
          server.max-write-idle = 360
          server.event-handler = "poll"
          server.max-fds = 2048



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

          # cp /usr/local/src/lighttpd-1.4.18/doc/rc.lighttpd.redhat /usr/local/lighttpd/bin/lighttpd.sh
          # vi /usr/local/lighttpd/bin/lighttpd.sh
          ===============================================

          LIGHTTPD_CONF_PATH="/usr/local/lighttpd/conf/lighttpd.conf"

          lighttpd="/usr/local/lighttpd/sbin/lighttpd"

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



          啟動lighttpd 服務(wù)器
          # /usr/local/lighttpd/bin/lighttpd.sh start
          (或者使用 # /usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/conf/lighttpd.conf )




          Installing services ?
          Lighttpd is meant to run a in background as daemon. You can either use the well known init-scripts or supervise to control it.

          init scripts ?
          The init-script that is shipped with the source-tarball is meant to be run on a LSB conforming platform like SuSE, Fedora or Debian.

          $ sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd > /etc/init.d/lighttpd
          $ chmod a+rx /etc/init.d/lighttpd
          $ cp -p doc/sysconfig.lighttpd /etc/sysconfig/lighttpd
          $ install -Dp ./doc/lighttpd.conf /etc/lighttpd/lighttpd.conf
          $ chkconfig lighttpd on
          If you're running CentOS (or RHEL) you might need to change the first line to this

          $ sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd.redhat > /etc/init.d/lighttpd
          In Debian\Ubuntu you use update-rc.d rather than chkconfig:

          $ sudo update-rc.d lighttpd defaults




          【安裝php (fast-cgi)】
          安裝 mysql
          安裝 libxml2-2.6.30.tar.gz

          ./configure \
          --prefix=/usr/local/php5-fcgi \
          --with-config-file-path=/etc \
          --with-mysql=/usr/local/mysql \
          --with-gd \
          --with-jpeg-dir \
          --with-zlib-dir \
          --with-png-dir \
          --with-freetype-dir \
          --with-curl \
          --with-libxml-dir=/usr/local \
          --enable-fastcgi \
          --enable-force-cgi-redirect \
          --enable-soap \
          --enable-sockets \
          --enable-ftp \
          --disable-debug

          # vi /etc/php.ini
          ===============================================
          cgi.fix_pathinfo=1
          ===============================================

          spawn-php.sh 是把 PHP with FastCGI 的環(huán)境變量初始化 (還不清楚如何使用,先不啟動spawn-php.sh)
          # cp /usr/local/src/lighttpd-1.4.18/doc/spawn-php.sh /usr/local/lighttpd/bin/

          # vi /usr/local/lighttpd/bin/spawn-php.sh

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

          SPAWNFCGI="/usr/local/lighttpd/bin/spawn-fcgi"

          FCGIPROGRAM="/usr/local/php5-fcgi/bin/php"

          USERID=root

          GROUPID=root

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

          # /usr/local/lighttpd/bin/spawn-php.sh


          ===============================================
          防盜鏈接配置
          ===============================================

          server.modules = (
          ...
          "mod_secdownload",
          "mod_flv_streaming",
          ...
          )

          flv-streaming.extensions = (".flv")
          secdownload.secret = "2008"
          secdownload.document-root = "/real/WebSite/videos/flv/"
          secdownload.uri-prefix = "/dl/"
          secdownload.timeout = 120


          <?php
          $secret = "2008";
          $uri_prefix = "/dl/";

          # filename
          $f = "/test.flv";

          # current timestamp
          $t = time();
          $t_hex = sprintf("%08x", $t);

          $m = md5($secret.$f.$t_hex);

          printf('<a href="%s%s/%s%s">%s</a>',
          $uri_prefix, $m, $t_hex, $f, $f);
          ?>
          posted @ 2008-08-29 16:16 小馬歌 閱讀(517) | 評論 (2)編輯 收藏
           

          使用 Nginx 提升網(wǎng)站訪問速度2008-08-26 11:27     主要介紹如何在 Linux 系統(tǒng)上安裝高性能的 HTTP 服務(wù)器 —— Nginx、并在不改變原有網(wǎng)站結(jié)構(gòu)的條件下用 Nginx 來提升網(wǎng)站的訪問速度。

          Nginx 簡介

          Nginx("engine x") 是一個高性能的 HTTP 和 反向代理 服務(wù)器,也是一個 IMAP/POP3/SMTP 代理服務(wù)器。 Nginx是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發(fā)的,它已經(jīng)在該站點運行超過兩年半了。 Igor 將源代碼以類BSD 許可證的形式發(fā)布。盡管還是測試版,但是,Nginx 已經(jīng)因為它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名了。

          根據(jù)最新一期(08 年 6 月份)的 NetCraft 調(diào)查報告顯示,已經(jīng)有超過兩百萬的主機使用了 Nginx,這個數(shù)字超過了另外一個輕量級的 HTTP 服務(wù)器 lighttpd, 排名第四,并且發(fā)展迅速。下面是這份報告的前幾名的報表:

          以下為引用的內(nèi)容:
          產(chǎn)品          網(wǎng)站數(shù)                    
          Apache 84,309,103
          IIS 60,987,087
          Google GFE 10,465,178
          Unknown 4,903,174
          nginx 2,125,160
          Oversee 1,953,848
          lighttpd 1,532,952 


                     
          關(guān)于這期調(diào)查報告的更詳細信息請看下面鏈接:

          http://survey.netcraft.com/Reports/200806/           
                                    

          使用 Nginx 前必須了解的事項
                     
          目前官方 Nginx 并不支持 Windows,您只能在包括 Linux、UNIX、BSD 系統(tǒng)下安裝和使用;
          Nginx 本身只是一個 HTTP 和反向代理服務(wù)器,它無法像 Apache 一樣通過安裝各種模塊來支持不同的頁面腳本,例如 PHP、CGI 等;
          Nginx 支持簡單的負載均衡和容錯;
          支持作為基本 HTTP 服務(wù)器的功能,例如日志、壓縮、Byte ranges、Chunked responses、SSL、虛擬主機等等,應(yīng)有盡有。
                      在 Linux 下安裝 Nginx
                      為了確保能在 Nginx 中使用正則表達式進行更靈活的配置,安裝之前需要確定系統(tǒng)是否安裝有 PCRE(Perl Compatible Regular Expressions)包。您可以到 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下載最新的 PCRE 源碼包,使用下面命令下載編譯和安裝 PCRE 包

          # wget ftp://ftp.csx.cam.ac.uk/pub/soft ... cre/pcre-7.7.tar.gz
          # tar zxvf pcre-7.7.tar.gz
          # cd pcre-7.7
          # ./configure
          # make
          # make install
                                 

                      接下來安裝 Nginx,Nginx 一般有兩個版本,分別是穩(wěn)定版和開發(fā)版,您可以根據(jù)您的目的來選擇這兩個版本的其中一個,下面是把 Nginx 安裝到 /opt/nginx 目錄下的詳細步驟:
                    

          # wget http://sysoev.ru/nginx/nginx-0.6.31.tar.gz
          # tar zxvf nginx-0.6.31.tar.gz


          # cd nginx-0.6.31
          # ./configure --with-http_stub_status_module –prefix=/opt/nginx
          # make
          # make install
                                 

                      其中參數(shù) --with-http_stub_status_module 是為了啟用 nginx 的 NginxStatus 功能,用來監(jiān)控 Nginx 的當(dāng)前狀態(tài)。
                      安裝成功后 /opt/nginx 目錄下有四個子目錄分別是:conf、html、logs、sbin 。其中 Nginx 的配置文件存放于conf/nginx.conf,Nginx 只有一個程序文件位于 sbin 目錄下的 nginx 文件。確保系統(tǒng)的 80端口沒被其他程序占用,運行 sbin/nginx 命令來啟動 Nginx,打開瀏覽器訪問此機器的 IP,如果瀏覽器出現(xiàn) Welcome tonginx! 則表示 Nginx 已經(jīng)安裝并運行成功。
                      常用的 Nginx 參數(shù)和控制
                      程序運行參數(shù)
                      Nginx 安裝后只有一個程序文件,本身并不提供各種管理程序,它是使用參數(shù)和系統(tǒng)信號機制對 Nginx 進程本身進行控制的。 Nginx 的參數(shù)包括有如下幾個:
                                      -c <path_to_config>:使用指定的配置文件而不是 conf 目錄下的 nginx.conf 。
                                      -t:測試配置文件是否正確,在運行時需要重新加載配置的時候,此命令非常重要,用來檢測所修改的配置文件是否有語法錯誤。
                                      -v:顯示 nginx 版本號。

          -V:顯示 nginx 的版本號以及編譯環(huán)境信息以及編譯時的參數(shù)。

          例如我們要測試某個配置文件是否書寫正確,我們可以使用以下命令

          sbin/nginx – t – c conf/nginx2.conf

          通過信號對 Nginx 進行控制

          Nginx 支持下表中的信號:

          信號名                                             作用描述                   

          TERM, INT 快速關(guān)閉程序,中止當(dāng)前正在處理的請求

          QUIT 處理完當(dāng)前請求后,關(guān)閉程序

          HUP 重新加載配置,并開啟新的工作進程,關(guān)閉就的進程,此操作不會中斷請求

          USR1 重新打開日志文件,用于切換日志,例如每天生成一個新的日志文件

          USR2 平滑升級可執(zhí)行程序

          WINCH 從容關(guān)閉工作進程

          有兩種方式來通過這些信號去控制 Nginx,第一是通過 logs 目錄下的 nginx.pid 查看當(dāng)前運行的 Nginx 的進程 ID,通過 kill – XXX <pid> 來控制 Nginx,其中 XXX 就是上表中列出的信號名。如果您的系統(tǒng)中只有一個 Nginx 進程,那您也可以通過 killall 命令來完成,例如運行 killall – s HUP nginx 來讓 Nginx 重新加載配置。

          配置 Nginx

          先來看一個實際的配置文件:

          以下為引用的內(nèi)容:
                      user nobody;# 工作進程的屬主
          worker_processes 4;# 工作進程數(shù),一般與 CPU 核數(shù)等同
          #error_log logs/error.log;
          #error_log logs/error.log notice;
          #error_log logs/error.log info;

          #pid        logs/nginx.pid;

          events {
              use epoll;#Linux 下性能最好的 event 模式
              worker_connections 2048;# 每個工作進程允許最大的同時連接數(shù)
          }

          http {
              include       mime.types;
              default_type application/octet-stream;

              #log_format main '$remote_addr - $remote_user [$time_local] $request '
              #                  '"$status" $body_bytes_sent "$http_referer" '
              #                  '"$http_user_agent" "$http_x_forwarded_for"';

              #access_log off;
              access_log logs/access.log;# 日志文件名

              sendfile        on;
              #tcp_nopush     on;
              tcp_nodelay     on;

              keepalive_timeout 65;

              include          gzip.conf;
             
              # 集群中的所有后臺服務(wù)器的配置信息
              upstream tomcats {
                   server 192.168.0.11:8080 weight=10;
                   server 192.168.0.11:8081 weight=10;
                   server 192.168.0.12:8080 weight=10;
                   server 192.168.0.12:8081 weight=10;
                   server 192.168.0.13:8080 weight=10;
                   server 192.168.0.13:8081 weight=10;
              }

              server {
                  listen       80;#HTTP 的端口
                  server_name localhost;

                  charset utf-8;

                  #access_log logs/host.access.log main;

                   location ~ ^/NginxStatus/ {
                      stub_status on; #Nginx 狀態(tài)監(jiān)控配置
                      access_log off;
                   }

                   location ~ ^/(WEB-INF)/ {
                      deny all;
                   }
                

                   location ~ \.(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|
                   zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ {
                       root /opt/webapp;
                      expires 24h;
                  }

                  location / {
                      proxy_pass http://tomcats;# 反向代理
                      include proxy.conf;
                  }

                  error_page 404 /html/404.html;

                  # redirect server error pages to the static page /50x.html
                  #
                   error_page 502 503 /html/502.html;
                  error_page 500 504 /50x.html;
                  location = /50x.html {
                      root   html;
                  }
              }
          }
           


          Nginx 監(jiān)控

          上面是一個實際網(wǎng)站的配置實例,其中灰色文字為配置說明。上述配置中,首先我們定義了一個 location ~^/NginxStatus/,這樣通過 http://localhost/NginxStatus/ 就可以監(jiān)控到 Nginx的運行信息,顯示的內(nèi)容如下:

          以下為引用的內(nèi)容:
          Active connections: 70
          server accepts handled requests
          14553819 14553819 19239266
          Reading: 0 Writing: 3 Waiting: 67 


          NginxStatus 顯示的內(nèi)容意思如下:
                     
          active connections – 當(dāng)前 Nginx 正處理的活動連接數(shù)。

          erveraccepts handled requests -- 總共處理了 14553819 個連接 , 成功創(chuàng)建 14553819 次握手 (證明中間沒有失敗的 ), 總共處理了 19239266 個請求 ( 平均每次握手處理了 1.3 個數(shù)據(jù)請求 )。

          reading -- nginx 讀取到客戶端的 Header 信息數(shù)。

          writing -- nginx 返回給客戶端的 Header 信息數(shù)。

          waiting -- 開啟 keep-alive 的情況下,這個值等于 active - (reading + writing),意思就是 Nginx 已經(jīng)處理完正在等候下一次請求指令的駐留連接。

          靜態(tài)文件處理

          通過正則表達式,我們可讓 Nginx 識別出各種靜態(tài)文件,例如 images 路徑下的所有請求可以寫為:

          以下為引用的內(nèi)容:
                      location ~ ^/images/ {
              root /opt/webapp/images;
          }
                                  
                      而下面的配置則定義了幾種文件類型的請求處理方式。
                      location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ {
              root /opt/webapp;
              expires 24h;
          }
           


          對于例如圖片、靜態(tài) HTML 文件、js 腳本文件和 css 樣式文件等,我們希望 Nginx 直接處理并返回給瀏覽器,這樣可以大大的加快網(wǎng)頁瀏覽時的速度。因此對于這類文件我們需要通過 root 指令來指定文件的存放路徑,同時因為這類文件并不常修改,通過 expires 指令來控制其在瀏覽器的緩存,以減少不必要的請求。 expires 指令可以控制 HTTP 應(yīng)答中的“ Expires ”和“ Cache-Control ”的頭標(biāo)(起到控制頁面緩存的作用)。您可以使用例如以下的格式來書寫 Expires:

          以下為引用的內(nèi)容:
          expires 1 January, 1970, 00:00:01 GMT;
          expires 60s;
          expires 30m;
          expires 24h;
          expires 1d;
          expires max;
          expires off;


          動態(tài)頁面請求處理

          Nginx本身并不支持現(xiàn)在流行的 JSP、ASP、PHP、PERL 等動態(tài)頁面,但是它可以通過反向代理將請求發(fā)送到后端的服務(wù)器,例如Tomcat、Apache、IIS 等來完成動態(tài)頁面的請求處理。前面的配置示例中,我們首先定義了由 Nginx直接處理的一些靜態(tài)文件請求后,其他所有的請求通過 proxy_pass 指令傳送給后端的服務(wù)器(在上述例子中是 Tomcat)。最簡單的 proxy_pass 用法如下:

          以下為引用的內(nèi)容:
                      location / {
              proxy_pass        http://localhost:8080;
              proxy_set_header X-Real-IP $remote_addr;
          }


          這里我們沒有使用到集群,而是將請求直接送到運行在 8080 端口的 Tomcat 服務(wù)上來完成類似 JSP 和 Servlet 的請求處理。

          當(dāng)頁面的訪問量非常大的時候,往往需要多個應(yīng)用服務(wù)器來共同承擔(dān)動態(tài)頁面的執(zhí)行操作,這時我們就需要使用集群的架構(gòu)。 Nginx 通過 upstream 指令來定義一個服務(wù)器的集群,最前面那個完整的例子中我們定義了一個名為 tomcats 的集群,這個集群中包括了三臺服務(wù)器共 6 個 Tomcat 服務(wù)。而 proxy_pass 指令的寫法變成了:

          以下為引用的內(nèi)容:
                      location / {
              proxy_pass        http://tomcats;
              proxy_set_header X-Real-IP $remote_addr;
          }


          在 Nginx 的集群配置中,Nginx 使用最簡單的平均分配規(guī)則給集群中的每個節(jié)點分配請求。一旦某個節(jié)點失效時,或者重新起效時,Nginx 都會非常及時的處理狀態(tài)的變化,以保證不會影響到用戶的訪問。

          總結(jié)

          盡管整個程序包只有五百多 K,但麻雀雖小、五臟俱全。 Nginx官方提供的各種功能模塊應(yīng)有盡有,結(jié)合這些模塊可以完整各種各樣的配置要求,例如:壓縮、防盜鏈、集群、FastCGI、流媒體服務(wù)器、Memcached 支持、URL 重寫等等,更關(guān)鍵的是 Nginx 擁有 Apache 和其他 HTTP服務(wù)器無法比擬的高性能。您甚至可以在不改變原有網(wǎng)站的架構(gòu)上,通過在前端引入 Nginx 來提升網(wǎng)站的訪問速度。
           

          posted @ 2008-08-29 15:01 小馬歌 閱讀(184) | 評論 (0)編輯 收藏
           
          cacheModel的屬性值等于指定的 cacheModel 元素的 name 屬性值。屬性 cacheModel 定義查詢 mapped statement 的緩存。每一個查詢 mapped statement 可以使用不同或相同的cacheModel,以下給出個例子。

          <cacheModel id="product-cache" imlementation="LRU"(或 type ="LRU") [readOnly=“true” serialize=“false”]> // [ ] 表示可選
              <flushInterval hours="24"/>
              <flushOnExecute statement="insertProduct"/>
              <flushOnExecute statement="updateProduct"/>
              <flushOnExecute statement="deleteProduct"/>
          <property name="size" value="1000" />
          </cacheModel>

          <statement id="getPoductList" parameerClass="int" cacheModel="product-cache">
              select * from PRODUCT where PRD_CAT_ID = #value#
          </statement>

          // 使用“近期最少使用”(LRU)實現(xiàn)
          // 上面例子中,“getProductList”的緩存每 24 小時刷新一次,或當(dāng)更新的操作發(fā)生時刷新。一個 cacheModel 只能有一個 flushInteval 元素,它可以使用 hours,minutes,seconds或 milliseconds 來設(shè)定。某些 cache model 的實現(xiàn)可能需要另外的屬性,如上面的“cache-size”屬性。在 LRU cache model 中,cache-size指定了緩存儲存的項數(shù)


          緩存類型
          Cache Model 使用插件方式來支持不同的緩存算法。它的實現(xiàn)在cacheModel 的用 type 屬性來指定(如上所示)。指定的實現(xiàn)類必須實現(xiàn) CacheController接口,或是下面 4個別名中的其中之一。Cache Model 實現(xiàn)的其他配置參數(shù)通過 cacheModel的 property元素來設(shè)置。目前包括以下的 4 個實現(xiàn):

          "MEMORY" (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)
          MEMORY cache 實現(xiàn)使用 reference 類型來管理 cache 的行為。垃圾收集器可以根據(jù) reference類型判斷是否要回收 cache 中的數(shù)據(jù)。MEMORY實現(xiàn)適用于沒有統(tǒng)一的對象重用模式的應(yīng)用,或內(nèi)存不足的應(yīng)用。

          MEMORY實現(xiàn)可以這樣配置:

          <cacheModel id="product-cache" type="MEMORY">
          <flushInterval hours="24"/>
          <flushOnExecute statement="insertProduct"/>
          <flushOnExecute statement="updateProduct"/>
          <flushOnExecute statement="deleteProduct"/>
          <property name="reference-type" value="WEAK"/>
          </cacheModel>

          // MEMORY cache 實現(xiàn)只認識一個<property>元素。這個名為“reference-type”屬性的值必須是 STRONG,SOFT 和 WEAK 三者其一。這三個值分別對應(yīng)于 JVM 不同的內(nèi)存 reference類型。

          "LRU" (com.ibatis.db.sqlmapache.lru.LruCacheController)
          LRU Cache 實現(xiàn)用“近期最少使用”原則來確定如何從 Cache 中清除對象。當(dāng) Cache 溢出時,最近最少使用的對象將被從 Cache 中清除。使用這種方法,如果一個特定的對象總是被使用,它將保留在 Cache 中,而且被清除的可能性最小。對于在較長的期間內(nèi),某些用戶經(jīng)常使用某些特定對象的情況(例如,在 PaginatedList 和常用的查詢關(guān)鍵字結(jié)果集中翻
          頁),LRU Cache 是一個不錯的選擇。

          LRU Cache實現(xiàn)可以這樣配置:

          <cacheModel id="product-cache" type="LRU">
          <flushInterval hours="24"/>
          <flushOnExecute statement="insertProduct"/>
          <flushOnExecute statement="updateProduct"/>
          <flushOnExecute statement="deleteProduct"/>
          <property name="size" value="1000"/>
          </cacheModel>

          // LRU Cache實現(xiàn)只認可一個 property元素。其名為“cache-size”的屬性值必須是整數(shù),代表同時保存在 Cache中對象的最大數(shù)目。值得注意的是,這里指的對象可以是任意的,從單一的 String 對象到 Java Bean 的 ArrayList 對象都可以。因此,不要 Cache太多的對象,以免內(nèi)存不足。


          "FIFO" (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)
          FIFO Cache 實現(xiàn)用“先進先出”原則來確定如何從 Cache 中清除對象。當(dāng) Cache 溢出時,最先進入 Cache 的對象將從 Cache 中清除。對于短時間內(nèi)持續(xù)引用特定的查詢而后很可能不再使用的情況,F(xiàn)IFO Cache 是很好的選擇。

          FIFO Cache可以這樣配置:

          <cacheModel id="product-cache" type="FIFO">
          <flushInterval hours="24"/>
          <flushOnExecute statement="insertProduct"/>
          <flushOnExecute statement="updateProduct"/>
          <flushOnExecute statement="deleteProduct"/>
          <property name="size" value="1000"/>
          </cacheModel>

          // property 的 size 同LRU

          "OSCACHE" (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)
          OSCACHE Cache 實現(xiàn)是OSCache2.0緩存引擎的一個 Plugin。它具有高度的可配置性,
          分布式,高度的靈活性。

          OSCACHE 實現(xiàn)可以這樣配置:
          <cacheModel id="product-cache" type="OSCACHE">
          <flushInterval hours="24"/>
          <flushOnExecute statement="insertProduct"/>
          <flushOnExecute statement="updateProduct"/>
          <flushOnExecute statement="deleteProduct"/>
          </cacheModel>

          // OSCACHE 實現(xiàn)不使用 property 元素,而是在類路徑的根路徑中使用標(biāo)準(zhǔn)的oscache.properties 文件進行配置。在 oscache.properties文件中,您可以配置 Cache 的算法(和上面討論的算法很類似),Cache 的大小,持久化方法(內(nèi)存,文件等)和集群方法。
          要獲得更詳細的信息,請參考 OSCache 文檔。OSCache 及其文檔可以從 OpenSymphony
          網(wǎng)站上獲取:
          http://www.opensymphony.com/oscache/
          posted @ 2008-08-29 12:09 小馬歌 閱讀(925) | 評論 (0)編輯 收藏
          僅列出標(biāo)題
          共95頁: First 上一頁 81 82 83 84 85 86 87 88 89 下一頁 Last 
           
          主站蜘蛛池模板: 德州市| 张家川| 德清县| 长葛市| 长岭县| 涪陵区| 邳州市| 舞钢市| 江孜县| 呈贡县| 手游| 鹿邑县| 科尔| 连南| 无锡市| 新民市| 黑河市| 临汾市| 河北区| 昌江| 方城县| 宣城市| 顺平县| 贞丰县| 肇庆市| 巍山| 楚雄市| 克什克腾旗| 禹城市| 任丘市| 富源县| 天祝| 绥滨县| 通城县| 泾川县| 深泽县| 凉城县| 伊金霍洛旗| 金乡县| 巴塘县| 徐闻县|