解決方法一:用“注銷”方式退出遠程桌面,而不是直接關閉窗口;
解決方法二:踢出已經斷開的連接用戶;
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
介紹:
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()就可以將類名轉換成類應用。
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" >
一,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
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
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中類加載器的層次結構
圖2:WebSphere Admin Console中進入共享庫頁面
2.安裝應用程序
進入Admin console,選擇Applications > Install New Application 安裝應用程序。請參照IBMWebSphere的Admin console使用手冊進行安裝新的應用程序,此處不再詳細介紹。
3.將共享庫關聯到應用程序
這樣,Xerces V2.0共享庫定義的xerces版本就存在于了應用程序類加載器的類加載路徑上。注意,在添加完成后要保存服務器的設置。
4.設置應用程序的類加載器的委托模式為Parent_Last
為了進一步防止共享庫定義的jar包的其它版本已經存在于JVM或者WebSphere的類加載器路徑上,還需要設置應用程序的類加載器的委托方式為Parent_Last。
通過上面的配置,即使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包中的類。
Package com.ibm.conflict public class ConflictClass{ …….Public static String exampleCall(string param){ String rs; ……; Return rs;}……} |
Public String methodA(String param){ …… String rs = ConflictClass.exampleCall(param); …… Return rs;} |
Package com.ibm.test;Import com.ibm.ConflictClass![]() |
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;} |