<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

    #

    1.hibernate中配置int和integer的區別
    2.手寫,spring+hibernate配置
    3.JavaScript時間和如何實現繼承
    其他略忘了

    posted @ 2010-04-08 09:35 小菜毛毛 閱讀(226) | 評論 (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,在該頁中找到適合自己操作系統平臺的jad下載。下載后解壓,然后將解壓后的jad.exe文件復制到%JAVA_HOME%"bin目錄下面(可以將jad.exe放到任意位置,只要記住其存放路徑就好,下面要用到)。

    二、安裝:

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

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

    三、 使用:
    啟動eclipse,點擊反編譯的類文件,此時會激活jadclipse插件,在eclipse菜單中會多出一個jadclipse菜單, 如下圖所示:

    一般地它會自動 反編譯相應的class文件,如果沒有自動反編譯,請點擊
    jadclipse->Decompile
    如下圖所示:


    常見問題及解決:

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

    1)檢查插件安裝的版 本是否與你安裝的eclipse版本對應

    2)使用 –clean參數來啟動eclipse
      (二)在使用JadClipse插件反編譯class文件時出現如下類似錯誤:
    /*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: (...)
     

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

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

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

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

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

    OGNL介紹
    OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱為EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功 能。它使用相同的表達式去存取對象的屬性。
    XWork遵循“不要重復地發明同一個輪子”的理論,它的表達式語言核心用的就是這個OGNL。我們先 來看看一個簡單的例子:
    還記得我們用戶注冊的那個例子嗎?我們輸入框的name用到的名字就是OGNL的表達式,比如:用戶名的輸入 框:“<input type="text" name="user.username">”,在用戶注冊成功之后我們要顯示用戶注冊的信息,用了“<ww:property value="user.username"/>”。Input輸入框里的“user.username”,它解析成Java語句 為:getUser().setUsername();,property標簽里的“user.username”解析為Java語 句:getUser.getUsername();。
    我們的兩個表達式都是相同的,但前一個保存對象屬性的值,后一個是取得對象屬性的值。表達式 語言簡單、易懂卻又功能強大,關于OGNL更多的介紹可以去http://www.ognl.org, 那里有很詳細的文檔
     
    值堆棧-OgnlValueStack
    OGNL在框架中的應用,最主要是支持我們的值堆棧(Value Stack)——OgnlValueStack,它主要的功能是通過表達式語言來存取對象的屬性。用戶界面輸入數據,它會根據保存表達式將數據依次保存到 它堆棧的對象中,業務操作完成,結果數據會通過表達式被獲取、輸出。
    還記得我們用戶注冊的例子嗎?下面我們用一段程序來演示它向 OgnlValueStack中保存、取得數據的步驟:
     
    // 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、   創建我們的Action(RegisterAction)類的對象action,將action對象壓入堆棧valueStack中。在WebWrok中 Action的創建、入棧是在DefaultActionInvocation構造函數中進行的,詳細介紹見:ServletDispatcher原理。
    2、   通過表達式語言,調用堆棧對象的get()、set()方法,設置該對象的值。
       public void setValue(String expr, Object value)
       語句:valueStack.setValue("user.username","Babydavic");
       的作用等同于:action.getUser().setUsername("Babydavic");
    3、   通過表達式語言,去堆棧對象中查找我們前面保存的值,并在控制臺打印。valueStack.findValue("user.username")等同 與語句:
    action.getUser().getUsername()
    最后控制臺打印的結果:
             username = Babydavic
     
     
    CompoundRoot
    在OgnlValueStack中,一個堆棧其 實是一個List。查看OgnlValueStack你會發現,堆棧就是 com.opensymphony.xwork.util.CompoundRoot類的對象:
     
    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);
        }
    }

    我們通過表達式向堆棧對象操作時,我們并不知道堆棧中有哪些對象。OgnlValueStack會根據堆棧由上向下的順序(先入棧在下面,最后入棧 在最上面)依次去查找與表達式匹配的對象方法,找到即進行相應的存取操作。假設后面對象也有相同的方法,將不會被調用。
    下面我們看一個對 OgnlValueStack操作的程序,它主要演示了如何對Map對象的存取和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(){
            //執行業務操作
            return null;
        }
        public String toString(){
            return users.toString();
        }
    }
    注意:1、 Map屬性的存取,它的表達式語言如:users['zhao'],注意它用’’來引用HashMap的key字符串。
    2、 demoModels()方法演示了OgnlValueStack中堆棧的原理,請特別注意它的 [0].toString、[1].toString、[2].toString,它們依次調用堆棧中對象的toString()方法,并逐一的減少堆棧 最上面的對象。
    控制臺輸出的結果如下:
    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 小菜毛毛 閱讀(480) | 評論 (0)編輯 收藏

    axis2創建web service(一)

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

    /13/2179760.aspx

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

    axis2 是新一代的web service開發工具,它會讓你的web service開發變得輕松,快捷。下面讓我們以一個實際的例子來體驗一下。

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

     

    1.下載axis2 的2進制的包和war,現在的最新版本是1.4.1 發布時間是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目錄里,然后啟動tomcat,這樣war包就會自動解壓為目錄axis2

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

     




     
     3,就開始準備一下axis2的eclispe的插件 了。axis2的eclispe插件分為2個,一個是幫助我們生成aar文件的,另一個是幫 我們用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個壓縮文件后,可以直接把解壓后的文件拷貝到plugins目錄中,也可以在links目錄中寫文件路徑的方式來安裝插件,安裝完插件后, 打開eclipse,在package explorer 中點擊右鍵--->選擇new---->other

    如果安裝正確你會看到



     這樣準備工作就都做好了。接下來就是正式開發了。

    開發的過程,下回分解。。。。。

     

    工具都已經準備齊全了。我們來動手做一個小例子來小試牛刀!

    這一節我們先利用axis2來發布一個web service 的服務,然后在下一節我們做一客戶端來調用這個服務。

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

    代碼很簡單,主要是測試用。

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

    主要的過程就是如何利用axis2的eclispe插件來發布這個服務啦。

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


    2.然后點擊next進入了類選擇頁面,在這個頁面中的Class File Location選擇框中選擇類所在的文件夾。 


     3.點擊next之后進入了選擇 wsdl文件,這里我們選擇skip wsdl。


    4. 點擊next之后,進入的是選擇jar文件的頁面,這里我們沒有外部的jar,所以點擊next直接跳過這個頁面。



     4.點擊next之后,進入的是選擇xml頁面,這里我們選擇的是自動生成xml,也就是勾選

    Generate the service xml automatically這一項



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




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

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



     7.點擊finish ,如果看到如下的畫面,恭喜你,服務發布成功啦

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



     

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



     

    10.點擊Service連接,你會看到發布的服務列表。這里面就能看到我們發布的simpleService



     11.點擊我們的服務simpleServer的連接,我們會看到。至此,服務發布成功。

     
     

       這節我們就來寫一個客戶端來調用一下這個服務。主要關注一下如何用elispe的axis2的插件來生成stub代碼。

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




     

    2.點擊next,進入下一個頁面,選擇從wsdl文件來產生java文件。


     

    3. 點擊next,然后選擇wsdl文件,注意此處要填寫上一節我們


     4.點擊next,進入設置頁面,這里我們就用默認的設置。


     

    5. 點擊next,選擇輸出文件的路徑。


      (出錯解決方案:

    除了把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中會報錯:
    An error ocurred while completing process
    -java.lang.reflect.InvocationTargetException

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

    1.關閉 Eclipse

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

    3.注冊此 jar 包:
    修改MyEclipse 6.5"eclipse"plugins"Axis2_Codegen_Wizard_1.3.0"plugin.xml 文件
    在 <runtime> 內加入下面的字串
        <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文件中,保存后重新啟動Eclipse即可。

    )

    6.點擊next,如果看到這個頁面,恭喜你已經生成代碼成功。

     

    7.在package Explorer中刷新一下項目,然后你發現出現2個新的文件SimpleServerStub和 SimpleServerCallbackHandler 。打開SimpleServerStub你會驚喜的發現。著名的小紅叉一個接一個的

    這是因為沒有axis2的類包。我們可以在下載的axis2-1.4.1-bin中找到lib包,把其中的jar都加入我們的工程中。

    然后重新編譯一下工程,這時我們發現SimpleServerStub還是有幾個小紅叉。這個是因為這個插件有個小bug。

    生成的代碼沒有實現序列化方法。我們可以自己來加上,在小紅叉上點一下,彈出一個小菜單,選擇

    Add unimplemented methods .



     

    8.

    Java代碼
    1. /** 
    2.  * 調 用發布的服務。 
    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.   //調用simpleMethod的setName方法。  
    14.   request.setName("zt");  
    15.   //  
    16.   System.out.println(stub.simpleMethod(request).get_return());  
    17.     
    18.     
    19.  }  
    20. }  

       如果一切正常,你就會看到結果

    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 ^-^。

    調用服務成功。這是個簡單的例子,下節我們再做一個復雜一點的例子,來更好的學習axis2

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

    我們2005年底就做了一個Wap網站“WAP一把刀實用查詢大全”,當 時沒有統計、沒有廣告,只有簡單的免費服務功能。

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

      今年從Analytics的英文官方博客中看到Google終于承擔起這個免費的Wap統計任務,不過我忙于其它事情,一直沒有加上代 碼試試。

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

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

    • PHP
    • Perl
    • JSP
    • ASPX

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

    將代碼粘貼到您的移動網站

    請注意:請勿在使用移動跟蹤的網頁上使用臺式機跟蹤代碼。

    第 1 步:復制下列代碼,然后將其粘貼到您要跟蹤的每個網頁的 <html> 標記之前,并使其緊鄰此標記。

    <%@ 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 步:復制下列代碼,然后將其粘貼到您要跟蹤的每個網頁的 </body> 標記之前,并使其緊鄰此標記。

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

    將此文件復制到您的根目錄

    下載 ga.jsp 并將其保存到您的網絡服務器的根目錄 ("/")。請確保將您的根目錄配置為執行服務器端代碼。

      我們以前開發時,用的wml 1.x,根本就沒有<html>和</body>標記,不過有對應的<wml>和</card>,我一 步一步按照上面的要求設置了。順便還把以前瀏覽器報錯的地方統一批量修改替換掉。

      有幾個特別說明的地方:

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

      從實際運行的情況看,對Wap網站沒有特別的影響,也沒有像以前其他小公司搞的統計代碼都帶個圖標鏈接,Analytics的wap和web版 本一樣,都不在網頁中顯示任何內容。

      登錄Analytics后臺已經可以看到有統計數據產生了,wap網站的統計數據和web網站的統計數據差不多全面,比以前的其它免費 wap統計都強很多,不僅僅是簡單的訪問數據統計,更重要的還有各種分析功能。我準備打開Analytics與AdSense結合的功能看看能否還統計出 AdSense的情況,另外也打開內部搜索統計試一試,有新的發現后再補充在日志中。

      用Analytics中的Wap統計有一點最放心:不用害怕Google過一陣子不再提供這個服務了。Image:Face-027.gif

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

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

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

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

    3. 直接拷貝plugins和features兩個目錄下的內容置于$Eclipse_Home$/對應的plugins和features下面

    4. 用link外鏈接與外部插件關聯


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

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

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

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

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

    3.2下載xerces.jar軟件包
    在Apache網站上×××下載xerces.jar軟件包,這個包中包含了上面我們列舉的幾種解析xml數據的API。然后將這個軟件包加入到程序的 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;

    // 運行主方法
    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
    // 處理各種分隔符號
    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");
    }

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

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

    // 處理標記頭
    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();
    }

    }


    總結,雖然解析xml數據很復雜,因為涉及了很多的遞歸算法,但是我們可以使用業界比較成熟的解析API來進行xml數據處理。我現在只是給出了一個非常 簡單的例子,但是在真實系統中遠比這個要復雜的多,大家以后在使用的使用會發現還是有很多的工作要做的。
    posted @ 2010-03-17 17:37 小菜毛毛 閱讀(3799) | 評論 (2)編輯 收藏

    一、        前言

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

    JAXP接口包含了三個包:

    (1)       org.w3c.dom  W3C推薦的用于XML標準規劃文檔對象模型的接口。

    (2)       org.xml.sax   用于對XML進行語法分析的事件驅動的XML簡單API(SAX)

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

    二、        前提

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

    三、        使用SAX解析XML文檔

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

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

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

    <books>

      <book email="zhoujunhui">

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

                 <price>jjjjjj</price>

      </book>

    </books>

    簡單的不能再簡單了。但是該有的都有了,根元素、屬性、子節點。好了,能反應問題就行了,下面來看看解析這個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  }

    這段代碼比較短,因為SAX是事件驅動的,它的大部分實現在在另一個Java文件中,先別管另一個文件,我們來一個個地分析吧!

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

    3            SAXParserFactory saxfac=SAXParserFactory.newInstance();

    這是一個javax.xml.parsers.SAXParserFactory類的實例

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

    5            SAXParser saxparser=saxfac.newSAXParser();

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

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

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

    InputStream是一個接口。

    (4)解析XML文檔

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

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

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

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

    public class DefaultHandler

    implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler

    實現了這么多接口啊,其它的先不管了,至少它實現了ContentHandler這一接口。

    好了,看看這個類有些什么吧?下面是它的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("文檔打印結束了");

           }

           /* (非 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,我們這個類實到了ContentHandler接口中的如下方法:

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

         public void startDocument() throws SAXException {

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

            }

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

          public void endDocument() throws SAXException {

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

            }

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

                  }

           }

    第二個參數String qName表示這個元素的名字,如:

    根節點 <books></books> 它的qName為“books”

    最底層節點 <price>jjjjjj</price> 它的qName為“price”

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

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

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

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

                         }

                  }

           }

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

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

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

                         throws SAXException {

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

           }

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

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

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

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

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

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

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


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


    SAX概念

       SAX是Simple API for XML的縮寫,它并不是由W3C官方所提出的標準,可以說是“民間”的事實標準。實際上,它是一種社區性質的討論產物。雖然如此,在XML中對SAX的應用絲毫不比DOM少,幾乎所有的XML解析器都會支持它。

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

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

       在XMLReader接受XML文檔,在讀入XML文檔的過程中就進行解析,也就是說讀入文檔的過程和解析的過程是同時進行的,這和DOM區 別很大。解析開始之前,需要向XMLReader注冊一個ContentHandler,也就是相當于一個事件監聽器,在ContentHandler中 定義了很多方法,比如startDocument(),它定制了當在解析過程中,遇到文檔開始時應該處理的事情。當XMLReader讀到合適的內容,就 會拋出相應的事件,并把這個事件的處理權代理給ContentHandler,調用其相應的方法進行響應

    posted @ 2010-03-17 15:42 小菜毛毛 閱讀(319) | 評論 (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文件。

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

    在此,JBoss的安裝工作已經結束,可通過如下方式測試安裝是否成功:

    運行JBoss安裝目 錄"bin"run.bat,如果窗口中沒有出現異常,且出現: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/ 進入JBoss的歡迎界面,點擊JBoss Management下的JMX Console可進入JBoss的控制臺。

    若啟動失敗,可能由以下原因引起:

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

    2)              JDK安裝不正確;

    3)              JBoss下載不完全。

    二.             JBoss 的目錄結構說明

    目錄

    描述

    bin

    啟動和關閉 JBoss 的腳本( run.bat 為 windows 系統下的啟動腳本, shutdown.bat 為 windows 系統下的關閉腳本)。

    client

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

    docs

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

    docs/dtd

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

    lib

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

    server

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

    server/all

    JBoss 的完全配置,啟動所有服務,包括集群和 IIOP 。

    server/default

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

    server/default/conf

    JBoss 的配置文件。

    server/default/data

    JBoss 的數據庫文件。比如,嵌入的數據庫,或者 JBossMQ

    server/default /deploy

    JBoss 的熱部署目錄。放到這里的任何文件或目錄會被 JBoss 自動部署。 EJB 、 WAR 、 EAR ,甚至服務。

    server/default /lib

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

    server/default/log

    JBoss 的日志文件。

    server/default/tmp

    JBoss 的臨時文件。

    三.             JBoss 的配置

    1.       日志文件設置

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

    2.       web 服務的端口號的修改

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

    <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端口修改為你想要的端口即可。重新啟動JBoss后訪問:http://localhost/:新設置的端口,可看到JBoss的歡迎界面。

    3.       JBoss 的安全設置

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

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

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

    <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同級目錄下的web.xml文件,查找到<security-constraint/>節點,去掉它的注釋,修改后該部分內容為:

    <!-- 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安全域和第二步中的運行角色JBossAdmin都是在login-config.xml中配置,我們在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文件中設置,分別打開這兩個文件。

    其中jmx-console-users.properties文件的內容如下:

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

    admin=admin

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

    jmx-console-roles.properties的內容如下:

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

    admin=JBossAdmin, HttpInvoker

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

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

    四.             MyEclipse 中配置JBoss

    筆者的MyEclipse版本:6.5 GA

    JBoss版本:5.0
    JDK版本:1.6

    進入Window-> Preferences-> MyEclipse -> Application Servers -> JBoss5,進行如下設置:
        

    選擇JBoss 5下的JDK設置所用的JDK.

    好了,開始JBoss之旅吧.

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

    僅列出標題
    共17頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 Last 
    主站蜘蛛池模板: 日本免费人成视频播放| 久久久久国产精品免费免费不卡| 91青青青国产在观免费影视| 韩国免费A级毛片久久| 国产免费资源高清小视频在线观看| 亚洲国产成人久久综合碰| 中文字幕亚洲天堂| 国产精品成人69XXX免费视频| 亚洲免费在线播放| 亚洲高清美女一区二区三区| 99在线在线视频免费视频观看| 成年女人永久免费观看片| 国产精品国产亚洲区艳妇糸列短篇 | 人体大胆做受免费视频| 亚洲精品国精品久久99热| 成年免费a级毛片免费看无码| 久久青青成人亚洲精品| 99久久精品免费精品国产| 亚洲女人初试黑人巨高清| 免费人成动漫在线播放r18| 特级精品毛片免费观看| 在线免费观看亚洲| 国内一级一级毛片a免费| 亚洲宅男永久在线| 日本亚洲免费无线码| 久久亚洲精品成人无码| 91九色老熟女免费资源站| 一本色道久久综合亚洲精品| 激情无码亚洲一区二区三区| JLZZJLZZ亚洲乱熟无码| 久久这里只精品国产免费10| 亚洲自偷自偷在线制服| 鲁大师在线影院免费观看| 亚洲中文字幕人成乱码| 亚洲AⅤ优女AV综合久久久| 国产免费爽爽视频在线观看| 亚洲理论片在线观看| 免费A级毛片无码A| 最近2019年免费中文字幕高清| 亚洲AV无码成人网站在线观看| 国产亚洲精品美女久久久|