小菜毛毛技術(shù)分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

          #

          1.hibernate中配置int和integer的區(qū)別
          2.手寫,spring+hibernate配置
          3.JavaScript時(shí)間和如何實(shí)現(xiàn)繼承
          其他略忘了

          posted @ 2010-04-08 09:35 小菜毛毛 閱讀(229) | 評(píng)論 (0)編輯 收藏

          下面的安裝以myeclipse6.0為例

          一、下載:

          http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download(jdaclipse插件主頁)

          下載插件:

          JadClipse 3.3

          This release stream is appropriate for Eclipse 3.3.

          Filename Size Description
          net.sf.jadclipse_3.3.0.jar 45 KB JadClipse for Eclipse >= 3.3M6


          JadClipse 3.2

          This release stream is appropriate for Eclipse 3.2.

          Filename Size Description
          net.sf.jadclipse_3.2.4.jar 45 KB JadClipse for Eclipse >= 3.2M5
          jadclipse_3.2.0.jar 54 KB JadClipse for Eclipse 3.2M3 and M4


          JadClipse 3.1

          This release stream is appropriate for Eclipse 3.1.

          Filename Size Description
          jadclipse_3.1.0.jar 54 KB JadClipse for Eclipse 3.1 (including milestone builds starting from 3.1M6 up to 3.2M2)

          myeclipse6.0 就下載JadClipse 3.3


          下載Jad反編譯工具:
          http://www.varaneckas.com/jad,在該頁中找到適合自己操作系統(tǒng)平臺(tái)的jad下載。下載后解壓,然后將解壓后的jad.exe文件復(fù)制到%JAVA_HOME%"bin目錄下面(可以將jad.exe放到任意位置,只要記住其存放路徑就好,下面要用到)。

          二、安裝:

          Eclipse中的插件安裝可以參考:
             
          方法1、直接將x.x.x.jarx.x.x.代表版本號(hào))復(fù)制到%ECLIPSE_HOME%"plugins目錄下。

          方法2、使用link方式安裝,建立D"Myplugins"jadclipse3.2.4"eclipse"plugins的目錄結(jié)構(gòu),將jadclipse_3.2.4.jar放到plugins目錄下面(注:其中D"Myplugins為你自己定義的一個(gè)專門放置插件的目錄)。再在%ECLIPSE_HOME%"links目錄下面建立一個(gè)jadclipse3.2.4.link文件(該文件名隨便取)。文件里面內(nèi)容為:path=D/Myplugins/jadclipse3.2.4.

          三、 使用:
          啟動(dòng)eclipse,點(diǎn)擊反編譯的類文件,此時(shí)會(huì)激活jadclipse插件,在eclipse菜單中會(huì)多出一個(gè)jadclipse菜單, 如下圖所示:

          一般地它會(huì)自動(dòng) 反編譯相應(yīng)的class文件,如果沒有自動(dòng)反編譯,請(qǐng)點(diǎn)擊
          jadclipse->Decompile
          如下圖所示:


          常見問題及解決:

          (一)啟動(dòng)eclipse,打開Window->Preferences->Java->JadClipse,如果沒有找到JadClipse,即JadClipse插件沒有激活。

          1)檢查插件安裝的版 本是否與你安裝的eclipse版本對(duì)應(yīng)

          2)使用 –clean參數(shù)來啟動(dòng)eclipse
            (二)在使用JadClipse插件反編譯class文件時(shí)出現(xiàn)如下類似錯(cuò)誤:
          /*jadclipse*/
           
          /*
                         DECOMPILATION REPORT
           
                         Decompiled from: D:"Program Files"Java"jdk1.5.0_12"jre"lib"rt.jar
                         Total time: 16 ms
                         Jad reported messages/errors:
                         Exit status: 0
                         Caught exceptions:
          java.io.IOException: CreateProcess: (...)
           

          請(qǐng)確保你的Jad路徑在eclipse中正確制定。
             
          啟動(dòng)eclipse,打開:Window->Preferences->Java->JadClipse.
          1
          Path to decompiler,這里設(shè)置反編譯工具jad的全路徑名,比如:%JAVA_HOME%"bin"jad.exe.
          2
          Directory for temporary files,這里設(shè)置臨時(shí) 文件路徑。

          至于Window->Preferences->Java->JadClipse目錄下的DebugDirectivesFormattingMisc目錄中的參數(shù) 設(shè)置,就不再羅嗦了。

          (三)安裝完成后,eclipse沒有自動(dòng)將JadClipse Class File Viewer設(shè)置成class文件的缺省打開方式。

          如果沒有默認(rèn),可以在EclipseWindows—> Perference—>General->Editors->File Associations中修改“*.class”默認(rèn)關(guān)聯(lián)的編輯器為“JadClipse Class File Viewer”。設(shè)置完成后,雙擊*.class文件,eclipse將自動(dòng)反編譯。

          posted @ 2010-04-01 11:13 小菜毛毛 閱讀(574) | 評(píng)論 (0)編輯 收藏

          OGNL介紹
          OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強(qiáng)大的表達(dá)式語言(Expression Language,簡稱為EL),通過它簡單一致的表達(dá)式語法,可以存取對(duì)象的任意屬性,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)化等功 能。它使用相同的表達(dá)式去存取對(duì)象的屬性。
          XWork遵循“不要重復(fù)地發(fā)明同一個(gè)輪子”的理論,它的表達(dá)式語言核心用的就是這個(gè)OGNL。我們先 來看看一個(gè)簡單的例子:
          還記得我們用戶注冊(cè)的那個(gè)例子嗎?我們輸入框的name用到的名字就是OGNL的表達(dá)式,比如:用戶名的輸入 框:“<input type="text" name="user.username">”,在用戶注冊(cè)成功之后我們要顯示用戶注冊(cè)的信息,用了“<ww:property value="user.username"/>”。Input輸入框里的“user.username”,它解析成Java語句 為:getUser().setUsername();,property標(biāo)簽里的“user.username”解析為Java語 句:getUser.getUsername();。
          我們的兩個(gè)表達(dá)式都是相同的,但前一個(gè)保存對(duì)象屬性的值,后一個(gè)是取得對(duì)象屬性的值。表達(dá)式 語言簡單、易懂卻又功能強(qiáng)大,關(guān)于OGNL更多的介紹可以去http://www.ognl.org, 那里有很詳細(xì)的文檔
           
          值堆棧-OgnlValueStack
          OGNL在框架中的應(yīng)用,最主要是支持我們的值堆棧(Value Stack)——OgnlValueStack,它主要的功能是通過表達(dá)式語言來存取對(duì)象的屬性。用戶界面輸入數(shù)據(jù),它會(huì)根據(jù)保存表達(dá)式將數(shù)據(jù)依次保存到 它堆棧的對(duì)象中,業(yè)務(wù)操作完成,結(jié)果數(shù)據(jù)會(huì)通過表達(dá)式被獲取、輸出。
          還記得我們用戶注冊(cè)的例子嗎?下面我們用一段程序來演示它向 OgnlValueStack中保存、取得數(shù)據(jù)的步驟:
           
          // DemoRegisterValueStack
          package example.register;
          import com.opensymphony.xwork.util.OgnlValueStack;
           
          public class DemoRegisterValueStack {
              public void demo(){
                  RegisterAction action = new RegisterAction();
                  OgnlValueStack valueStack= new OgnlValueStack();
                  valueStack.push(action);
                 
                  valueStack.setValue("user.username","Babydavic");
                  System.out.println("username = "+valueStack.findValue("user.username"));
              }
           
              public static void main(String[] args) {
          DemoRegisterValueStack demoValueStack = new DemoRegisterValueStack();
                  demoValueStack.demo();
              }
          }
           
          我們來看一看它的demo()方法:
          1、   創(chuàng)建我們的Action(RegisterAction)類的對(duì)象action,將action對(duì)象壓入堆棧valueStack中。在WebWrok中 Action的創(chuàng)建、入棧是在DefaultActionInvocation構(gòu)造函數(shù)中進(jìn)行的,詳細(xì)介紹見:ServletDispatcher原理。
          2、   通過表達(dá)式語言,調(diào)用堆棧對(duì)象的get()、set()方法,設(shè)置該對(duì)象的值。
             public void setValue(String expr, Object value)
             語句:valueStack.setValue("user.username","Babydavic");
             的作用等同于:action.getUser().setUsername("Babydavic");
          3、   通過表達(dá)式語言,去堆棧對(duì)象中查找我們前面保存的值,并在控制臺(tái)打印。valueStack.findValue("user.username")等同 與語句:
          action.getUser().getUsername()
          最后控制臺(tái)打印的結(jié)果:
                   username = Babydavic
           
           
          CompoundRoot
          在OgnlValueStack中,一個(gè)堆棧其 實(shí)是一個(gè)List。查看OgnlValueStack你會(huì)發(fā)現(xiàn),堆棧就是 com.opensymphony.xwork.util.CompoundRoot類的對(duì)象:
           
          public class CompoundRoot extends ArrayList {
              //~ Constructors /////////////////////////////////////
              public CompoundRoot() {
          }
           
              public CompoundRoot(List list) {
                  super(list);
          }
           
              //~ Methods ////////////////////////////////////////////
              public CompoundRoot cutStack(int index) {
                  return new CompoundRoot(subList(index, size()));
          }
           
              public Object peek() {
                  return get(0);
              }
              public Object pop() {
                  return remove(0);
              }
              public void push(Object o) {
                  add(0, o);
              }
          }

          我們通過表達(dá)式向堆棧對(duì)象操作時(shí),我們并不知道堆棧中有哪些對(duì)象。OgnlValueStack會(huì)根據(jù)堆棧由上向下的順序(先入棧在下面,最后入棧 在最上面)依次去查找與表達(dá)式匹配的對(duì)象方法,找到即進(jìn)行相應(yīng)的存取操作。假設(shè)后面對(duì)象也有相同的方法,將不會(huì)被調(diào)用。
          下面我們看一個(gè)對(duì) OgnlValueStack操作的程序,它主要演示了如何對(duì)Map對(duì)象的存取和OgnlValueStack堆棧的原理
           
          package example.register;
           
          import com.opensymphony.xwork.util.OgnlValueStack;
           
          public class DemoGroupValueStack {
             
              public void demoAction(){
                  DemoGroupAction action = new DemoGroupAction();
                  OgnlValueStack valueStack= new OgnlValueStack();
                  valueStack.push(action);
                 
                  User zhao = new User();
                  zhao.setUsername("zhao");
                  zhao.setEmail("zhao@yahoo.com.cn");
                 
                  User qian = new User();
                  qian.setUsername("qian");
                  qian.setEmail("qian@yahoo.com.cn");
                 
                  valueStack.setValue("users['zhao']",zhao);
                  valueStack.setValue("users['qian']",qian);
                 
                 
                  System.out.println("users['zhao'] = "+valueStack.findValue("users['zhao']"));
                  System.out.println("users['qian'] = "+valueStack.findValue("users['qian']"));
                  System.out.println("users size = "+valueStack.findValue("users.size"));
                 
                  System.out.println("allUserName[0] = "+valueStack.findValue("allUserName[0]"));
              }
             
              public void demoModels(){
                 
                  User model_a = new User();
                  model_a.setUsername("model_a");
                  User model_b = new User();
                  model_b.setUsername("model_b");
                  User model_c = new User();
                  model_c.setUsername("model_c");
                 
                  OgnlValueStack valueStack= new OgnlValueStack();
                  valueStack.push(model_a);
                  valueStack.push(model_b);
                  valueStack.push(model_c);
                 
                  System.out.println("username = "+valueStack.findValue("username"));
                  System.out.println("[1].username = "+valueStack.findValue("[1].username"));
                  System.out.println("[0].toString = "+valueStack.findValue("[0]"));
                  System.out.println("[1].toString = "+valueStack.findValue("[1]"));
                  System.out.println("[2].toString = "+valueStack.findValue("[2]"));
                 
              }
              public static void main(String[] args) {
                  DemoGroupValueStack demoValueStack = new DemoGroupValueStack();
                  demoValueStack.demoAction();
                  demoValueStack.demoModels();
              }
          }
           
           
          package example.register;
           
          import java.util.ArrayList;
          import java.util.HashMap;
          import java.util.List;
          import java.util.Map;
           
          public class DemoGroupAction {
             
              private Map users = new HashMap();
             
              public Map getUsers(){
                  return this.users;
              }
             
              public List getAllUserName(){
                  return new ArrayList(users.keySet());
              }
              public String execute(){
                  //執(zhí)行業(yè)務(wù)操作
                  return null;
              }
              public String toString(){
                  return users.toString();
              }
          }
          注意:1、 Map屬性的存取,它的表達(dá)式語言如:users['zhao'],注意它用’’來引用HashMap的key字符串。
          2、 demoModels()方法演示了OgnlValueStack中堆棧的原理,請(qǐng)?zhí)貏e注意它的 [0].toString、[1].toString、[2].toString,它們依次調(diào)用堆棧中對(duì)象的toString()方法,并逐一的減少堆棧 最上面的對(duì)象。
          控制臺(tái)輸出的結(jié)果如下:
          users['zhao'] = username=zhao;password=null;email=zhao@yahoo.com.cn;age=0
          users['qian'] = username=qian;password=null;email=qian@yahoo.com.cn;age=0
          users size = 2
          allUserName[0] = qian
           
          username = model_c
          [1].username = model_b
          [0].toString = [username=model_c;password=null;email=null;age=0, username=model_b;password=null;email=null;age=0, username=model_a;password=null;email=null;age=0]
          [1].toString = [username=model_b;password=null;email=null;age=0, username=model_a;password=null;email=null;age=0]
          [2].toString = [username=model_a;password=null;email=null;age=0]

          posted @ 2010-03-31 10:52 小菜毛毛 閱讀(486) | 評(píng)論 (0)編輯 收藏

          axis2創(chuàng)建web service(一)

           http://blog.csdn.net/chnic/archive/2008/03

          /13/2179760.aspx

          http://www.javaeye.com/topic/284387                                                

          axis2 是新一代的web service開發(fā)工具,它會(huì)讓你的web service開發(fā)變得輕松,快捷。下面讓我們以一個(gè)實(shí)際的例子來體驗(yàn)一下。

          首先,工欲善其事,必先利其器。就讓我們先做好一些必備的準(zhǔn)備工作吧。

           

          1.下載axis2 的2進(jìn)制的包和war,現(xiàn)在的最新版本是1.4.1 發(fā)布時(shí)間是2008-8-25

          地址 http://ws.apache.org/axis2

          具體的1.4.1版本的http://ws.apache.org/axis2/download/1_4_1/download.cgi

           

          2.把下載后的war放入tomcat的webapps目錄里,然后啟動(dòng)tomcat,這樣war包就會(huì)自動(dòng)解壓為目錄axis2

          在瀏覽器中輸入http://localhost:8080/axis2/ ,如果一切正常你會(huì)看到下面的畫面

           




           
           3,就開始準(zhǔn)備一下axis2的eclispe的插件 了。axis2的eclispe插件分為2個(gè),一個(gè)是幫助我們生成aar文件的,另一個(gè)是幫 我們用wsdl文件生成stub代碼的。

          下載地址是

          http://www.apache.org/dyn/mirrors/mirrors.cgi/ws/axis2/tools/1_4_1/axis2-eclipse-service-archiver-wizard.zip

           

          http://www.apache.org/dyn/mirrors/mirrors.cgi/ws/axis2/tools/1_4_1/axis2-eclipse-codegen-wizard.zip

          下載完2個(gè)壓縮文件后,可以直接把解壓后的文件拷貝到plugins目錄中,也可以在links目錄中寫文件路徑的方式來安裝插件,安裝完插件后, 打開eclipse,在package explorer 中點(diǎn)擊右鍵--->選擇new---->other

          如果安裝正確你會(huì)看到



           這樣準(zhǔn)備工作就都做好了。接下來就是正式開發(fā)了。

          開發(fā)的過程,下回分解。。。。。

           

          工具都已經(jīng)準(zhǔn)備齊全了。我們來動(dòng)手做一個(gè)小例子來小試牛刀!

          這一節(jié)我們先利用axis2來發(fā)布一個(gè)web service 的服務(wù),然后在下一節(jié)我們做一客戶端來調(diào)用這個(gè)服務(wù)。

          我們的服務(wù)很簡單的,就是輸入一個(gè)字符串,然后打印出一段字符串。

          代碼很簡單,主要是測(cè)試用。

          Java代碼
          1. package com.deltaj.server;  
          2.   
          3. public class SimpleServer {  
          4.   
          5.     /** 
          6.      * 簡 單的測(cè)試方法 
          7.      *  
          8.      */  
          9.     public String simpleMethod(String name) {  
          10.         return name + "Say this is a Simple method ^-^";  
          11.     }  
          12.   
          13. }  

          主要的過程就是如何利用axis2的eclispe插件來發(fā)布這個(gè)服務(wù)啦。

          1。在eclispe 的package Explorer 中點(diǎn)擊右鍵,在菜單中選擇新建--->other...----->Axis2 Service Archiver


          2.然后點(diǎn)擊next進(jìn)入了類選擇頁面,在這個(gè)頁面中的Class File Location選擇框中選擇類所在的文件夾。 


           3.點(diǎn)擊next之后進(jìn)入了選擇 wsdl文件,這里我們選擇skip wsdl。


          4. 點(diǎn)擊next之后,進(jìn)入的是選擇jar文件的頁面,這里我們沒有外部的jar,所以點(diǎn)擊next直接跳過這個(gè)頁面。



           4.點(diǎn)擊next之后,進(jìn)入的是選擇xml頁面,這里我們選擇的是自動(dòng)生成xml,也就是勾選

          Generate the service xml automatically這一項(xiàng)



           5.點(diǎn)擊next之后,進(jìn)入的是生成xml文件的頁面,在service name 里填寫這個(gè)服務(wù)所起的名字,這里我起名為simpleServer,然后在class name 中填寫要發(fā)布的類,這里一定要寫全路徑,寫好后就可以點(diǎn)擊load 按鈕,如果一切ok的話,你會(huì)看到如下畫面




           6 點(diǎn)擊next 后,進(jìn)入的是輸出artiver文件的頁面,先要在output File location 中選擇要輸出的路徑,

             在output  File Name中輸入artiver文件的名稱。我起的名字是simpleServer



           7.點(diǎn)擊finish ,如果看到如下的畫面,恭喜你,服務(wù)發(fā)布成功啦

          8.接下來,我們就可以把這個(gè)aar文件放入tomcat中發(fā)布,首先把生成的aar文件拷貝到tomcat目錄中的axis2項(xiàng)目的 service目錄中位置如圖。



           

          9.接下來啟動(dòng)tomcat,在地址欄中輸入http://localhost:8080/axis2 , 你會(huì)看到axis2的歡迎畫面



           

          10.點(diǎn)擊Service連接,你會(huì)看到發(fā)布的服務(wù)列表。這里面就能看到我們發(fā)布的simpleService



           11.點(diǎn)擊我們的服務(wù)simpleServer的連接,我們會(huì)看到。至此,服務(wù)發(fā)布成功。

           
           

             這節(jié)我們就來寫一個(gè)客戶端來調(diào)用一下這個(gè)服務(wù)。主要關(guān)注一下如何用elispe的axis2的插件來生成stub代碼。

          1.在eclispe 的package Explorer 中點(diǎn)擊右鍵,在菜單中選擇新建--->other...----->Axis2 Code Generator




           

          2.點(diǎn)擊next,進(jìn)入下一個(gè)頁面,選擇從wsdl文件來產(chǎn)生java文件。


           

          3. 點(diǎn)擊next,然后選擇wsdl文件,注意此處要填寫上一節(jié)我們


           4.點(diǎn)擊next,進(jìn)入設(shè)置頁面,這里我們就用默認(rèn)的設(shè)置。


           

          5. 點(diǎn)擊next,選擇輸出文件的路徑。


            (出錯(cuò)解決方案:

          除了把backport-util- concurrent-2.2.jar加到lib中, 加<library name="lib/backport-util-concurrent-2.2.jar">
                    <export name="*"/>
              </library>  到plugsin.xml
          還要
          1. 把Axis2_Codegen_wizard_1.3.0(eclipse/plugins/Axis2_Codegen_wizard_1.3.0)的 名字改成Axis2_Codegen_wizard_1.4.0
          2. 在plugin.xml中在<plugin>中 把Axis2_Codegen_wizard的version="1.3.0"改成version="1.3.0"
          5 樓 eason.j 2009-05-19   引用
          在MyEclipse6.5中會(huì)報(bào)錯(cuò):
          An error ocurred while completing process
          -java.lang.reflect.InvocationTargetException

          主要的問題在于 Code Generator plugin 內(nèi)缺少了 backport-util-concurrent-3.1.jar 包和geronimo-stax-api_1.0_spec-1.0.1.jar 包。
          [解決方案] :

          1.關(guān)閉 Eclipse

          2.copy  %AXIS2_HOME%"lib" 下的
          backport-util-concurrent-3.1.jar 和 backport-util-concurrent-3.1.jar
          復(fù)制到 MyEclipse 6.5"eclipse"plugins"Axis2_Codegen_Wizard_1.3.0"lib 文件夾下。

          3.注冊(cè)此 jar 包:
          修改MyEclipse 6.5"eclipse"plugins"Axis2_Codegen_Wizard_1.3.0"plugin.xml 文件
          在 <runtime> 內(nèi)加入下面的字串
              <library name="lib/geronimo-stax-api_1.0_spec-1.0.1.jar">
                 <export name="*"/>
             </library>
              <library name="lib/backport-util-concurrent-3.1.jar">
                    <export name="*"/>
              </library>

          到plugin.xml文件中,保存后重新啟動(dòng)Eclipse即可。

          )

          6.點(diǎn)擊next,如果看到這個(gè)頁面,恭喜你已經(jīng)生成代碼成功。

           

          7.在package Explorer中刷新一下項(xiàng)目,然后你發(fā)現(xiàn)出現(xiàn)2個(gè)新的文件SimpleServerStub和 SimpleServerCallbackHandler 。打開SimpleServerStub你會(huì)驚喜的發(fā)現(xiàn)。著名的小紅叉一個(gè)接一個(gè)的

          這是因?yàn)闆]有axis2的類包。我們可以在下載的axis2-1.4.1-bin中找到lib包,把其中的jar都加入我們的工程中。

          然后重新編譯一下工程,這時(shí)我們發(fā)現(xiàn)SimpleServerStub還是有幾個(gè)小紅叉。這個(gè)是因?yàn)檫@個(gè)插件有個(gè)小bug。

          生成的代碼沒有實(shí)現(xiàn)序列化方法。我們可以自己來加上,在小紅叉上點(diǎn)一下,彈出一個(gè)小菜單,選擇

          Add unimplemented methods .



           

          8.

          Java代碼
          1. /** 
          2.  * 調(diào) 用發(fā)布的服務(wù)。 
          3.  *  
          4.  */  
          5. public class SimpleClient {  
          6.    
          7.  public static void main(String[] args) throws Exception{  
          8.     
          9.   //初始化樁文件  
          10.   SimpleServerStub stub = new SimpleServerStub();  
          11.   //初始化SimpleMethod方法。  
          12.   SimpleServerStub.SimpleMethod request = new  SimpleServerStub.SimpleMethod();  
          13.   //調(diào)用simpleMethod的setName方法。  
          14.   request.setName("zt");  
          15.   //  
          16.   System.out.println(stub.simpleMethod(request).get_return());  
          17.     
          18.     
          19.  }  
          20. }  

             如果一切正常,你就會(huì)看到結(jié)果

          log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
          log4j:WARN Please initialize the log4j system properly.
          ztSay this is a Simple method ^-^。

          調(diào)用服務(wù)成功。這是個(gè)簡單的例子,下節(jié)我們?cè)僮鲆粋€(gè)復(fù)雜一點(diǎn)的例子,來更好的學(xué)習(xí)axis2

          posted @ 2010-03-29 16:35 小菜毛毛 閱讀(1107) | 評(píng)論 (0)編輯 收藏

          我們2005年底就做了一個(gè)Wap網(wǎng)站“WAP一把刀實(shí)用查詢大全”,當(dāng) 時(shí)沒有統(tǒng)計(jì)、沒有廣告,只有簡單的免費(fèi)服務(wù)功能。

            2007年Google推出AdSense for Mobile的時(shí)候,我們對(duì)Wap網(wǎng)站代碼進(jìn)行了一些整理,以方便統(tǒng)一加入廣告代碼,同時(shí)我們也加入了一段某公司提供的Wap統(tǒng)計(jì)代碼,可惜做Wap統(tǒng)計(jì) 這樣的免費(fèi)功能只有投入沒有收入,一般公司都不愿意長久做,所以都沒能用很長時(shí)間,換了1、2次統(tǒng)計(jì)代碼后我們也放棄了統(tǒng)計(jì),就從AdSense中的分渠 道統(tǒng)計(jì)移動(dòng)廣告收入的數(shù)據(jù)來大概知道網(wǎng)站的訪問流量。

            今年從Analytics的英文官方博客中看到Google終于承擔(dān)起這個(gè)免費(fèi)的Wap統(tǒng)計(jì)任務(wù),不過我忙于其它事情,一直沒有加上代 碼試試。

            前些天AdSense移動(dòng)廣告的代碼要求更新,但我們用新代碼卻無法正常訪問,已經(jīng)給Google的人寫郵件詢問去了,等待答復(fù)中。

            昨天在為其它Web網(wǎng)站添加Google Webmastertools中的站點(diǎn)地圖時(shí),順便把wap.18dao.com也驗(yàn)證加入了,然后試著將Analytics的移動(dòng)統(tǒng)計(jì)代碼加入,這個(gè)代 碼可以從“Analytics(分析)設(shè)置 - 配置文件設(shè)置 - 檢查狀態(tài) - 跟蹤代碼 - 高級(jí)”中選擇“針對(duì)手機(jī)創(chuàng)建的網(wǎng)站”,可以提供“選擇您的移動(dòng)網(wǎng)站的服務(wù)器端語言”為:

          • PHP
          • Perl
          • JSP
          • ASPX

            我們以前是用JSP開發(fā)的,選擇JSP后提示:

          將代碼粘貼到您的移動(dòng)網(wǎng)站

          請(qǐng)注意:請(qǐng)勿在使用移動(dòng)跟蹤的網(wǎng)頁上使用臺(tái)式機(jī)跟蹤代碼。

          第 1 步:復(fù)制下列代碼,然后將其粘貼到您要跟蹤的每個(gè)網(wǎng)頁的 <html> 標(biāo)記之前,并使其緊鄰此標(biāo)記。

          <%@ page import="java.io.UnsupportedEncodingException,
          java.net.URLEncoder" %>
          <%!
          // Copyright 2009 Google Inc. All Rights Reserved.
          private static final String GA_ACCOUNT = "MO-241337-53";
          private static final String GA_PIXEL = "ga.jsp";

          private String googleAnalyticsGetImageUrl(
          HttpServletRequest request) throws UnsupportedEncodingException {
          StringBuilder url = new StringBuilder();
          url.append(GA_PIXEL + "?");
          url.append("utmac=").append(GA_ACCOUNT);
          url.append("&utmn=").append(Integer.toString((int) (Math.random() * 0x7fffffff)));
          String referer = request.getHeader("referer");
          String query = request.getQueryString();
          String path = request.getRequestURI();
          if (referer == null || "".equals(referer)) {
          referer = "-";
          }
          url.append("&utmr=").append(URLEncoder.encode(referer, "UTF-8"));
          if (path != null) {
          if (query != null) {
          path += "?" + query;
          }
          url.append("&utmp=").append(URLEncoder.encode(path, "UTF-8"));
          }
          url.append("&guid=ON");
          return url.toString().replace("&", "&");
          }
          %>

          第 2 步:復(fù)制下列代碼,然后將其粘貼到您要跟蹤的每個(gè)網(wǎng)頁的 </body> 標(biāo)記之前,并使其緊鄰此標(biāo)記。

          <% String googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(request); %>
          <img src="<%= googleAnalyticsImageUrl %>" />

          將此文件復(fù)制到您的根目錄

          下載 ga.jsp 并將其保存到您的網(wǎng)絡(luò)服務(wù)器的根目錄 ("/")。請(qǐng)確保將您的根目錄配置為執(zhí)行服務(wù)器端代碼。

            我們以前開發(fā)時(shí),用的wml 1.x,根本就沒有<html>和</body>標(biāo)記,不過有對(duì)應(yīng)的<wml>和</card>,我一 步一步按照上面的要求設(shè)置了。順便還把以前瀏覽器報(bào)錯(cuò)的地方統(tǒng)一批量修改替換掉。

            有幾個(gè)特別說明的地方:

          • 第一段代碼我放在頁面中不同地方試過,<wml>前或者后都可以,為了方便,我就放在<card>后,第二段放 在</card>前
          • ga.jsp中說要修改cookie存放路徑,我不知道應(yīng)該如何設(shè)置,沒有改
          • 如果是網(wǎng)站子目錄(例如:http://wap.18dao.com/study/index.jsp )中調(diào)用代碼的話,需要將“private static final String GA_PIXEL = "ga.jsp";”改為“private static final String GA_PIXEL = "http://wap.18dao.com/ga.jsp";”

            從實(shí)際運(yùn)行的情況看,對(duì)Wap網(wǎng)站沒有特別的影響,也沒有像以前其他小公司搞的統(tǒng)計(jì)代碼都帶個(gè)圖標(biāo)鏈接,Analytics的wap和web版 本一樣,都不在網(wǎng)頁中顯示任何內(nèi)容。

            登錄Analytics后臺(tái)已經(jīng)可以看到有統(tǒng)計(jì)數(shù)據(jù)產(chǎn)生了,wap網(wǎng)站的統(tǒng)計(jì)數(shù)據(jù)和web網(wǎng)站的統(tǒng)計(jì)數(shù)據(jù)差不多全面,比以前的其它免費(fèi) wap統(tǒng)計(jì)都強(qiáng)很多,不僅僅是簡單的訪問數(shù)據(jù)統(tǒng)計(jì),更重要的還有各種分析功能。我準(zhǔn)備打開Analytics與AdSense結(jié)合的功能看看能否還統(tǒng)計(jì)出 AdSense的情況,另外也打開內(nèi)部搜索統(tǒng)計(jì)試一試,有新的發(fā)現(xiàn)后再補(bǔ)充在日志中。

            用Analytics中的Wap統(tǒng)計(jì)有一點(diǎn)最放心:不用害怕Google過一陣子不再提供這個(gè)服務(wù)了。Image:Face-027.gif

          posted @ 2010-03-22 14:52 小菜毛毛 閱讀(2314) | 評(píng)論 (2)編輯 收藏

          有關(guān)插件安裝問題,四種常用的方法在此特別注明:

          1. “幫助”->“軟件更新”->“查找并安裝”->“搜索要安裝的新功能部件”->“新建遠(yuǎn)程站點(diǎn)”(此種方式用于在線更新)

          2. “幫助”->“軟件更新”->“查找并安裝”->“搜索要安裝的新功能部件”->“新建本地站點(diǎn)”(如果插件已經(jīng)下載到了本地,請(qǐng)不要用第一種方法)

          3. 直接拷貝plugins和features兩個(gè)目錄下的內(nèi)容置于$Eclipse_Home$/對(duì)應(yīng)的plugins和features下面

          4. 用link外鏈接與外部插件關(guān)聯(lián)


             前三種方法都會(huì)將插件文件拷貝至相$Eclipse_Home$/對(duì)應(yīng)的plugins和 features目錄下,從本質(zhì)上看,沒多大區(qū)別,并且插件只能安裝和禁用,不能卸載(當(dāng)然,如果你對(duì)插件對(duì)應(yīng)的目錄和文件都很熟悉的話,可以通過直接刪 除拷進(jìn)去的文件來達(dá)到卸載插件的目的),但方法一和方法二在安裝插件的時(shí)候很容易出錯(cuò)或者是產(chǎn)生沖突,特別是當(dāng)你用了Myeclipse插件、中文包的同 時(shí),又想安裝HibernateSynchronizer、 Jode Compiler(Class反編譯工具)、Visual Editor等插件時(shí),及有可能導(dǎo)致Myeclipse插件和中文包失效。

              所以,如果插件已經(jīng)下載到了本地,請(qǐng)直接拷貝至$Eclipse_Home$/對(duì)應(yīng)的plugins和features目錄下,也就是用方法三,這樣能避免沖突。

          方法四是將所有的插件用一個(gè)外部目錄存放起來,假如是D:\plug-in,將上面所示的插件目錄文件全部拷貝到該目錄下,比如Tomcat插件, 此時(shí)的文件路徑就是D:\plug-in\tomcat_plug\eclipse\plugins\ com.sysdeo.eclipse.tomcat_3.1.0.beta(請(qǐng)注意,方法四一定要嚴(yán)格這樣的目錄路徑放置文件)。然后在$ Eclipse_Home$下新建一個(gè)links目錄,并在links目錄下建立關(guān)聯(lián)文件,假如是tomcat.link,在建立的關(guān)聯(lián)文件中加入如下語 句:
          path=D:\\plug-in\\tomcat_plug
          也可以寫成下面的形式
          path=D:/plug-in/tomcat_plug
          還可以寫成相對(duì)路徑的形式

          posted @ 2010-03-18 10:16 小菜毛毛 閱讀(283) | 評(píng)論 (0)編輯 收藏

          用SAX解析xml文件的例子
          2008-07-15 09:46
          1. Xml技術(shù)簡介
          Xml文件有兩種約束類型,包括文檔類型定義(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的標(biāo)準(zhǔn)里。Xml 模式被包含在W3C的標(biāo)準(zhǔn)中。在xml 數(shù)據(jù)和xml 模式兩者之間有很多的區(qū)別。
          A. xml模式支持的數(shù)據(jù)類型比xml DTD多;
          B. xml模式在無序的情況下使用起來比xml DTD更方便;
          C. xml模式支持名字空間,可以在不同的文件中定義相同的方法等。
          D. xml模式形成的文檔可以被多種標(biāo)準(zhǔn)解析,如dom,sax或者jdom等,而xml DTD方式下確不行。
          2. Xml文件解析
          在java語言環(huán)境里可以使用三種方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。
          SAX提供了基于事件的方式進(jìn)行解析,適合于快速,數(shù)據(jù)量小的解析情況。SAX解析有幾個(gè)缺陷:A.它的解析是連續(xù)的;B.數(shù)據(jù)無法回朔。
          DOM解析不同于SAX。它提供了內(nèi)存中完整的xml數(shù)據(jù)映像,數(shù)據(jù)被存儲(chǔ)在樹狀結(jié)構(gòu)中。DOM解析方式更容易獲得和處理數(shù)據(jù)。
          JDOM是java語言中特有的,主要用來支持xpath標(biāo)準(zhǔn)。
          3. SAX解析方式
          上面我簡要介紹了幾種解析xml文件的技術(shù),這里我們使用SAX技術(shù)給出一個(gè)小例子,大家可以從這個(gè)例子中發(fā)現(xiàn)如果你能夠掌握一些開源軟件包,你就可以很 快掌握解析xml數(shù)據(jù)的技術(shù)。
          3.1制作一個(gè)簡單的xml文件component.xml
          <?xml version="1.0"?>
          <XmlComponents>
          <XmlComponent>
          <ComNo>1</ComNo>
          </XmlComponent>
          </XmlComponents>

          3.2下載xerces.jar軟件包
          在Apache網(wǎng)站上×××下載xerces.jar軟件包,這個(gè)包中包含了上面我們列舉的幾種解析xml數(shù)據(jù)的API。然后將這個(gè)軟件包加入到程序的 classpath中。
          3.3制作解析類MySaxParser.java
          import java.io.IOException;
          import org.xml.sax.*;
          import org.xml.sax.helpers.*;
          import javax.xml.parsers.*;

          public class MySaxParser extends DefaultHandler {
          private static int INDENT = 2;

          // 運(yùn)行主方法
          public static void main(String[] argv) {
          // if (argv.length != 1) {
          // System.out.println("Usage: java ds.MySaxParser [URI]");
          // System.exit(0);
          // }
          System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
          // String uri = argv[0];
          String uri = "Components.xml";
          try {
          SAXParserFactory parserFactory = SAXParserFactory.newInstance();
          parserFactory.setValidating(false);
          parserFactory.setNamespaceAware(false);
          MySaxParser MySaxParserInstance = new MySaxParser();
          SAXParser parser = parserFactory.newSAXParser();
          parser.parse(uri, MySaxParserInstance);
          }
          catch(IOException ex) {
          ex.printStackTrace();
          }
          catch(SAXException ex) {
          ex.printStackTrace();
          }
          catch(ParserConfigurationException ex) {
          ex.printStackTrace();
          }
          catch(FactoryConfigurationError ex) {
          ex.printStackTrace();
          }

          }

          private int idx = 0; //indent
          // 處理各種分隔符號(hào)
          public void characters(char[] ch, int start, int length) throws SAXException {
          //instantiates s, indents output, prints character values in element
          String s = new String(ch, start, length);
          if (!s.startsWith("\n")) //空的value不打印
          System.out.println(getIndent()+ " Value: " + s);
          }

          // 處理文檔尾
          public void endDocument() throws SAXException {
          idx -= INDENT;
          System.out.println(getIndent() + "end document");

          System.out.println("...PARSING ends");
          }

          // 處理標(biāo)記尾
          public void endElement(String uri, String localName, String qName) throws SAXException {
          idx -= INDENT;
          }

          // 處理文檔的起始點(diǎn)
          public void startDocument() throws SAXException {
          idx += INDENT;
          System.out.println("PARSING begins...");
          System.out.println(getIndent() + "start document: ");
          }

          // 處理標(biāo)記頭
          public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
          idx += INDENT;
          System.out.println('\n' + getIndent() + "start element: " + qName);

          }

          private String getIndent() {
          StringBuffer sb = new StringBuffer();
          for (int i = 0; i < idx; i++)
          sb.append(" ");
          return sb.toString();
          }

          }


          總結(jié),雖然解析xml數(shù)據(jù)很復(fù)雜,因?yàn)樯婕傲撕芏嗟倪f歸算法,但是我們可以使用業(yè)界比較成熟的解析API來進(jìn)行xml數(shù)據(jù)處理。我現(xiàn)在只是給出了一個(gè)非常 簡單的例子,但是在真實(shí)系統(tǒng)中遠(yuǎn)比這個(gè)要復(fù)雜的多,大家以后在使用的使用會(huì)發(fā)現(xiàn)還是有很多的工作要做的。
          posted @ 2010-03-17 17:37 小菜毛毛 閱讀(3805) | 評(píng)論 (2)編輯 收藏

          一、        前言

          用 Java解析XML文檔,最常用的有兩種方法:使用基于事件的XML簡單API(Simple API for XML)稱為SAX和基于樹和節(jié)點(diǎn)的文檔對(duì)象模型(Document Object Module)稱為DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口來使用SAX和DOM,通過JAXP,我們可以使用任何與JAXP兼容的XML解析器。

          JAXP接口包含了三個(gè)包:

          (1)       org.w3c.dom  W3C推薦的用于XML標(biāo)準(zhǔn)規(guī)劃文檔對(duì)象模型的接口。

          (2)       org.xml.sax   用于對(duì)XML進(jìn)行語法分析的事件驅(qū)動(dòng)的XML簡單API(SAX)

          (3)       javax.xml.parsers解析器工廠工具,程序員獲得并配置特殊的特殊語法分析器。

          二、        前提

          DOM編程不要其它的依賴包,因?yàn)镴DK里自帶的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以滿意條件了。

          三、        使用SAX解析XML文檔

          SAX是基于事件的簡單API,同樣的我們也是用一個(gè)最簡單的例子來看看SAX是如何解析XML的

          先來看看我們要解析的XML代碼吧

          <?xml version="1.0" encoding="gb2312"?>

          <books>

            <book email="zhoujunhui">

                       <name addr="address">rjzjh</name>

                       <price>jjjjjj</price>

            </book>

          </books>

          簡單的不能再簡單了。但是該有的都有了,根元素、屬性、子節(jié)點(diǎn)。好了,能反應(yīng)問題就行了,下面來看看解析這個(gè)XML文件的Java代碼吧!

          1 public class SaxParse {

          2     public SaxParse(){

          3            SAXParserFactory saxfac=SAXParserFactory.newInstance();

          4            try {

          5                   SAXParser saxparser=saxfac.newSAXParser();

          6                   InputStream is=new FileInputStream("bin/library.xml");

          7                   saxparser.parse(is,new MySAXHandler());

          8            } catch (ParserConfigurationException e) {

          9                   e.printStackTrace();

          10           } catch (SAXException e) {

          11                  e.printStackTrace();

          12           } catch (FileNotFoundException e) {

          13                  e.printStackTrace();

          14           } catch (IOException e) {

          15                  e.printStackTrace();

          16           }

          17    }

          18    public static void main(String[] args) {

          19           new SaxParse();

          20    }

          21  }

          這段代碼比較短,因?yàn)镾AX是事件驅(qū)動(dòng)的,它的大部分實(shí)現(xiàn)在在另一個(gè)Java文件中,先別管另一個(gè)文件,我們來一個(gè)個(gè)地分析吧!

          (1)得到SAX解析器的工廠實(shí)例

          3            SAXParserFactory saxfac=SAXParserFactory.newInstance();

          這是一個(gè)javax.xml.parsers.SAXParserFactory類的實(shí)例

          (2)從SAX工廠實(shí)例中獲得SAX解析器

          5            SAXParser saxparser=saxfac.newSAXParser();

          使用javax.xml.parsers.SAXParserFactory工廠的newSAXParser()方法

          (3)把要解析的XML文檔轉(zhuǎn)化為輸入流,以便DOM解析器解析它

          6                   InputStream is=new FileInputStream("bin/library.xml");

          InputStream是一個(gè)接口。

          (4)解析XML文檔

          7                   saxparser.parse(is,new MySAXHandler());

          后面就不用看了,都是些沒用的代碼(相對(duì)而言),夠簡單的吧!

          注意了,我們新建了一個(gè)實(shí)例new MySAXHandler()這個(gè)實(shí)例里面又有什么東西呢?

          這個(gè)實(shí)例就是SAX的精華所在。我們使用SAX解析器時(shí),必須實(shí)現(xiàn)內(nèi)容處理器ContentHandler接口中的一些回調(diào)方法,然而我們不須要全部地實(shí)現(xiàn)這些方法,還好,我們有org.xml.sax.helpers.DefaultHandler類,看它的類申明:

          public class DefaultHandler

          implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler

          實(shí)現(xiàn)了這么多接口啊,其它的先不管了,至少它實(shí)現(xiàn)了ContentHandler這一接口。

          好了,看看這個(gè)類有些什么吧?下面是它的Java代碼!

          public class MySAXHandler extends DefaultHandler {

                 boolean hasAttribute=false;

                 Attributes attributes=null;

                 /* (非 Javadoc)

                  * @see org.xml.sax.helpers.DefaultHandler#startDocument()

                  */

                 public void startDocument() throws SAXException {

                         System.out.println("文檔開始打印了");

                 }

                 /* (非 Javadoc)

                  * @see org.xml.sax.helpers.DefaultHandler#endDocument()

                  */

                 public void endDocument() throws SAXException {

                        System.out.println("文檔打印結(jié)束了");

                 }

                 /* (非 Javadoc)

                  * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)

                  */

                 public void startElement(String uri, String localName, String qName,

                               Attributes attributes) throws SAXException {

                        if(qName.equals("books")){

                               return;

                        }

                        if(qName.equals("book")){

                               System.out.println(attributes.getQName(0)+attributes.getValue(0));

                        }

                        if(attributes.getLength()>0){

                               this.attributes=attributes;

                               this.hasAttribute=true;

                        }

                 }

                 /* (非 Javadoc)

                  * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)

                  */

                 public void endElement(String uri, String localName, String qName)

                               throws SAXException {

                        if(hasAttribute&&(attributes!=null)){

                               for(int i=0;i<attributes.getLength();i++){

                                      System.out.println(attributes.getQName(0)+attributes.getValue(0));

                               }

                        }

                 }

                 /* (非 Javadoc)

                  * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)

                  */

                 public void characters(char[] ch, int start, int length)

                               throws SAXException {

                        System.out.println(new String(ch,start,length));

                 }

           

           

          }

          不要看它一大堆,我一一分解給大家看。我們說SAX是基于事件的API,我們這個(gè)類實(shí)到了ContentHandler接口中的如下方法:

          (1)startDocument()  用于處理文檔解析開始事件

               public void startDocument() throws SAXException {

                         System.out.println("文檔開始打印了");

                  }

          (2)endDocument()  用于處理文檔解析結(jié)束事件

                public void endDocument() throws SAXException {

                        System.out.println("文檔打印結(jié)束了");

                  }

          (3)startElement  用于處理元素開始事件

               public void startElement(String uri, String localName, String qName,

                               Attributes attributes) throws SAXException {

                        if(qName.equals("books")){

                               return;

                        }

                        if(qName.equals("book")){

                               System.out.println(attributes.getQName(0)+attributes.getValue(0));

                        }

                        if(attributes.getLength()>0){

                               this.attributes=attributes;

                               this.hasAttribute=true;

                        }

                 }

          第二個(gè)參數(shù)String qName表示這個(gè)元素的名字,如:

          根節(jié)點(diǎn) <books></books> 它的qName為“books”

          最底層節(jié)點(diǎn) <price>jjjjjj</price> 它的qName為“price”

          知道這一點(diǎn)上面程序就好解釋了,當(dāng)遇到根元素“books”時(shí)就什么也不做跳過,當(dāng)遇到“book”元素時(shí)就打出它的屬性(它只有一個(gè)屬性<book email="zhoujunhui"></book>)。

          當(dāng)是其它節(jié)點(diǎn)時(shí)(這下只剩下最底層的兩個(gè)節(jié)點(diǎn)“name”和“price”了),就把它的屬性取出來存到this.attributes域中,以后中元素結(jié)束事件好處理。

          (4)endElement 用于處理元素結(jié)束事件

               public void endElement(String uri, String localName, String qName)

                               throws SAXException {

                        if(hasAttribute&&(attributes!=null)){

                               for(int i=0;i<attributes.getLength();i++){

                                      System.out.println(attributes.getQName(0)+attributes.getValue(0));

                               }

                        }

                 }

          代碼的作用是如果這個(gè)元素的屬性不為空(hasAttribute&&(attributes!=null)),就把它們打印出來。

          (5)characters(char[] ch, int start, int length) 處理元素字符的內(nèi)容

                        public void characters(char[] ch, int start, int length)

                               throws SAXException {

                        System.out.println(new String(ch,start,length));

                 }

          我們只用了這么幾個(gè)事件,其它還有其的的一些事件,我們只要看一下ContentHandler這個(gè)接口就行了,如:

          (6)startPrefixMapping(String prefix,String URI) 處理前綴映射開始事件,參數(shù)表示前綴名稱和所指向的URI

          (7)endPrefixMapping(String prefix,String URI) 處理前綴映射結(jié)束事件,參數(shù)表示前綴名稱和所指向的URI

          (8)ignorableWhitespace(Char[] ch,int start,int length) 處理元素中可忽略的空格

          (9)processingInstruction(String target,String data) 處理解析中產(chǎn)生的處理指令事件。

          posted @ 2010-03-17 16:20 小菜毛毛 閱讀(2490) | 評(píng)論 (0)編輯 收藏

          當(dāng)你需要處理XML文檔時(shí),你的首要選擇是使用DOM(文檔對(duì)象模型)還是使用SAX(用于XML的簡單API),即當(dāng)前使用的兩個(gè)主要的XML API。你可以使用任何一種(或者在同一時(shí)間使用兩種)來處理XML文檔,然而DOM將文檔載入到內(nèi)存中處理,而SAX則相反,它可以檢測(cè)一個(gè)即將到來的 XML流,由此并不需要所有的XML代碼同時(shí)載入到內(nèi)存中。
          選擇DOM與SAX,與在一個(gè)數(shù)據(jù)庫中的表單與視圖之前選擇一樣:選擇適合于當(dāng)前實(shí)際情況的方法。如果你只是想簡單地查看XML文檔而不處理它,那么請(qǐng)選擇使用SAX。


          SAX與DOM之間有一些顯著區(qū)別,包括:
                   DOM是復(fù)雜對(duì)象處理的首選,比如當(dāng)XML比較復(fù)雜的時(shí)候,或者當(dāng)你需要隨機(jī)處理文檔中數(shù)據(jù)的時(shí)候。SAX從文檔的開始通過每一節(jié)點(diǎn)移動(dòng),以定位一個(gè)特定的節(jié)點(diǎn)。
          DOM 為載入到內(nèi)存的文檔節(jié)點(diǎn)建立類型描述。最終,這些描述呈現(xiàn)了可容易橫向移動(dòng)、潛在巨大、樹型結(jié)構(gòu)。如果XML很冗長,DOM就會(huì)顯示出無法控制的脹大。例 如,一個(gè)300KB的XML文檔可以導(dǎo)致RAM或者虛擬內(nèi)存中的3,000,000KB的DOM樹型結(jié)構(gòu)。通過比較就會(huì)發(fā)現(xiàn),一個(gè)SAX文檔根本就沒有被 解構(gòu),它也沒有隱藏在內(nèi)存空間中(當(dāng)然當(dāng)XML流被讀入時(shí),會(huì)有部分文檔暫時(shí)隱藏在內(nèi)存中)。SAX就是一種“更輕巧的”技術(shù)──它可以給你的系統(tǒng)帶來更 輕的負(fù)擔(dān)。SAX相當(dāng)于觀看一場(chǎng)馬拉松比賽,而DOM就好比邀請(qǐng)所有的比賽選手到家里參加晚餐。
          所以,你如何選擇SAX和DOM?如果你處理復(fù)雜的東西,比如高級(jí)XSLT轉(zhuǎn)換,或者Xpath過濾,請(qǐng)選擇使用DOM。如果你建立或者更改XML文檔,你也可以選擇DOM。
          相反,你可以使用SAX來查詢或者閱讀XML文檔。SAX可以快速掃描一個(gè)大型的XML文檔,當(dāng)它找到查詢標(biāo)準(zhǔn)時(shí)就會(huì)立即停止,然后再處理之。
          在某些情況下,在一個(gè)方案中,最佳的選擇是使用DOM和SAX處理不同的部分。例如,你可以使用DOM將XML載入到內(nèi)存并改變它,然后通過從DOM樹中發(fā)送一個(gè)SAX流而轉(zhuǎn)移最后的結(jié)果。


          SAX概念

             SAX是Simple API for XML的縮寫,它并不是由W3C官方所提出的標(biāo)準(zhǔn),可以說是“民間”的事實(shí)標(biāo)準(zhǔn)。實(shí)際上,它是一種社區(qū)性質(zhì)的討論產(chǎn)物。雖然如此,在XML中對(duì)SAX的應(yīng)用絲毫不比DOM少,幾乎所有的XML解析器都會(huì)支持它。

          與DOM比較而言,SAX是一種輕量型的方法。我們知道,在處理DOM的時(shí)候,我們需要讀入整個(gè)的XML文檔,然后在內(nèi)存中創(chuàng)建DOM樹,生成 DOM樹上的每個(gè)Node對(duì)象。當(dāng)文檔比較小的時(shí)候,這不會(huì)造成什么問題,但是一旦文檔大起來,處理DOM就會(huì)變得相當(dāng)費(fèi)時(shí)費(fèi)力。特別是其對(duì)于內(nèi)存的需 求,也將是成倍的增長,以至于在某些應(yīng)用中使用DOM是一件很不劃算的事(比如在applet中)。這時(shí)候,一個(gè)較好的替代解決方法就是SAX。

             SAX在概念上與DOM完全不同。首先,不同于DOM的文檔驅(qū)動(dòng),它是事件驅(qū)動(dòng)的,也就是說,它并不需要讀入整個(gè)文檔,而文檔的讀入過程也就 是SAX的解析過程。所謂事件驅(qū)動(dòng),是指一種基于回調(diào)(callback)機(jī)制的程序運(yùn)行方法。(如果你對(duì)Java新的代理事件模型比較清楚的話,就會(huì)很 容易理解這種機(jī)制了)

             在XMLReader接受XML文檔,在讀入XML文檔的過程中就進(jìn)行解析,也就是說讀入文檔的過程和解析的過程是同時(shí)進(jìn)行的,這和DOM區(qū) 別很大。解析開始之前,需要向XMLReader注冊(cè)一個(gè)ContentHandler,也就是相當(dāng)于一個(gè)事件監(jiān)聽器,在ContentHandler中 定義了很多方法,比如startDocument(),它定制了當(dāng)在解析過程中,遇到文檔開始時(shí)應(yīng)該處理的事情。當(dāng)XMLReader讀到合適的內(nèi)容,就 會(huì)拋出相應(yīng)的事件,并把這個(gè)事件的處理權(quán)代理給ContentHandler,調(diào)用其相應(yīng)的方法進(jìn)行響應(yīng)

          posted @ 2010-03-17 15:42 小菜毛毛 閱讀(322) | 評(píng)論 (0)編輯 收藏

          本文引自:http://blog.csdn.net/allenzue/archive/2008/12/18/3549959.aspx

          另有:http://wiki.ubuntu.org.cn/JBoss_5.0.0GA安裝指南

          一.下載與安裝JBoss

          在本文中,我下載的JBoss版本為:JBOSS5.0 Beta4。

          下載地址: http://www.jboss.org/jbossas/downloads/

          在如上的下載頁中下載JBOSS5.0 Beta4.zip文件。

          下載完成后,將其解壓縮后即可完成安裝,解壓 縮后將其放置到一個(gè)不帶空格的目錄(若目錄帶有空格,例如:C:"Program Files,日后可能會(huì)產(chǎn)生一些莫名的錯(cuò)誤),eg:E:"JBossJBOSS5.0 Beta4。同時(shí)在“環(huán)境變量設(shè)置”中設(shè)置名為JBOSS_HOME的環(huán)境變量,值為JBoss的安裝路徑,如下圖所示:

          在此,JBoss的安裝工作已經(jīng)結(jié)束,可通過如下方式測(cè)試安裝是否成功:

          運(yùn)行JBoss安裝目 錄"bin"run.bat,如果窗口中沒有出現(xiàn)異常,且出現(xiàn):10:16:19,765 INFO [Server] JBoss (MX MicroKernel) [5.0.Beta4 (build: SVNTag=5.0.Beta4 date=20080831605)] Started in 30s:828ms字樣,則表示安裝成功。

          我們可以通過訪問: http://localhost:8080/ 進(jìn)入JBoss的歡迎界面,點(diǎn)擊JBoss Management下的JMX Console可進(jìn)入JBoss的控制臺(tái)。

          若啟動(dòng)失敗,可能由以下原因引起:

          1)              JBoss所用的端口(8080,1099,1098,8083等)被占用。一般情況下為8080端口被占用(例如,Oracle占用了8080端口), 此時(shí)需要修改JBoss的端口,方法為進(jìn)入JBoss安裝目錄"server"default"deployer"jboss-web.deployer 目錄,修改其下的server.xml目錄,在此文件中搜索8080,將其改成你想要的端口即可(例如8088);

          2)              JDK安裝不正確;

          3)              JBoss下載不完全。

          二.             JBoss 的目錄結(jié)構(gòu)說明

          目錄

          描述

          bin

          啟動(dòng)和關(guān)閉 JBoss 的腳本( run.bat 為 windows 系統(tǒng)下的啟動(dòng)腳本, shutdown.bat 為 windows 系統(tǒng)下的關(guān)閉腳本)。

          client

          客戶端與 JBoss 通信所需的 Java 庫( JARs )。

          docs

          配置的樣本文件(數(shù)據(jù)庫配置等)。

          docs/dtd

          在 JBoss 中使用的各種 XML 文件的 DTD 。

          lib

          一些 JAR , JBoss 啟動(dòng)時(shí)加載,且被所有 JBoss 配置共享。(不要把你的庫放在這里)

          server

          各種 JBoss 配置。每個(gè)配置必須放在不同的子目錄。子目錄的名字表示配置的名字。 JBoss 包含 3 個(gè)默認(rèn)的配置: minimial , default 和 all ,在你安裝時(shí)可以進(jìn)行選擇。

          server/all

          JBoss 的完全配置,啟動(dòng)所有服務(wù),包括集群和 IIOP 。

          server/default

          JBoss 的默認(rèn)配置。在沒有在 JBoss 命令行中指定配置名稱時(shí)使用。 ( 我們下載的 JBOSS5.0 Beta4 版本默認(rèn)采用此配置 ) 。

          server/default/conf

          JBoss 的配置文件。

          server/default/data

          JBoss 的數(shù)據(jù)庫文件。比如,嵌入的數(shù)據(jù)庫,或者 JBossMQ

          server/default /deploy

          JBoss 的熱部署目錄。放到這里的任何文件或目錄會(huì)被 JBoss 自動(dòng)部署。 EJB 、 WAR 、 EAR ,甚至服務(wù)。

          server/default /lib

          一些 JAR , JBoss 在啟動(dòng)特定配置時(shí)加載他們。 (default 和 minimial 配置也包含這個(gè)和下面兩個(gè)目錄。 )

          server/default/log

          JBoss 的日志文件。

          server/default/tmp

          JBoss 的臨時(shí)文件。

          三.             JBoss 的配置

          1.       日志文件設(shè)置

          若需要修改JBoss默認(rèn)的log4j設(shè)置, 可修改JBoss安裝目錄"server"default"conf下的jboss-log4j.xml文件,在該文件中可以看到,log4j的日志輸出 在JBoss安裝目錄"server"default"log下的server.log文件中。對(duì)于log4j的設(shè)置,讀者可以在網(wǎng)上搜索更加詳細(xì)的信 息。

          2.       web 服務(wù)的端口號(hào)的修改

          這點(diǎn)在前文中有所提及,即修改JBoss安裝目錄"server"default"deployer"jboss-web.deployer下的server.xml文件,內(nèi)容如下:

          <Connector port="8080" address="${jboss.bind.address}"   

                   maxThreads="250" maxHttpHeaderSize="8192"

                   emptySessionPath="true" protocol="HTTP/1.1"

                   enableLookups="false" redirectPort="8443" acceptCount="100"

                   connectionTimeout="20000" disableUploadTimeout="true" />

          將上面的8080端口修改為你想要的端口即可。重新啟動(dòng)JBoss后訪問:http://localhost/:新設(shè)置的端口,可看到JBoss的歡迎界面。

          3.       JBoss 的安全設(shè)置

          1) jmx-console 登錄的用戶名和密碼設(shè)置

          默認(rèn)情況訪問 http://localhost:8080/jmx-console 就可以瀏覽jboss的部署管理的一些信息,不需要輸入用戶名和密碼,使用起來有點(diǎn)安全隱患。下面我們針對(duì)此問題對(duì)jboss進(jìn)行配置,使得訪問jmx-console也必須要知道用戶名和密碼才可進(jìn)去訪問。步驟如下:

          i) 找到JBoss安裝目錄/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml文件,去掉<security-domain>java:/jaas/jmx-console</security-domain>的注釋。修改后的該文件內(nèi)容為:

          <jboss-web>

             
          <!-- Uncomment the security-domain to enable security. You will

                 need to edit the htmladaptor login configuration to setup the

                 login modules used to authentication users.
          -->


                
          <security-domain>java:/jaas/jmx-console</security-domain>

          </jboss-web>

          ii)修改與i)中的jboss-web.xml同級(jí)目錄下的web.xml文件,查找到<security-constraint/>節(jié)點(diǎn),去掉它的注釋,修改后該部分內(nèi)容為:

          <!-- A security constraint that restricts access to the HTML JMX console

              to users with the role JBossAdmin. Edit the roles to what you want and

              uncomment the WEB-INF/jboss-web.xml/security-domain element to enable

              secured access to the HTML JMX console.
          -->


             
          <security-constraint>

               
          <web-resource-collection>

                 
          <web-resource-name>HtmlAdaptor</web-resource-name>

                 
          <description>An example security config that only allows users with the

                    role JBossAdmin to access the HTML JMX console web application

                 
          </description>


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

                 
          <http-method>GET</http-method>

                 
          <http-method>POST</http-method>

               
          </web-resource-collection>

               
          <auth-constraint>

                 
          <role-name>JBossAdmin</role-name>

               
          </auth-constraint>

             
          </security-constraint>

             在此處可以看出,為登錄配置了角色JBossAdmin

          iii 在第一步中的jmx-console安全域和第二步中的運(yùn)行角色JBossAdmin都是在login-config.xml中配置,我們?cè)?/span>JBoss安裝目錄/server/default/config下找到它。查找名字為:jmx-consoleapplication-policy

          <application-policy name = "jmx-console">
                 
          <authentication>
                    
          <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
                        flag
          = "required">
                     
          <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
                     
          <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
                    
          </login-module>
                 
          </authentication>
              
          </application-policy>

          在此處可以看出,登錄的角色、用戶等的信息分別在props目錄下的jmx-console-roles.propertiesjmx-console-users.properties文件中設(shè)置,分別打開這兩個(gè)文件。

          其中jmx-console-users.properties文件的內(nèi)容如下:

          # A sample users.properties file for use with the UsersRolesLoginModule

          admin=admin

          該文件定義的格式為:用戶名=密碼,在該文件中,默認(rèn)定義了一個(gè)用戶名為admin,密碼也為admin的用戶,讀者可將其改成所需的用戶名和密碼。

          jmx-console-roles.properties的內(nèi)容如下:

          # A sample roles.properties file for use with the UsersRolesLoginModule

          admin=JBossAdmin, HttpInvoker

          該文件定義的格式為:用戶名=角色,多個(gè)角色以“,”隔開,該文件默認(rèn)為admin用戶定義了JBossAdminHttpInvoker這兩個(gè)角色。

          配置完成后讀者可以通過訪問: http://localhost:8088/jmx-console/ ,輸入jmx-console-roles.properties文件中定義的用戶名和密碼,訪問jmx-console的頁面。

          四.             MyEclipse 中配置JBoss

          筆者的MyEclipse版本:6.5 GA

          JBoss版本:5.0
          JDK版本:1.6

          進(jìn)入Window-> Preferences-> MyEclipse -> Application Servers -> JBoss5,進(jìn)行如下設(shè)置:
              

          選擇JBoss 5下的JDK設(shè)置所用的JDK.

          好了,開始JBoss之旅吧.

          posted @ 2010-03-17 15:17 小菜毛毛 閱讀(472) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共17頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 Last 
          主站蜘蛛池模板: 西昌市| 岳阳县| 荣成市| 吴桥县| 天镇县| 岳池县| 永安市| 桓台县| 榆社县| 枣阳市| 盐山县| 邯郸市| 永清县| 建德市| 偃师市| 陆河县| 伊吾县| 武强县| 昌图县| 辛集市| 玉田县| 越西县| 陆川县| 沂南县| 海盐县| 台中市| 威远县| 平潭县| 沙河市| 滨州市| 察雅县| 明水县| 兴海县| 句容市| 香港 | 临汾市| 榆社县| 监利县| 乳源| 台北县| 五台县|