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

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

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

    JunXiu

    2010年12月30日

    為了解答“正則表達式(/[^0-9]/g,'')中的"/g"是什么意思?”這個問題,也為了能夠便于大家對正則表達式有一個更為綜合和深刻的認識,我將一些關鍵點和容易犯糊涂的地方再系統總結一下。

    總結1:附件參數g的用法

    表達式加上參數g之后,表明可以進行全局匹配,注意這里“可以”的含義。我們詳細敘述:

    1)對于表達式對象的exec方法,不加入g,則只返回第一個匹配,無論執行多少次均是如此,如果加入g,則第一次執行也返回第一個匹配,再執行返回第二個匹配,依次類推。例如
    var regx=/user\d/;
    var str=“user18dsdfuser2dsfsd”;
    var rs=regx.exec(str);//此時rs的值為{user1}
    var rs2=regx.exec(str);//此時rs的值依然為{user1}
    如果regx=/user\d/g;則rs的值為{user1},rs2的值為{user2}
    通過這個例子說明:對于exec方法,表達式加入了g,并不是說執行exec方法就可以返回所有的匹配,而是說加入了g之后,我可以通過某種方式得到所有的匹配,這里的“方式”對于exec而言,就是依次執行這個方法即可。

    2)對于表達式對象的test方法,加入g于不加上g沒有什么區別。

    3)對于String對象的match方法,不加入g,也只是返回第一個匹配,一直執行match方法也總是返回第一個匹配,加入g,則一次返回所有的匹配(注意這與表達式對象的exec方法不同,對于exec而言,表達式即使加上了g,也不會一次返回所有的匹配)。例如:
    var regx=/user\d/;
    var str=“user1sdfsffuser2dfsdf”;
    var rs=str.match(regx);//此時rs的值為{user1}
    var rs2=str.match(regx);//此時rs的值依然為{user1}
    如果regx=/user\d/g,則rs的值為{user1,user2},rs2的值也為{user1,user2}

    4)對于String對象的replace方法,表達式不加入g,則只替換第一個匹配,如果加入g,則替換所有匹配。(開頭的三道測試題能很好的說明這一點)

    5)對于String對象的split方法,加上g與不加g是一樣的,即:
    var sep=/user\d/;
    var array=“user1dfsfuser2dfsf”.split(sep);
    則array的值為{dfsf, dfsf}
    此時sep=/user\d/g,返回值是一樣的。

    6)對于String對象的search方法,加不加g也是一樣的。

    總結2:附加參數m的用法

    附加參數m,表明可以進行多行匹配,但是這個只有當使用^和$模式時才會起作用,在其他的模式中,加不加入m都可以進行多行匹配(其實說多行的字符串也是一個普通字符串),我們舉例說明這一點

    1)使用^的例子
    var regx=/^b./g;
    var str=“bd76 dfsdf
    sdfsdfs dffs
    b76dsf sdfsdf”;
    var rs=str.match(regx);
    此時加入g和不加入g,都只返回第一個匹配{bd},如果regx=/^b./gm,則返回所有的匹配{bd,b7},注意如果regx=/^b./m,則也只返回第一個匹配。所以,加入m表明可以進行多行匹配,加入g表明可以進行全局匹配,綜合到一起就是可以進行多行全局匹配

    2)使用其他模式的例子,例如
    var regx=/user\d/;
    var str=“sdfsfsdfsdf
    sdfsuser3 dffs
    b76dsf user6”;
    var rs=str.match(regx);
    此時不加參數g,則返回{user3},加入參數g返回{user3,user6},加不加入m對此沒有影響。

    3)因此對于m我們要清楚它的使用,記住它只對^和$模式起作用,在這兩種模式中,m的作用為:如果不加入m,則只能在第一行進行匹配,如果加入m則可以在所有的行進行匹配。我們再看一個^的例子
    var regx=/^b./;
    var str=“ret76 dfsdf
    bjfsdfs dffs
    b76dsf sdfsdf”;
    var rs=str.match(regx);
    此時rs的值為null,如果加入g,rs的值仍然為null,如果加入m,則rs的值為{bj}(也就是說,在第一行沒有找到匹配,因為有參數m,所以可以繼續去下面的行去找是否有匹配),如果m和g都加上,則返回{bj,b7}(只加m不加g說明,可以去多行進行匹配,但是找到一個匹配后就返回,加入g表明將多行中所有的匹配返回,當然對于match方法是如此,對于exec呢,則需要執行多次才能依次返回)

    總結3:在HTML的textarea輸入域中,按一個Enter鍵,對應的控制字符為“\r\n”,即“回車換行”,而不是“\n\r”,即“換行回車”,我們看一個前面我們舉過的例子:
    var regx=/a\r\nbc/;
    var str=“a
    bc”;
    var rs=regx.exec(str);
    結果:匹配成功,rs的值為:{ },如果表達式為/a\n\rbc/,則不會被匹配,因此在一般的編輯器中一個”Enter”鍵代表著“回車換行”,而非“換行回車”,至少在textarea域中是這樣的。

    posted @ 2010-12-30 17:45 junlin 閱讀(198) | 評論 (0)編輯 收藏

    2010年11月1日

    作在工作中,經常需要遠程連接到服務器上,然而在公司里,老總、同事都需要連接到服務器上的,而默認的Win2003操作系統最大連接數是2,這樣一來,問題也就來了,常常遇到“終端服務器超出最大連接數”,導致無法正常登陸服務器。下面講解在網上流傳的幾種方法,來解決這一問題。

    解決方法一:用“注銷”方式退出遠程桌面,而不是直接關閉窗口;

    解決方法二:踢出已經斷開的連接用戶;

    1、首先通過各種方法連接到服務器上(telnet);

    2、上去后,查看登陸用戶列表。輸入命令:query user;

    這樣你就可以看出有何不同來啦,可以根據你的具體情況而定的。ID為0的用戶就是本地登陸的,而在State中看提示,當提示為已斷開,則說明用戶已經斷開還占用著系統資源和通道,這樣就可以把該用戶踢掉。輸入logoff ID,即踢除相應ID的用戶。

    解決方法三:限制已斷開連接的會話存在時間;(推薦)

    一般情況下,我們在維護遠程服務器時,不可能長時間在線,但是系統默認的卻是只要登錄就不再斷開。因此,我們可以修改這一默認設置,給它指定一個自動斷開的時間即可。

    可以在 Windows 2003 服務器上通過組策略中設置一下來解決問題:單擊“開始 → 運行”,輸入“gpedit.msc”,回車后打開組策略窗口,然后依次定位到“計算機配置 → 管理模板 → Windows 組件 → 終端服務 → 會話”,然后在右側窗口中雙擊“為斷開的會話設置時間限制”,在打開的窗口中將“結束斷開連接的會話”時間設置為5分鐘,或者設置為空閑就斷開。或在遠程服務器上打開“運行”窗口,輸入“tscc.msc”連接設置窗口。然后雙擊“連接”項右側的“RDP-Tcp”,切換到“會話”標簽,選中“替代用戶設置”選項,再給“結束已斷開的會話”設置一個合適的時間即可。

    解決方法四:增加連接數量,即設置最大連接數再多些;

    默認情況下允許遠程終端連接的數量是2個用戶,我們可以根據需要適當增加遠程連接同時在線的用戶數。

    單擊“開始→運行”,輸入 “gpedit.msc”打開組策略編輯器窗口,依次定位到“計算機配置 → 管理模板 → Windows 組件 → 終端服務”,再雙擊右側的“限制連接數量”,將其TS允許的最大連接數設置大一些即可。

    經過上面兩個配置(方法三&方法四),基本上就可以保證遠程終端連接時不再受限。但仍有人反映,當前同時只有一個用戶進行連接,卻提示超出最大允許鏈接數,這又是什么原因呢?出現這種情況是因為操作不當所造成的。在上一個帳戶登錄遠程桌面后退出時,沒有采用注銷的方式,而是直接關閉遠程桌面窗口,那么導致該會話并沒有被釋放,而是繼續保留在服務器端,占用了連接數,這樣就會影響下一個用戶的正常登錄了。

    解決方法五:限制用戶會話數;

    對Terminal Services進行限制,使得一個用戶僅僅能夠連接一次。對于Windows Server 2003,請在Terminal Services Configuration(Terminal Services配置)中將“限制每位用戶只有擁有一個會話”(Restrict each user to one session)設置為“是”(Yes)。此外,您可以將“限制終端服務用戶使用單個遠程會話”組策略設置為“啟用”。

    注意:版本不一樣解決的方法有異!

    A:這是因為Windows 2003中設置了最大允許連接數限制,而你每次連接后可能沒有注銷而是直接關閉,導致連接數超過了最大連接數。你可以在Windows 2003 服務器上通過組策略中設置一下來解決問題:單擊“開始→運行”,輸入 “gpedit.msc”,回車后打開組策略窗口,然后依次定位到“計算機配置 → 管理模板 → 終端服務 → 會話”,然后在右側窗口中雙擊“為斷開的會話設置時 間限制”,在打開的窗口中將“結束斷開連接的會話”時間設置為5分鐘。最好的解決方法還是你每次斷開連接時通過注銷的方式。

    B:經常多人管理服務器的朋友一定遇到過當自己終端連接遠程計算機的時候卻提示“終端連接超出了最大連接”的提示吧?這是因為windows2003僅支持2個終端用戶的登陸。當這種情況出現后,多數人選擇的是給機房打電話進行重啟服務器。可是帶來的損失也是顯而 易見的。那么我們有什么辦法來解決呢?方法當然是有的。我們只需要在一臺2003的機器上運行“tsmmc.msc”就可以打開遠程桌面連接,在這里我們 添加一個新的連接,輸入對方的IP地址帳號和密碼后就可以成功登陸到對方的桌面中,這時可以再踢下一個用戶。就可以解決終端連接數超過最大的問題。

    C:開始 → 控制面版 → 授權里面更改連接數。

     

    在命令行:
    mstsc /console /v:你的服務器IP:遠程端口

    例如 :mstsc /console /v:222.222.215.222:3389

    win2K/win2003終端服務器超出最大允許連接數解決之道全攻略
    原因:用遠程桌面鏈接登錄到終端服務器時經常會遇到“終端服務器超出最大允許鏈接數”諸如此類錯誤導致無法正常登錄終端服務器,引起該問題的原因在于終端服務的缺省鏈接數為2個鏈接,并且當登錄遠程桌面后如果不是采用注銷方式退出,而是直接關閉遠程桌面窗口,那么實際上會話并沒有釋放掉,而是繼續保留在服務器端,這樣就會占用總的鏈接數,當這個數量達到最大允許值時就會出現上面的提示。
    如何避免?
    一、用注銷來退出遠程桌面而不是直接關閉窗口二、限制已斷開鏈接的會話存在時間
    1、從終端服務配置中修改
    運行-Tscc.msc(終端服務配置)-連接-雙擊RDP-Tcp或右擊-屬性-會話-選中第一個的替代用戶設置(O)-結束已斷開的會話[將默認值“從不”改為一個適當的時間,比如30分鐘]
    2、從組策略修改
    開始-運行-gpedit.msc-計算機配置-管理模板-windows組件-終端服務-會話
    右邊窗口選擇 為斷開的會話設置時間限制 -選擇已啟用,選擇一個時間
    三、增加最多鏈接數
    1、從終端服務配置中修改:運行-Tscc.msc(終端服務配置)-連接-雙擊RDP-Tcp或右擊-屬性,選擇“網卡”選項卡-修改“最大連接數”改成你所需的值,當然這個值不也能太大,否則會占用較多的系統資源。不過這里修改的值好像不起作用,設置成無限制時照樣還是會出現本文所說的情況。  
    2、組策略級別要高于終端服務配置,當啟用組策略后終端服務配置中的相應選項會變成灰色不可修改
    運行-gpedit.msc-計算機配置-管理模板-Windows組件-終端服務
    雙擊右邊的”限制連接數量“-選擇”已啟用“-填入允許的最大連接數
    四、改變遠程終端模式
    打開“控制面板”,雙擊“添加刪除程序”,單擊“添加刪除Windows組件”,“組件”,在Windows組件向導對話框中選中“終端服務” , “下一步”,“應用服務器”,“下一步”,然后按照提示即可改變終端服務的模式。  
    Windows 2000終端服務有2種運行模式: 遠程管理模式和應用程序服務器模式。遠程管理模式允許系統管理員遠程管理服務器,而且只允許2個終端會話同時登錄終端服務器。應用程序服務器模式允許用戶運行一個以上應用程序,允許多個用戶從終端登錄訪問服務器。但是,應用終端服務的用戶必須有終端服務授權,即必須在90天之內在這個域或工作組中設置終端服務授權服務器,否則用戶需刪除應用程序,然后再重新安裝。
    五、修改本地安全策略
    控制面板>>管理工具>>本地安全策略>>本地策略>>安全選項>>
    1、先找到>>Microsoft網絡服務器:在掛起會話之前所需的空閑時間
    默認為:15分鐘,改為自己所需要的時間(就是登陸后無動作空閑超過多少時間后自動斷開)
    2、然后找到>>網絡安全:在超過登錄時間后強制注銷。默認為:已禁用,一定要改為:已啟用
    如果已經發生解決辦法:
    1、首先你可以telnet到此主機上(不管你用哪種方法),當然如果能直接操作機器更好,不過直接操作就不必用命令行了,那當然是知道機器超級管理員的密碼的情況下,可以使用OpenTelnet來打開遠程服務器的Telnet端口。
    2、Telnet上去后,先看登陸的用戶:
    輸入命令:query user
    系統返回:
    C:>query user
    USERNAME        SESSIONNAME     ID    STATE     IDLE TIME    LOGON TIME
    k12update       console         1     運行中         2007-3-14 14:57
    此時可以看出的可能都不一樣,根據具體情況而定。
    ID 0 的用戶是本地登陸的,ID 1 和 ID 12是3389登陸的用戶,前者在運行中,后者已經斷開了,但是斷開了仍然占用系統資源和通道,我們要把它踢掉。如下進行操作即可。
    輸入命令:logoff 1
    3、如果服務器關閉了telnet功能(這是默認的),還可以通過SqlServer的xp_cmdshell擴展存儲過程,使用格式:master.dbo.xp_cmdshell '命令內容',其余可參考第二步。此方式要求有訪問xp_cmdshell的權限
    上面的辦法基本沒有用

    [原創經典]“終端服務器超出了最大允許連接數”的解決辦法

    2007-04-25 17:13

    現象及原因:用遠程桌面連接登錄到終端服務器時經常會遇到“終端服務器超出最大允許連接數”諸如此類錯誤導致無法正常登錄終端服務器,引起該問題的原因在于Windows Server 2003中設置終端服務的缺省連接數為2個鏈接,并且當登錄遠程桌面后如果不是采用注銷方式退出,而是直接關閉遠程桌面窗口,那么實際上會話并沒有釋放掉,而是繼續保留在服務器端,這樣就會占用總的鏈接數,當這個數量達到最大允許值時就會出現上面的提示。
    解決方案:
    法一:用“注銷”方式退出遠程桌面而不是直接關閉窗口
    法二:踢出已經斷開連接的用戶
    1、首先telnet到此主機上(不管你用什么方法),當然如果能直接操作機器更好,不過直接操作就不必用命令行了,用控制臺更直觀(略過)。
    2、Telnet上去后,先看登陸的用戶:
    輸入命令:query user 系統返回:
    用戶名Username      會話名Session Name      ID   狀態State    空閑時間Idle Time     登錄時間Logon Time
    administrator            console                               0   運行中               .                           2007-1-12 10:24
    lucy                                                                           1   唱片            無                            2007-1-12 10:35
    >administrator         rdp-tcp#35                      2   已斷開               .                          2007-1-25 18:09
    此時可以看出的可能跟我的不一樣,根據你的具體情況而定。
    ID 0 的用戶是本地登陸的
    ID 1 和 ID 2是3389登陸的用戶,前者在運行中, 后者已經斷開了,但是斷開了仍然占用系統資源和通道,我們要把它踢掉,如下進行操作即可。
    輸入命令:logoff 1
    再看看
    C:\Documents and Settings\Administrator.AD>query user
    用戶名Username      會話名Session Name      ID   狀態State    空閑時間Idle Time     登錄時間Logon Time
    administrator          console                                0   運行中               .                          2007-1-12 10:24
    >administrator       rdp-tcp#35                       2   已斷開               .                          2007-1-25 18:09
    3、如果服務器關閉了telnet功能(這是默認的),還可以通過SqlServer的xp_cmdshell擴展存儲過程,使用格式:master.dbo.xp_cmdshell ''''命令內容'''',其余可參考第二步。此方式要求有訪問xp_cmdshell的權限。
    法三(最佳方法-推薦):限制已斷開鏈接的會話存在時間
    一般情況下,我們在維護遠程服務器時,不可能長時間在線,但是系統默認的卻是只要登錄就不再斷開。因此,我們可以修改這一默認設置,給它指定一個自動斷開的時間即可。
    可以在Windows 2003 服務器上通過組策略中設置一下來解決問題:單擊"開始→運行",輸入"gpedit.msc",回車后打開組策略窗口,然后依次定位到"計算機配置→管理模板→Windows 組件→終端服務→會話",然后在右側窗口中雙擊"為斷開的會話設置時間限制",在打開的窗口中將"結束斷開連接的會話"時間設置為5分鐘,或者設置為空閑就斷開。

    在遠程服務器上打開“運行”窗口,輸入“tscc.msc”連接設置窗口。然后雙擊“連接”項右側的“RDP-Tcp”,切換到“會話”標簽,選中“替代用戶設置”選項,再給“結束已斷開的會話”設置一個合適的時間即可。
    法四:增加連接數量,即設置可連接的數量多些
    默認情況下允許遠程終端連接的數量是2個用戶,我們可以根據需要適當增加遠程連接同時在線的用戶數。
    單擊“開始→運行”,輸入“gpedit.msc”打開組策略編輯器窗口,依次定位到“計算機配置→管理模板→Windows 組件→終端服務”,再雙擊右側的“限制連接數量”,將其TS允許的最大連接數設置大一些即可。
    經過上面兩個配置(法三&法四),基本上就可以保證遠程終端連接時不再受限。但仍有人反映,當前同時只有一個用戶進行連接,卻提示超出最大允許鏈接數,這又是什么原因呢?出現這種情況是因為操作不當所造成的。在上一個帳戶登錄遠程桌面后退出時,沒有采用注銷的方式,而是直接關閉遠程桌面窗口,那么導致該會話并沒有被釋放,而是繼續保留在服務器端,占用了連接數,這樣就會影響下一個用戶的正常登錄了。
    法五:限制用戶會話數
    對Terminal Services進行限制,使得一個用戶僅僅能夠連接一次
    對于Windows Server 2003,請在Terminal Services Configuration(Terminal Services配置)中將“限制每位用戶只有擁有一個會話”(Restrict each user to one session)設置為“是”(Yes)。此外,您可以將“限制終端服務用戶使用單個遠程會話”組策略設置為“啟用”。

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/62guangye/archive/2010/02/05/5291415.aspx

    posted @ 2010-11-01 17:06 junlin 閱讀(1398) | 評論 (0)編輯 收藏

    2010年9月9日

    介紹:

         getDefinitionByName是flash.utils下面的,屬于工具包類。正如函數名稱是通過Name來獲得該名稱所對應的類對象,意思就是說通過一個類的名稱能夠獲取到該類對象,從而通過該類對象聲明一個該類的實例對象。注意該函數中的參數name=類路徑+類名稱。

     

    實例:

         var btncls:Class = getDefinitionByName("mx.controls.Button") as Class ;

         var myBtn:Object = new btncls() ;

         myBtn.label = "我是通過名字獲得類實例聲明出來的BTN" ;

          this.addChild( myBtn as DisplayObject ) ;

     

    應用:

         現在在flex里面要用到在flash cs3 設計一批元件,當然可以通過導出元件的swc然后添加到工程下面的libs下,當需要在flex里面把這些若干元件當成庫來獲取庫中的單個元素時,我們就可以通過geDefinitionByName函數來實現,具體實現步驟為下:

         第一:在flash cs3中準備好若干個元件,并為元件添加鏈接名稱(最好鏈接名稱和元件名稱一樣)。然后在場景的第一幀里面添加代碼如下:

          function getClassByName(cname:String):Class  //cname即為元件的鏈接名稱。
          {
             var mc:Class =  getDefinitionByName(cname) as Class;
             return mc;
          }

          然后生成swf。

          第二:將swf文件放入工程中,用loader將swf文件導入到程序中。在loader導入成功(觸發Event.Complete事件)后,loader.content即為swf。然后訪問對象的getClassByName()來獲取swf中的元件。存入庫中,以備后用。

          代碼如下:

          var nameArr:Array = ["燭光","菊花"] ;

          var mcArr:Array = new Array() ;

          function init():void

          {

                var loader:Loader = new Loader() ;

                loader.contentLoaderInfo.addEventLinstener( Event.COMPLETE , onComplete  ) ;

                loader.load(new URLRequest("assets/firelib.swf")) ;

           }

           function onComplete(evnet:Event):void

           {

              for(var i:uint=0 ; i<nameArr.length ; i++)

              {

                 var cls:Class = Object( event.target.content).getClassByName(nameArr[i]) ;//getClassByName()即為swf場景中定義的函數。

                 mcArr.push( { name:nameArr[i] , content:new cls() } ) ;

               }

           }

     

    延伸:

         getQualifiedClassName(value:*)String

              根據一個對象返回該對象的包含完全限定類名稱的字符串。

          getQualifiedSuperClassName(value:*)String

              根據一個對象返回該對象的基類的完全限定類名的字符串。

          在通過上面兩個方法得到一個完全限定類名稱之后,運用 getDefinitionByName()就可以將類名轉換成類應用。

    posted @ 2010-09-09 19:16 junlin 閱讀(1569) | 評論 (1)編輯 收藏

    2010年9月6日

    flexendpoint的作用是什么?

    endpoint

    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
                <endpoint url="http://127.0.0.1/flexweb/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint" />
        
            </channel-definition>

            <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
                <endpoint url="https://127.0.0.1/flexweb/messagebroker/amfsecure " class="flex.messaging.endpoints.SecureAMFEndpoint"/>
                <properties>
                    <add-no-cache-headers>false</add-no-cache-headers>
                </properties>
            </channel-definition>

            <channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
                <endpoint url="http://127.0.0.1/flexweb/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/>
                <properties>
                    <polling-enabled>true</polling-enabled>
                    <polling-interval-seconds>4</polling-interval-seconds>
                </properties>
            </channel-definition>
      
      
    Flex 調用遠程或所在web應用的 BlazeDS服務時,必須建立和遠端的通道channel,才能正常通信。
    1.  通常的方式是 Flex 在編譯時就指定遠程的端點 Endpoint,service-config.xml 中的Endpoint 配置是 例如:
    Xml代碼
    <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"  
    說明:server.name:如果是本機的話,那就是127.0.0.1了,如果發布在網上的話,那一定是一個域名了知道有多么的重要了吧。
          server.port:服務器的端口號。
          context.root:是你的項目名稱。
      
    編譯時指定的方式是在加編譯參數,例如:

    引用
      -services "services-config.xml" -context-root "/flexWeb"       

       services-config.xml 需要放在當前目錄下,或者指定BlazeDS所在的配置文件路徑。
    2. 在 <mx:RemoteObject/> 對象中指定Endpoint參數:
         例如: 
        Xml代碼
    <mx:RemoteObject id="roOrder" destination="Hello" showBusyCursor="true" endpoint="http://server:8080/flexWeb/messagebroker/amf">
    <mx:RemoteObject id="roOrder" destination="Hello" showBusyCursor="true" endpoint="http://server:8080/flexWeb/messagebroker/amf">
     說明:1) 全路徑:          endpoint="http://server:8080/flexWeb/messagebroker/amf" >
           2) 基于contextRoot: endpoint="/flexWeb/messagebroker/amf" >
           3) 基于當前路徑:   endpoint="messagebroker/amf" >

    posted @ 2010-09-06 16:07 junlin 閱讀(1032) | 評論 (0)編輯 收藏

    Flex和Java 整合有幾種方法,最常見的是:

    一,Flex,java在一個項目中。

    二,Flex,java分別在兩個項目中。

    第一種,直接在新建Flex項目中選擇應用服務器,選擇blazeDS即可。

    注意要寫上輸出文件夾url.endpoint="messagebroker/amf" 寫上相對路徑即可。

    第二種,分別新建Flex ,java 項目,blazeds.war項目中的WebConten/Web-Inf替代java項目下的web-inf。在remoting-config.xml下寫上:

    <destination id="hxh">  
           <properties>  
               <source>com.demo.hxh</source>  
           </properties>  
        </destination>  
    并布署為tomcat.

    Flex項目中修改endpoint="/hxh/messagebroker/amf",并設置輸出文件夾為java ,WebContent下的,輸出文件夾url為java項目,如為http://localhost:8400/hxh

    或者新建項目如一,在新建項目java把編譯目錄設為Flex-webcontent-classes下。

    一般問題都錯在設置上,endpoint是一個注意點。

    關于endpoint:

    public interface Endpointextends ManageableAn endpoint receives messages from clients and decodes them, then sends them on to a MessageBroker for routing to a service. The endpoint also encodes messages and delivers them to clients. Endpoints are specific to a message format and network transport, and are defined by the named URI path on which they are located.


    在 <mx:RemoteObject/> 對象中指定Endpoint參數:

         1) 全路徑:          endpoint="http://server:8080/HelloBlazeDS/messagebroker/amf" >
         2) 基于contextRoot: endpoint="/HelloBlazeDS/messagebroker/amf" >
         3) 基于當前路徑:   endpoint="messagebroker/amf" >


    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/bill1315/archive/2010/07/21/5751496.aspx

    posted @ 2010-09-06 16:06 junlin 閱讀(919) | 評論 (0)編輯 收藏
    一、國外站點
    1.資源類

    Adobe Flex 2 Component Explorer: 官方的,展示了各種組件的用法,入門必看。

    CFlex:很好的一個Flex資源站點,包括教程,新聞,資源站點&hellip;&hellip; 只是頁面有點雜亂,大家一般看右邊那一欄就行了。

    FlexBox:一個收集了網上很多開源組件的站點,是進階學習的好幫手。

    FlexLib:也是一個開源Flex組件站點,不過與FlexBox不同的是,這個是原創,而FlexBox只是收集。

    Flex Developer Center:Adobe Flex開發者中心,經常會有一些好的教程出現。

    Adobe Labs:這個不用我說了吧。

    Flex.org:http://www.flex.org/  官方的,基本上應有盡有。

    2. Explorers

    Flex 2 Style Explorer:用來設計程序樣式風格的工具,很好用,現在源代碼已經可以下載。

    Flex 2 Primitive Explorer:用來調節各種Primitive圖形的組件,非官方的,源代碼提供下載。

    Flex 2 Filter Explorer:用來調節各種濾鏡(filter),非官方的,源代碼提供下載。

    3. Blogs

    MXNA:這個不用我說了吧,雖說這不是一個Blog,但是它聚合了所有優秀的Blog,所以把它放在Blog一欄,下面所有的Blog都在這個聚合中。

    Alex Uhlmann:http://weblogs.macromedia.com/auhlmann/

    Christophe Coenraets:http://coenraets.org/ 特別推薦

    Code Slinger:http://blogs.digitalprimates.net/codeSlinger/

    Deitte:http://www.deitte.com/

    Doug mccune:http://dougmccune.com/blog/ 特別推薦

    Flex Doc Team:http://blogs.adobe.com/flexdoc/

    Kuwamoto:http://kuwamoto.org/ 特別推薦

    Macromedia Consulting:http://weblogs.macromedia.com/mc/

    Matt Chotin:http://weblogs.macromedia.com/mchotin/ 特別推薦

    Peter Ent:http://weblogs.macromedia.com/pent/ 特別推薦

    Quietly Scheming:http://www.quietlyscheming.com/blog/ 特別推薦

    ScaleNine Blog:http://www.scalenine.com/blog/index.php 特別推薦

    Steven Webster:http://weblogs.macromedia.com/swebster/

    EverythingFlex:http://blog.everythingflex.com/ 特別推薦

    Alex&rsquo;s Flex Closet:http://blogs.adobe.com/aharui/ 特別推薦

    4. 郵件列表

    FlexCoders:http://tech.groups.yahoo.com/group/flexcoders/

    Flex Components:http://www.adobe.com/go/flexcomponents 非高級開發者最好別加入

    上面是兩個比較有名的郵件列表,建議大家提問之前先搜索一下郵件存檔,一般都能找到答案,找不到再提問。更多郵件列表請看這里:http://flex.org/community/

    5.Cairngorm 相關
    Cairngorm Documentation Group 這個里面收集了基本上所有關于Cairngorm的資料

    二、國內站點
    1.論壇

    RIACHINA:前身是RIACN,國內最好的Flex論壇之一。我最初知道Flex從這里開始,對這個站挺有感情,飲水思源,把它排第一。

    AnyFlex:國內最好的Flex論壇之一,成立的時間比較早,而且論壇FTP中有很多好的資料。

    RIADev:Google網上論壇,d.CAT前輩主持的,一般小問題都能解決。

    FlexCoders.cn:剛起步的論壇,不過看域名覺得挺有前途,呵呵。

    2.Blogs
    Dreamer&rsquo;s Blog:翻譯了國外Flex Blog上的大量優秀文章,博主自認為是國內中文資料最多的站點之一。

    Y.X.Shawn:對Flex研究很深入,自己寫一些開源的組件。

    d.CAT:高級開發者,臺灣的,為數不多的華語高級開發者,他還做過一個類似Caringorm的架構。

    Kenshin:很早就開始研究Flex了,自己開發過很多東西。

    3.Cairngorm
      沒有。不過我翻譯過一個關于Cairngorm 小文檔,大概30頁左右,或許對你有幫助。

    友情提示:上面這些站點中,資源類的更新不快,不用天天看;Blog和MXNA值得天天看,當然您也可以關注本站,因為我會把MXNA上的關于Flex的內容整理過來;有問題請先去郵件列表或者論壇中搜索,基本上都能搜索到。

    補充:http://bbs.actionscript3.cn/一個國內的專注于Flex與ActionScript3的論壇.

    http://blog.chinaunix.net/u/21684/article_67906.html 博客,里面有有很多Flex的教程和實例.

    http://www.flexcoders.cn/又是一個專業的Flex中文論壇
    posted @ 2010-09-06 13:52 junlin 閱讀(525) | 評論 (0)編輯 收藏

    2010年8月27日

    //獲得屏幕的分辨率

    var x:Number=Capabilities.screenResolutionX;

    var y:Number=Capabilities.screenResolutionY;

    Alert.show("x="+x+"y="+y);

    第二種方法

    Alert.show(stage.fullScreenWidth+"=="+stage.fullScreenHeight);

     

    //獲得stage(工作區)的寬、高

    Alert.show(stage.stageWidth+"=="+stage.stageHeight);

     

    //讀取xml文件
    private function readxml2():void

    {

    var urlrequest:URLRequest=new URLRequest("file/stu.xml");

    var urlloader:URLLoader=new URLLoader(urlrequest);

    urlloader.addEventListener(Event.COMPLETE, completehandler);

    }

     

    private function completehandler(event:Event):void

    {

    var xml:XML=new XML(event.target.data);

    // var arr:Array=new Array(xml);

    this.dg.dataProvider=xml.children();

    this.tree.dataProvider=xml;

    this.cb.dataProvider=xml.children();

    // this.hlist.dataProvider=xml.children();

    }


    //flex 獲得系統路徑

    var add:String=ExternalInterface.call("window.location.href.toString",1);

    Alert.show(add);

     

    //背景顏色不斷變化

     private function changeBG():void{

    var mytime:Timer=new Timer(2000);

    mytime.addEventListener(TimerEvent.TIMER,changHandle);

    mytime.start();

     }

     private function changHandle(e:TimerEvent):void{

    this.setStyle("backgroundColor",Math.random()* 0xffffff);

     }

     

    //獲得鍵盤按下的鍵的值

    public function getCode():void

    {

    btn.addEventListener(KeyboardEvent.KEY_DOWN, keyHandle);

    }

     

    function keyHandle(event:KeyboardEvent):void

    {

    Alert.show("你按下了:" + String.fromCharCode(event.charCode));

    }

    //動態加載不同界面

    import commont.Two;

    import commont.One;

    var t:Two=new Two();

    var o:One=new One();

    private function showOne():void{

    tw.removeAllChildren();

    tw.addChild(o);

    }

    private function showTwo():void{

    tw.removeAllChildren();

    tw.addChild(t);

    }

    //flex 綁定圖片

    [Bindable]

    [Embed(source="img/1.jpg")]

    public var phone1:Class;

     

    //日期中文標題

    <mx:DateChooser id="dtchoose" x="219" y="83" dayNames="[日,一,二,三,四,五,六]" monthNames="[一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月]" change="disDate()" minYear="2007"/>

    //選擇日期 dateChoose

    function disDate():void{

    txtDate.text=fm.format(dtchoose.selectedDate.toLocaleDateString());

    }

     

    //flex 中添加html標記

    <mx:TextArea id="text" creationComplete="init()" width="248" height="59">

    <mx:htmlText>

    <![CDATA[

    <input type='file'/>

    <a >你哈!!!</a>

    ]]>

    </mx:htmlText>

    </mx:TextArea>

     

    //flex 帶下劃線的鏈接

    this.lblLink.htmlText="<a target='_blank'>新 聞</a>";
    <mx:Label x="524" y="393" text="Hellollll" id="lblLink" rollOver="focusManager.deactivate()" color="blue" opaqueBackground="#ffffff"

     rollOut="focusManager.activate()" styleName="Label"

     creationComplete="link()"/>
    .Label{text-roll-over-color:red; text-decoration:underline; background-color:green; font-size:12px; text-selected-color:red;}

     

    //flex 轉向 URL

    Var url:URLRequest=new URLRequest(“http://www.google.cn”);

    navigateToURL(url,”_self”);//在本頁打開

    navigateToURL(url,”_blank”);//在新的一頁打開

     

    //彈出對話框
    ---------非模式打開---------

    PopUpManager.createPopUp(this,類(界面)的名稱);

    ---------模式打開---------

    var ep:Main=new Main ();

    PopUpManager.addPopUp(ep,this,true);//界面,打開窗口父類,是否模式

    PopUpManager.centerPopUp(ep);//在父類窗口居中

     

    //-----Alert的用法

    public function test():void

    {

    var glow:GlowFilter=new GlowFilter();

    glow.color=StyleManager.getColorName("blue");//邊框顏色

    glow.strength=5;

    glow.alpha=0.8;

    var alert:Alert=Alert.show("是否選擇","提示",Alert.YES|Alert.NO,this,alertHandle);

    alert.filters=[glow];

    }

    private function alertHandle(event:CloseEvent):void{

    if(event.detail==Alert.YES){

    lbl.text="是";

    }else{

    lbl.text="否";

    }

    }

     

    <mx:Button x="62" y="80" label="Button" click="test()"/>

    <mx:Label x="62" y="37" text="Label" width="65" id="lbl"/>

     

    //flex Combobox添加 –請選擇-

    private function loadCB(){

    var arr:Array=new Array("-請選擇-");

    for(var i:int=1;i<10;i++){

    arr[i]=i;

    }

    this.cb.dataProvider=arr;

    }

     

     

    //combobox 選擇的值和下標

    private function selected():void{

    Alert.show(cb.selectedItem.toString()+"下標:"+cb.selectedIndex);

    }

    <mx:ComboBox x="194" y="80" id="cb" creationComplete="loadCB()" change="selected()">

     

    //鼠標移動變大,Button加圖片,變手型

    <mx:Button x="72" y="80" label="Button" click="test()" mouseMove="changBig()" mouseOut="changSmall()" id="btn" height="52" icon="@Embed(source='img/3.jpg')"

     labelPlacement="bottom" width="67" useHandCursor="true" buttonMode="true"/>

     

    private function changBig():void{

    this.btn.scaleX=1.5;

    this.btn.scaleY=1.5

    }

    private function changSmall():void{

    this.btn.scaleX=1;

    this.btn.scaleY=1;

    }

     

    //flex panel 拖動效果

    <mx:Panel x="194" y="125" width="192" height="121" layout="absolute" id="panel" mouseDown="ondragStart(event)" mouseUp="ondragStop(event)">

    </mx:Panel>

    private function ondragStart(event:MouseEvent):void{

    Panel(event.target).startDrag();

    }

    private function ondragStop(event:MouseEvent):void{

    Panel(event.target).stopDrag();

    }

     

    //寫入共享數據

    share=SharedObject.getLocal("username");

    share.data.userName=txtUser.text;

    share.flush();

     

    //讀取共享數據

    var share:SharedObject=SharedObject.getLocal("username");

    Alert.show(share.data.userName);

     

     

     

     

     

     

     

    //jsp/html文件嵌入到flex中(需要把flexiframe.swc放在項目的flex_libs下)

     

    Application標簽內xmlns:code=http://code.google.com/p/flex-iframe/

     

    <mx:HDividedBox x="0" y="10" width="100%" height="500">

    <mx:Panel width="30%" height="500" layout="absolute">

     

    </mx:Panel>

    <mx:Panel width="70%" height="500" layout="absolute">

    <code:IFrame id="frm" source="file/萬年歷.html" height="100%" width="100%"/><!-這是最重要的-à

    </mx:Panel>

    </mx:HDividedBox>

     

    //檢查使用的操作系統

    private function checkOS():void{

    var os:String=Capabilities.os;

    tt.text="你的操作系統是:--"+os;

    }

     

    //檢查所使用的瀏覽器

    private function checkPlay():void{

    var play:String=Capabilities.playerType;

    Alert.show(play);

    if(play=="ActiveX"){

    tt.text="你的瀏覽器是--IE";

    }else if(play=="PlugIn"){

    tt.text="你的瀏覽器是--Mozilla-Firefox";

    }else{

    tt.text="你的瀏覽器是--其他";

    }

    }

     

    //檢查player的版本和使用的語言

    private function other():void{

    var v:String=Capabilities.version;

    var l:String=Capabilities.language;

    tt.text="你的flayer版本號:--"+v+

    "\r\n你的語言是:--"+l;

    }

     

    //改變鼠標樣式

    [Bindable]

    [Embed(source="img/157.jpg")]

    public var cur:Class;

    private function initCursor(event:Event){

    CursorManager.setCursor(cur);

    }


    //設置AdvancedDataGrid的表頭豎線為空

    headerSortSeparatorSkin="mx.skins.ProgrammaticSkin"

     

     


    //獲得鼠標坐標

    var cx:Number=CursorManager.currentCursorXOffset;

    var cy:Number=CursorManager.currentCursorYOffset;

    var id:int=CursorManager.currentCursorID;

    Alert.show("x:="+cx+"y:="+y+"id="+id);


    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xuhuanchao/archive/2009/10/31/4749241.aspx

    posted @ 2010-08-27 09:04 junlin 閱讀(592) | 評論 (0)編輯 收藏

    2010年8月19日

    Jar包沖突問題是在大型Java軟件開發中經常遇到的問題,系統開發人員經常會為解決類似的問題耗費大量的時間進行調試和測試,本文根據各種際情況,結合WebSphere中類加載器,討論了幾種解決jar包沖突問題的辦法,并給出了具體實現的步驟及源代碼。
    讀者定位為具有Java和WebSphere開發經驗的開發人員。
    讀者可以學習到在WebSphere中類加載器的定義以及解決jar包沖突問題的幾種辦法,并可以直接使用文章中提供的Java代碼,從而節省他們的開發和調試時間,提高效率。


            大型的基于WebSphere的項目開發中,同一個WebSphereApplicationServer(以下簡稱WAS)上會部署多個應用程序,而這多個應用程序必然會共用一些jar包,包括第三方提供的工具和項目內部的公共jar等。把這些共用的jar包提取出來在多個應用程序之間共享,不僅可以統一對這些jar包進行維護,同時也提高了WAS的性能。但是隨著應用的不斷擴大,新的應用程序的不斷增加,新的應用程序會希望使用一些更高版本的共享jar包,而由于系統運行維護的需要,老的應用程序仍然希望用老版本的共享jar包,這樣就必然造成了共享jar包的版本沖突。jar包版本沖突問題是在大型應用項目的開發中經常遇到的問題,本文試圖從WebSphere的類加載器入手,討論幾種在不同情況下解決jar包沖突問題的辦法。
    WebSphere中類加載器介紹
    Jar包沖突實際上是應用程序運行時不能找到真正所需要的類,而影響類的查找和加載的是JVM以及WebSphere中的類加載器(class loader),為此,我們首先介紹一下WebSphere中的類加載器以及一些相關的概念。
    WebSphere中類加載器層次結構
    Java應用程序運行時,在class執行和被訪問之前,它必須通過類加載器加載使之有效,類加載器是JVM代碼的一部分,負責在JVM虛擬機中查找和加載所有的Java 類和本地的lib庫。類加載器的不同配置影響到應用程序部署到應用程序服務器上運行時的行為。JVM和WebSphere應用程序服務器提供了多種不同的類加載器配置, 形成一個具有父子關系的分層結構。WebSphere中類加載器的層次結構圖1所示:

    圖1:WebSphere中類加載器的層次結構


    如上圖所示,WebSphere中類加載器被組織成一個自上而下的層次結構,最上層是系統的運行環境JVM,最下層是具體的應用程序,上下層之間形成父子關系。
    • JVM Class loader:位于整個層次結構的最上層,它是整個類加載器層次結構的根,因此它沒有父類加載器。這個類加載器負責加載JVM類, JVM 擴展類,以及定義在classpath 環境變量上的所有的Java類。
    • WebSphere Extensions Class loader:WebSphere 擴展類加載器, 它將加載WebSphere的一些runtime 類,資源適配器類等。
    • WebSphere lib/app Class loader:WebSphere服務器類加載器,它將加載WebSphere安裝目錄下$(WAS_HOME)/lib/app路徑上的類。 在WAS v4版本中,WAS使用這個路徑在所有的應用程序之間共享jar包。從WAS v5開始, 共享庫功能提供了一種更好的方式,因此,這個類加載器主要用于一些原有的系統的兼容。
    • WebSphere "server" Class loader:WebSphere應用服務器類加載器。 它定義在這個服務器上的所有的應用程序之間共享的類。WAS v5中有了共享庫的概念之后,可以為應用服務器定義多個與共享庫相關聯的類加載器,他們按照定義的先后順序形成父子關系。
    • Application Module Class Loader:應用程序類加載器,位于層次結構的最后一層,用于加載J2EE應用程序。根據應用程序的類加載策略的不同,還可以為Web模塊定義自己的類加載器。
    關于WebSphere的類加載器的層次結構,以下的幾點說明可能更有助于進一步的理解類的查找和加載過程:
    • 每個類加載器負責在自身定義的類路徑上進行查找和加載類。
    • 一個子類加載器能夠委托它的父類加載器查找和加載類,一個加載類的請求會從子類加載器發送到父類加載器,但是從來不會從父類加載器發送到子類加載器。
    • 一旦一個類被成功加載,JVM 會緩存這個類直至其生命周期結束,并把它和相應的類加載器關聯在一起,這意味著不同的類加載器可以加載相同名字的類。
    • 如果一個加載的類依賴于另一個或一些類,那么這些被依賴的類必須存在于這個類的類加載器查找路徑上,或者父類加載器查找路徑上。
    • 如果一個類加載器以及它所有的父類加載器都無法找到所需的類,系統就會拋出ClassNotFoundExecption異常或者NoClassDefFoundError的錯誤。
    類加載器的委托模式
    類加載器有一個重要的屬性:委托模式(Delegation Mode,有時也稱為加載方式:Classloader mode)。委托模式決定了類加載器在查找一個類的時候, 是先查找類加載器自身指定的類路徑還是先查找父類加載器上的類路徑。
    類加載器的委托模式有兩個取值:
    • Parent_First:在加載類的時候,在從類加載器自身的類路徑上查找加載類之前,首先嘗試在父類加載器的類路徑上查找和加載類。
    • Parent_Last:在加載類的時候,首先嘗試從自己的類路徑上查找加載類,在找不到的情況下,再嘗試父類加載器類路徑。
    有了委托模式的概念,我們可以更加靈活的配置在類加載器的層次結構中類的加載和查找方式。表1中給出了在WebSphere的類加載器層次結構中各個類加載器的委托模式的定義,并給出了不同的類加載器內類的生命周期。


    注意:在上表中,"JVM Class loader" 因為在類加載器的最頂層,它沒有父類加載器,因此其委托模式為N/A,"WebSphere Extensions Class loader"和"WebSphere lib/app Class loader"的委托模式固定為表中的取值,不可配置,其它的類加載器的委托模式都是可以配置的。
    WebSphere中的類加載器策略
    WebSphere中對類加載器有一些相關的配置,稱為類加載器策略(class loader policy)。類加載器策略指類加載器的獨立策略(class loader isolation policy),通過類加載器策略設置,我們可以為WAS和應用程序的類加載器進行獨立定義。
    每個WAS可以配置自己的應用程序類加載器策略,WAS中的每個應用程序也可以配置自己的Web模塊類加載器策略,下面我們對這兩種策略分別介紹。
    1.應用服務器(WAS)配置:應用程序類加載器策略
    應用服務器對應用程序類加載器策略有兩種配置:
    • Single:整個應用服務器上的所有應用程序使用同一個類加載器。在這種配置下,每個應用程序不再有自己的類加載器。
    • Multiple:應用服務器上的每個應用程序使用自己的類加載器。
    2.應用程序配置:Web模塊類加載器策略
    應用程序中對Web模塊類加載器有兩種配置:
    • Application:整個應用程序內的所有的實用程序jar包和Web模塊使用同一個類加載器。
    • Module:應用程序內的每個Web模塊使用自己的類加載器。應用程序的類加載器仍然存在,負責加載應用程序中Web模塊以外的其它類,包括所有的實用程序jar包。
    從上面的定義可以看出,不同的類加載器策略的配置下,類加載器的層次結構上的某些類加載器可能不存在。比如在應用程序服務器的應用程序類加載器策略定義為single的情況下,應用程序的類加載器將不存在,同一個應用服務器上的所有應用程序將共用同一個類加載器,這也就意味著不同的應用程序之間的類是共享的,應用程序間不能存在同名的類在WebSphere中解決jar包沖突
    Jar包沖突問題實際上就是應用程序希望用某一個確定版本的jar包中的類,但是類加載器卻找到并加載了另外一個版本的jar包中的類。在上一部分介紹了WebSphere中類加載器的基本概念和相關配置之后,我們來看如何在WebSphere中解決jar包沖突。
    在WAS v5版本之前,使用共享jar包的方式是將jar包放在$(WAS_HOME)/lib/app路徑下,從上一部分中,我們可以看到,這個路徑正是"WebSphere lib/app Class loader" 類加載器的類查找路徑,WebSphere會查找這個路徑以取得相應得jar包中的Java類,從而做到在WebSphere ND上的多個應用程序之間共享jar包的目的。但是這樣做的一個缺點就是這些共享jar包暴露給WebSphere ND上所有的應用程序,對于那些希望使用jar包其它版本的應用程序,這些jar包也同樣存在在了它們的類加載器類路徑上,因此,就不可避免的會造成版本的沖突。在WAS v5版本及之后,增加了共享庫(shared library)的概念,推薦的在多個應用程序間共享jar包并避免jar包沖突的方式是使用共享庫。
    具體分析引起jar包沖突的情況,主要有三種:
    • 多個應用程序間jar包沖突:多個應用程序間由于使用了共享jar包的不同版本而造成jar包版本沖突。
    • 應用程序中多個Web模塊間jar包沖突:同一個應用程序內部,不同的Web模塊間同時使用一個jar包的不同版本而造成jar包版本沖突。
    • 應用程序中同一個Web模塊內jar包沖突:同一個應用程序內部,同一個Web模塊內,由于需要同時使用同一個jar包的兩個版本而造成的jar包沖突
    本部分根據這三種jar包沖突的情況,討論三種解決jar包沖突的辦法,并具體討論三種解決辦法的實現步驟和適用情況:
    • 共享庫方式解決jar包沖突:主要解決應用程序間的jar包沖突問題
    • 打包到Web模塊中解決jar包沖突:主要解決應用程序中多個Web模塊間jar包沖突問題
    • 命令行運行方式解決jar包沖突:主要解決應用程序中同一個Web模塊內jar包沖突問題
    共享庫方式解決jar包沖突
    在WAS v5中,提供了一種很好的機制,使得jar包只存在于需要這個jar包的應用程序的類加載器的路徑上,而其它的應用程序不受它的任何影響,這就是共享庫(Shared library)。共享庫可以用在應用服務器級別和應用程序級別,使用應用程序級別的共享庫,其好處就是在不同的應用程序之間使用共享jar包的不同版本。我們可以為一些通用jar包的每個不同版本定義成不同的共享庫,應用程序希望使用哪個版本,就把這個版本的共享庫放到應用程序的類加載器的類路徑上,這種方式有效的解決了應用程序之間jar包沖突的問題。
    下面舉例介紹定義和使用共享庫的具體方法,本例中,假設存在xerces.jar包版本沖突。
    1. 定義共享庫
    系統管理員可以在WebSphere的Admin console中定義共享庫,可以分別在Cell、Node以及server的級別上定義。
    • 步驟一: 進入Admin console,選擇Environment > Shared Library > new。如圖2所示:



    圖2:WebSphere Admin Console中進入共享庫頁面

  • 步驟二: 給出共享庫的名字,并指定共享的文件和目錄。多個不同的文件/目錄之間通過"Enter"鍵分隔,且不能有路徑分隔符,如":"和";"等。如圖3所示:

    圖3:WebSphere Admin Console中添加共享庫
  • 步驟三:點擊Apply或者OK之后,就添加了一個名字為Xerces V2.0的共享庫。記住添加完成后一定要在admin console保存配置。如圖4所示:

    圖4:WebSphere Admin Console中共享庫列表
  • 2.安裝應用程序
    進入Admin console,選擇Applications > Install New Application 安裝應用程序。請參照IBMWebSphere的Admin console使用手冊進行安裝新的應用程序,此處不再詳細介紹。
    3.將共享庫關聯到應用程序

    • 步驟一:進入Admin console,選擇Applications >Enterpriseapplications ,并選擇需要使用共享庫的應用程序。注意:因為要改變應用程序的設置,所以如果應用程序已經運行,需要先停掉應用程序。如圖5所示:

      圖5:WebSphere Admin Console中選擇需要配置的應用程序
    • 步驟二: 點擊應用程序,進入后,選擇Libraries。如圖6所示:

      圖6:WebSphere Admin Console中選擇應用程序庫屬性
    • 步驟三: 點擊Add,為應用程序添加共享庫。如圖7所示:

      圖7:WebSphere Admin Console中應用程序添加庫
    • 步驟四: 從下拉列表中選擇所需要的共享庫,點擊OK。如圖8所示:

      圖8:WebSphere Admin Console中應用程序添加庫頁面指定所用的共享庫

    這樣,Xerces V2.0共享庫定義的xerces版本就存在于了應用程序類加載器的類加載路徑上。注意,在添加完成后要保存服務器的設置。
    4.設置應用程序的類加載器的委托模式為Parent_Last
    為了進一步防止共享庫定義的jar包的其它版本已經存在于JVM或者WebSphere的類加載器路徑上,還需要設置應用程序的類加載器的委托方式為Parent_Last。

    • 步驟一:進入Admin console,選擇Applications > Enterprise applications > ,選擇需要配置的應用程序。如圖9所示:

      圖9:WebSphere Admin Console中選擇需要配置的應用程序
    • 步驟二:點擊進入應用程序,設置類加載器的委托模式為Parent_Last。注意:在配置完成后,要保存配置,最后啟動應用程序。如圖10所示:

      圖10:WebSphere Admin Console中為應用程序設置類加載器委托模式

    通過上面的配置,即使xerces的其它版本已經存在于系統中,應用程序在運行時,其類加載器也會首先查找并加載指定的共享庫中的xerces版本。這樣我們就通過使用共享庫的方式,解決了jar包版本沖突問題。
    打包到Web模塊中解決jar包沖突
    共享庫的方式,只是在應用程序的層次上,在多個應用程序之間解決了共享jar包造成的版本沖突問題,如果一個應用程序的內部,其中一個Web模塊使用了一個jar包的A版本,而另一個Web模塊使用這個jar包的B版本,在這種情況下造成的jar包沖突,共享庫的方式是無法解決的,我們可以考慮將其中一個在多個應用程序間共享的jar包版本,比如A版本,定義成共享庫,或者放在"WebSphere lib/app Class loader"類加載器路徑上供多個應用程序使用,而將B版本的jar包打包到使用它的Web模塊中的方式來解決沖突。
    其次,目前很多在線的系統是WAS v4的遺留系統,其上運行的應用程序已經使用了"WebSphere lib/app Class loader"類加載器,將jar包放在$(WAS_HOME)/lib/app目錄下進行共享。如果由于其中某個應用程序的升級或者新增加某個應用程序,需要使用某個共享jar包的其它版本,在這種情況下,為了減少對系統的影響,也可以考慮將這個共享jar包的新版本打包到升級(或新增)的應用程序中的方式來解決jar包沖突。
    由于Web模塊的WebContent/WEB-INFO/lib目錄在應用程序Web模塊的類加載器查找路徑上,因此,我們可以把jar包放在這個目錄下,Web模塊的類加載器將自動查找并加載這個jar包中的類。

    • 步驟一:在WSAD IE集成開發環境中,將沖突jar包放在Web模塊的WebContent/WEB-INFO/lib目錄下。如圖11所示:


    • 圖11:WSAD IE中為Web模塊添加庫
    • 步驟二:在Admin console中,將應用程序部署到WebSphere server上之后,進入Applications > Enterprise Applications,選擇相應的應用程序,并確認應用程序不在運行狀態(參見前面章節中選擇應用程序的步驟)。點擊進入應用程序,確認應用程序的類加載器的委托模式為Parent_First,應用程序的類加載器策略為Module。如圖12所示:

      圖12:WebSphere Admin Console中應用程序屬性配置頁面
    • 步驟三:在同一個頁面上,選擇 Web Modules,點擊進入。如圖13所示:

      圖13:WebSphere Admin Console中選擇應用程序Web模塊屬性
    • 步驟四:點擊相應的包含沖突jar包的Web模塊,設置Web模塊的類加載器的委托模式為Parent_Last。注意:在設置完成后要保存服務器配置,并啟動應用程序。如圖14所示:
      圖14:WebSphere Admin Console中為Web模塊指定類加載器委托模式
    • 將沖突jar包打包到Web模塊中,并設置相應Web模塊的類加載器的委托模式為Parent_Last,應用程序在運行過程中加載類的時候,這個Web模塊的類加載器會首先查找 WebContent/WEB-INFO/lib目錄下的jar包進行類的加載;而對于其它的Web模塊,由于其類加載器的委托模式仍然為缺省的Parent_First,它們的類加載器仍然首先從應用程序的共享庫或者WebSphere的共享路徑上加載jar包中的類,從而解決了jar包沖突的問題。
      命令行運行方式解決jar包沖突
      不論是設置共享庫,還是將沖突jar包打包到應用程序中,其解決的問題都是在應用程序的一個Web模塊中只使用了沖突jar包的一個版本的情況。我們在開發中曾經遇到過這樣的情況:應用程序的Web模塊中已經使用了1.4版本的xerces.jar,由于Web功能的擴展,在這個模塊中又引入一個新的第三方工具,而這個第三方工具需要使用2.0版本的xerces.jar才能正常工作,這種情況下的jar包沖突如何解決呢?
      在前面類加載器的部分已經介紹過,每個應用程序的一個Web模塊最多只能有一個類加載器,而Web模塊的類加載器中加載的類的生命周期為整個應用程序的運行期,也就是說,Web模塊加載器不可能同時加載一個類的兩個版本,同時,Web模塊的類加載器的委托模式也是在應用程序運行前設置的,在應用程序運行期內無法改變的,因此,上面描述的在一個Web模塊中同時使用兩個版本的jar包的問題,象前兩種方法那樣配置運行在一個JVM內的類加載器的設置的方法是無法解決的。
      唯一的解決辦法就是在應用程序運行的JVM外,啟動另外一個JVM來運行調用沖突jar包的代碼,因為兩個不同的JVM可以加載各自的類,從而解決jar包沖突問題。
      這種情況下,原來使用jar包的老版本的方式(包括jar包放置路徑,共享庫設置方式,類加載器的委托模式等)不變,將對jar包新版本的調用通過命令行運行方式實現。具體做法是:將對jar包新版本內功能的調用,封裝到一個可以單獨運行的類中,在Web模塊中以命令行方式運行這個類。同時把這個類以及jar包的新版本放在任意一個was可訪問的路徑上(比如/usr/WebSphere),在命令行的classpath參數中包含這個路徑(比如/usr/WebSphere)。
      下面通過舉例說明命令行運行方式的編程過程,在本例中,假設TestEar應用程序的Web模塊TestWar中,已經使用了conflict_v1.jar,由于新添功能需要使用conflict_v2.jar中的exampleCall()功能。
      沖突jar包conflict_v2.jar提供的功能:

      代碼1:沖突jar包conflict_v2.jar功能
      Package com.ibm.conflict public class ConflictClass{    …….Public static String exampleCall(string param){    String rs;    ……;    Return rs;}……}

      不存在沖突問題時的編碼舉例:
      如果沒有jar包沖突問題,則對這個功能的調用是簡單的,只需要將conflict_v2.jar放在應用程序自身或者其父類加載器的查找路徑上,然后在Web模塊中直接調用即可,如下:

      代碼2:不存在沖突時的調用方式
      Public String methodA(String param){   ……   String rs = ConflictClass.exampleCall(param);   ……   Return rs;}

      存在沖突后的命令行運行方式編碼舉例
      針對jar包沖突問題,我們需要在Web模塊中做如下的修改:
      • 步驟一:將沖突jar包放在was可訪問的路徑上,比如/usr/WebSphere/conflict_v2.jar。
      • 步驟二:將對包含沖突代碼的調用封裝到一組可單獨運行的類中,它們將調用沖突jar包的功能,并將結果以系統輸出的方式打印到系統標準輸出上。 將這些類封裝到一個單獨的jar文件中,比如workAroundConflict.jar,并將其放在was可訪問的路徑上,比如/usr/WebSphere/workAroundConflict.jar。
        Package com.ibm.test;Import com.ibm.ConflictClassublic class WorkAround{Public static void main(String[] args){    String param1=args[0];    String returnStr=ConflictClass.exampleCall ();    System.out.println("<RTStr>"+returnStr+"</RTStr>");    Return;}}


        代碼3:將對沖突代碼的調用寫入一個單獨的類WorkAround
      • 步驟三:在Web模塊中通過命令行方式調用封裝的類,通過classpath指定所有依賴的jar包和類路徑。運行封裝類,從系統標準輸出中取得運行結果。
        Public static String methodA (String param){    ……    String rtStr = "";    String lStr="<RTStr>";    String rStr="<RTStr>";    //put all the dependency jar here    String classPath="/usr/WebSphere/conflict_v2.jar; /usr/WebSphere/workaroundConflict.jar;……";    String className="com.ibm.test.WorkAround";    String cmdLine="java -classpath " +classPath +" " +className + " "+ param;    Try{        Processprocess = Runtime.getRuntime().exec(cmdLine,null);        process.waitFor();        BufferedReader br= new BufferedReader(                  new InputStreamReader(process.getInputStream()));        while ((s = br.readLine())!=null) {            if (null == out)                ut=s;            else                out+=s;}//get result from outif (null != out){    int lIndex = out.lastIndexOf(lStr);    int rIndex = out.lastIndexOf(rStr);    rsStr = out.substring(lIndex+lStr.length, rIndex);}    } catch (Exception e){        e.printStackTrace();}…….return rsStr;}


        代碼4:在應用程序中通過命令行方式運行WorkAround
      命令行運行方式通過啟動另外一個JVM的方式運行沖突代碼,在一個不同的JVM中加載沖突的類,從而解決了jar包沖突問題。
      但是命令行運行方式畢竟不是一個很好的方式,它存在以下的弊端:
      • 命令行運行方式只適用于對沖突jar包的使用只是運行一段代碼,或者只要求返回簡單的字符串結果的情況。對于復雜的交互,命令行方式無法做到。但是如果在別無他法的情況下,可以適當地劃分封裝對沖突代碼調用的jar包的包含范圍,盡量將命令行運行的代碼接口簡單化。
      • 命令行運行方式因為啟動了另外一個JVM來運行,降低了WebSphere的性能。
      因此,命令行方式只適用于一些極為特殊的情況下解決jar包沖突問題。
      結論
      本文對基于WebSphere的大型項目開發中遇到的jar包沖突問題,結合WebSphere中類加載器的概念,給出了三種解決辦法以及相應的操作步驟和實現代碼,并分析了各種方式所適用的具體情況。
      項目開發過程中的jar包沖突,主要存在以下三種情況:
      • 多個應用程序間的jar包沖突
      • 應用程序內多個Web模塊間的jar包沖突
      • 應用程序內同一個Web模塊內部jar包沖突
      通過對類加載器的分析我們知道,解決jar包沖突問題的根本在于合理配置類加載器。在深入理解WebSphere中類加載器的層次結構的基礎上,我們給出了"共享庫解決jar包沖突"以及"打包到Web模塊中解決jar包沖突"的辦法,通過合理地配置WebSphere中類加載器及其委托模式,可以解決大多數的jar包沖突問題。但是由于這個層次結構中類加載器只配置到Web模塊,因此,對于Web模塊內部的jar包沖突問題,類加載器的配置是無法解決的,為此我們給出了"命令行運行方式解決jar包沖突"的辦法。
      表2中列出了在不同的WAS版本下,三種解決jar包沖突問題的辦法所適用的jar包沖突情況。

      表2:Jar包沖突解決辦法適用的jar包沖突情況總結

    posted @ 2010-08-19 16:42 junlin 閱讀(1363) | 評論 (0)編輯 收藏

    2010年8月17日

    上傳參數:httpservice封裝了 urlrequest
    上傳文件:所有上傳都是用POST  Content type為:multipart/form-data (如同html表單的設置一樣)

    var request:URLRequest=new URLRequest("http://localhost:8080/webproject12/servlet/upload");
    myFileRef.upload(request);

    可以加一個filter class  當提交成功時候 綁定一個變量到session
    filter過濾所有要訪問JSP生成XML的請求 如果session沒有這個變量  拒絕訪問(方式根據鏈接訪問JSP)
    提交文件用import flash.net.FileReference;

    MXML部分:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
    <mx:Script>
        <![CDATA[
        /**
        * 一個HttpService 與servlet通信的例子
        * 發送文件 和上傳表單  先文件上傳成功后繼續傳送表單
        * 發送文件的成功由事件監聽 
        * 發送表單后會返回由JSP生成的動態XML文件
        * */
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import flash.net.URLRequest;
        import flash.net.FileReference;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
     
       
            private var myFileRef:FileReference=null ;
            private var request:URLRequest=null;
            private function doFileBrowse():void{//點擊瀏覽文件選項
           
                       myFileRef = new FileReference();           
                    myFileRef.addEventListener(Event.SELECT,doSelect);
                    myFileRef.browse();   
            }
            private function doSelect(evt:Event):void{//為文件文本框賦值
                imageName.text=myFileRef.name.toString();
            }
            private function doUpForm():void{//點擊最后提交按鈕

                request=new URLRequest("http://localhost:8080/webproject12/servlet/upload");
                myFileRef.upload(request); //圖片文件的提交
                   myFileRef.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);//文件失敗上傳監聽事件
                myFileRef.addEventListener(Event.COMPLETE,doFileUploadComplete);//文件成功上傳監聽事件   
            }
            private function errorHandler(evt:IOErrorEvent):void{
                    trace("上傳失敗,檢查網絡");
            }
            private function doFileUploadComplete(evt:Event):void{
                    trace("文件上傳成功 繼續傳送表單");
                    up.send();//繼續提交文字表單
             
            }
           
            private function doResult(event:ResultEvent):void{
                trace(event.result);
            }
            private function doFault(event:FaultEvent):void{
                     trace("表單發送失敗");
            }
        ]]>
    </mx:Script>

        <mx:HTTPService id="up" url="http://localhost:8080/webproject12/flextest"
             result="doResult(event)" fault="doFault(event)"
              method="POST" resultFormat="xml" >
            <mx:request xmlns="">
            <username>
                {username.text}
            </username>
            <imageName>
                {imageName.text}
            </imageName>
            </mx:request>
        </mx:HTTPService>
        <mx:VBox height="100%" width="100%">
            <mx:Form>
                <mx:FormHeading label=" test load"/>
                <mx:FormItem label=" username:">
                    <mx:TextInput id="username"/>
                </mx:FormItem>
                <mx:FormItem label="Image Name" direction="horizontal">
                    <mx:TextInput id="imageName" editable="false"/>
                    <mx:Button click="doFileBrowse()" label="Browse"/>
                </mx:FormItem>
                <mx:FormItem>
                    <mx:Button label="提交" click="doUpForm()"/>
                </mx:FormItem>
            </mx:Form>
        </mx:VBox>   
    </mx:Application>

    servlet部分:
    upload。java   不需要回饋 文件接收器
    1.
    要設置好初始化參數  給與一個上傳附件的路徑
    通過:
    private ServletContext sc =config.getServletContext();
    sc.getRealPath("/");得到應用真是根目錄
    private String savePath = config.getInitParameter("savePath");// 保存文件夾

    sc.getRealPath("/")+savePath 是保存目錄

    2.
    用了COMMONS FILEUPLOAD組件 和commons IO 組件

    package org.zizi.servlet;

    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Iterator;
    import java.util.List;

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;

    public class UploadServelt extends HttpServlet {

        private static final long serialVersionUID = -850828778548588525L;
        private ServletContext sc;// application 上傳組件要用
        private String savePath;// 保存路徑

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doPost(request, response);

        }

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            // 開始組建的使用
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);

            try {
                List list = upload.parseRequest(request);// 解析傳過來的內容 返回LIST
                Iterator it = list.iterator();// 對LIST進行枚舉
                while (it.hasNext()) {
                    FileItem item = (FileItem) it.next();
                    // 判斷是文本信息還是對象(文件)
                    if (item.isFormField()) {
                        // 如果是文本信息返回TRUE
                        System.out.println("參數" + item.getFieldName() + ":"
                                + item.getString("UTF-8"));
                        // 注意輸出值的時候要注意加上編碼
                    } else {
                        if (item.getName() != null && !item.getName().equals("")) {
                            System.out.println("上傳文件的大小:" + item.getSize());
                            System.out.println("上傳文件的類型:" + item.getContentType());
                            System.out.println("上傳文件的名稱:" + item.getName());
                            System.out.println(sc.getRealPath("/") + savePath);
                            // 保存在服務器硬盤中
                            File tempFile = new File(item.getName());// 臨時FILE對象
                            // 此時有路徑的名字
                            // TEMPFILE主要為了獲取文件的單純文件名
                            File file = new File(sc.getRealPath("/") + savePath,
                                    "kdj"+(tempFile.getName()).substring((tempFile.getName()).length()-4,(tempFile.getName()).length()));
                            //在這里可以更改名字   
                            //用subString 的方法截取后綴 就可以加上自定義名稱放在第二個參數
                            // 這個FILE是真正要保存的文件
                            item.write(file);// 寫入服務器

                            // 返回結果
                            request.setAttribute("upload.message", "上傳成功");
                        } else {

                            request.setAttribute("upload.message", "沒有選擇上傳文件");
                        }
                    }
                }
            } catch (FileUploadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                request.setAttribute("upload.message", "上傳沒成功");
            }
           
            request.getRequestDispatcher("/uploadResult.jsp").forward(request, response);

        }

        public void init(ServletConfig config) {
    //實現初始化文件   獲取初始化參數 路徑   和獲取 一個全局服務器對象 備用
            savePath = config.getInitParameter("savePath");// 初始化綁定參數 表明保存在哪
            sc = config.getServletContext();

        }

    }

    接收表單的servlet:flextest。java
    package org.zizi.test;

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    public class FLEXTest extends HttpServlet {


        private static final long serialVersionUID = -154781975203117748L;

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

       
        }


        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

            response.setContentType("text/html;charset=utf-8");
            request.setCharacterEncoding("utf-8");
            String n=request.getParameter("username");
            String m=request.getParameter("imageName");
            request.setAttribute("pupload.message1", n);
            request.setAttribute("pupload.message2", m);
            request.getRequestDispatcher("/uploadResult2.jsp").forward(request, response);
    //FLEX會接收 這個轉向的JSP頁面動態生成的XML文件

        }

    }


    web。xml
      <servlet>
        <servlet-name>UploadServelt</servlet-name>
        <servlet-class>org.zizi.servlet.UploadServelt</servlet-class>
        <init-param>
        <param-name>savePath</param-name>
        <param-value>uploads</param-value>
        </init-param>
      </servlet>
      <servlet>
        <servlet-name>SendMailServlet</servlet-name>
        <servlet-class>org.zizi.sendMail.SendMailServlet</servlet-class>
      </servlet>

    uploadResult2.jsp
    <%@page language="java"  contentType="text/xml;charset=utf-8" pageEncoding="UTF-8"%><?xml version="1.0" encoding="utf-8"?>
    <cat>
        <dog name="${requestScope['pupload.message2']}">
        </dog>
        <dog name="${requestScope['pupload.message1']}">
        </dog>
    </cat>


    結果:
    servlet 輸出:
    參數Filename:安博之淚.jpg
    上傳文件的大小:124849
    上傳文件的類型:application/octet-stream
    上傳文件的名稱:安博之淚.jpg
    E:\tomcat6\webapps\webproject12\uploads
    參數Upload:Submit Query

    flex 輸出:
    [SWF] E:\workspaceforFlex\forwritingshop\bin-debug\test.swf - 926,895 bytes after decompression
    文件上傳成功 繼續傳送表單
    <cat><dog name="39254E3A-CC97-4FFE-8051-D152BF2A9E1F.jpg" /><dog name="zizi" /></cat>



    總結,完全可以全部傳送去一個SERVLET----UPLOAD,但是需要保存request的參數  可以建一個HashMap<String,String>(),然后保存參數。備以后存入數據庫使用。

    但是,需要調用兩次servlet。。。。因為Httpservice的contenttype沒有MULtiple/form-data。。。。??
    posted @ 2010-08-17 14:39 junlin 閱讀(3096) | 評論 (0)編輯 收藏

    2010年8月15日


    來自: http://www.hetao.name/flex-zhuan-lan/flexbaocunwenjianfilereferencesave
    這個方法是flash10新增的,詳細如下:

    save () 方法
    public function save(data:*, defaultFileName:String = null):void
    語言版本: ActionScript 3.0
    運行時版本: Flash Player 10, AIR 1.5

    打開一個對話框,允許用戶將文件保存到本地文件系統。雖然 Flash Player 沒有限制可上載、下載、加載或保存的文件的大小,但是播放器正式支持的文件大小最大為 100 MB。

    save() 方法首先打開一個操作系統對話框,讓用戶輸入文件名并在本地計算機上選擇用于保存文件的位置。當用戶選擇了位置并確認保存操作時(例如通過單擊“保存”),保存過程即會開始。偵聽器接收事件來指示保存操作的進度、成功或失敗。為了在調用 save() 后確定對話框和保存操作的狀態,ActionScript 代碼必須對 cancel、open、progress 和 complete 等事件進行偵聽。

    FileReference.upload()、FileReference.download()、FileReference.load() 和 FileReference.save() 函數均不分塊。這些函數在調用之后即返回,而不會等待文件傳輸完成。此外,如果 FileReference 對象離開作用域,則該對象中尚未完成的任何事務將在離開作用域時被取消。只要希望上載、下載、加載或保存能繼續,就應確保將 FileReference 對象保留在作用域中。

    在成功保存文件之后,將使用本地文件的屬性填充 FileReference 對象的屬性。如果保存成功,將調度 complete 事件。

    每次只能執行一個 browse() 或 save() 會話(因為每次只能調用一個對話框)。

    在 Flash Player 中,只有在響應用戶事件(例如,在鼠標單擊或按鍵事件的事件處理函數中)時才能成功調用此方法。否則,調用此方法將導致 Flash Player 引發 Error 異常。此限制不適用于應用程序沙箱中的 AIR 內容。

    參數

    data:* — 要保存的數據。數據可以采用幾種格式之一,并將進行適當處理:

        * 如果值為 null,則應用程序將引發 ArgumentError 異常。
        * 如果值為 String,則將其保存為 UTF-8 文本文件。
        * 如果值為 XML,則會以 XML 格式將其寫入到文本文件,并保留所有格式設置。
        * 如果值為 ByteArray 對象,則會將其逐字寫入到數據文件。
        * 如果值并非以上任何一種,則 save() 方法將調用對象的 toString() 方法,將數據轉換為字符串,然后將數據保存為文本文件。如果該操作失敗,則應用程序將引發 ArgumentError 異常。



    defaultFileName:String (default = null) — 對話框中顯示的要保存文件的默認文件名。此字符串不能包含以下字符:/ \ : * ? " < > | %

    如果 File 對象調用此方法,則文件名將為 File 對象所引用文件的名稱。(AIR File 類擴展了 FileReference 類。)

    事件

    open:Event — 當下載操作開始時調度。


    progress:ProgressEvent — 在文件下載操作期間進行定期調度。


    complete:Event — 當文件下載操作成功完成時調度。


    cancel:Event — 當用戶取消對話框時調度。


    select:Event — 當用戶從對話框中選擇要下載的文件時調度。


    ioError:IOErrorEvent — 讀取或傳輸文件期間發生輸入/輸出錯誤時調度。

    引發

    IllegalOperationError — 在以下情況下引發:1) 另一個瀏覽會話正在進行中;每次僅能執行一個文件瀏覽會話。2) 要下載的文件的名稱中包含禁止使用的字符。3) 用戶 mms.cfg 文件中的某個設置禁止此操作。


    ArgumentError — 如果 data 的類型不是 ByteArray,并且不具有 toString() 方法,則將引發異常。如果 data 的類型不是 XML,并且不具有 toXMLString() 方法,則將引發異常。


    Error — 為了響應用戶動作(如鼠標事件或按鍵事件),將不會調用此方法。


    MemoryError — 如果 Flash Player 無法為該文件分配內存,則可能會發生此錯誤。文件可能太大,或者可用的內存可能太小。
    http://help.adobe.com/zh_CN/AS3LCR/Flash_10.0/flash/net/FileReferenceList.html#browse%28%29

    轉載地址 ;http://hbing110.javaeye.com/blog/423953
    posted @ 2010-08-15 21:48 junlin 閱讀(1396) | 評論 (0)編輯 收藏
    僅列出標題  下一頁

    導航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 午夜不卡久久精品无码免费 | 久久久久亚洲av无码专区喷水| 国产精品亚洲а∨天堂2021| 啦啦啦高清视频在线观看免费| 亚洲人成在线精品| 一本无码人妻在中文字幕免费| 亚洲中文无码av永久| 大学生一级毛片免费看| 日韩亚洲产在线观看| 在线中文高清资源免费观看| 国产精品亚洲lv粉色| 亚洲精品乱码久久久久久中文字幕 | 手机看片久久国产免费| 亚洲色偷精品一区二区三区| 成人免费视频88| 特级毛片全部免费播放a一级| 亚洲婷婷国产精品电影人久久| a级毛片免费完整视频| 亚洲成a人片77777老司机| 我们的2018在线观看免费高清| 亚洲性色AV日韩在线观看| 国产一区二区三区免费视频| 国产精品偷伦视频免费观看了| 图图资源网亚洲综合网站| 114一级毛片免费| 美女露隐私全部免费直播| 国产亚洲大尺度无码无码专线| 免费无码又爽又刺激高潮视频| 亚洲国产成人精品无码一区二区| 成人超污免费网站在线看| 乱淫片免费影院观看| 亚洲男人天堂av| 免费黄色app网站| 精品97国产免费人成视频| 亚洲精品美女在线观看播放| 在线看片无码永久免费aⅴ| 国产成人精品免费大全| 亚洲日本国产精华液| mm1313亚洲精品国产| 91精品成人免费国产片| 男女作爱免费网站|