設計支持多os的ssl-vpn客戶端(二)——java和js的通信
Tomqq 5/12/2008
Applet和js的通信有幾種不同的方案可以選擇,在這裡我選擇使用netscape.javascript.JSObject對象來進行。
舉例如下:
a) java調用js
首先再applet裡面引入包import netscape.javascript.JSObject;
然後申明一個win對象:
public static JSObject win;
在init函數裡面進行初始化,win = JSObject.getWindow(this);
這樣子就可以了,如果需要執行js函數(比如alert()),採用如下這種方式調用:
Client.win.eval("alert(\』hi,tomqq\』)");
看起來還是蠻簡單的嘛,不過經過測試我發現,在連續刷新頁面的情況下,如果每次都重新載入win對象,再firefox下會有載入失敗的情況發生。在這個時候,我們可以用兩個辦法解決,一個是採用限制刷新的代碼(php),
session_start();
$allow_sep = "3";
if (isset($_SESSION["post_sep"])) {
if (time() - $_SESSION["post_sep"] < $allow_sep) {
exit("Please refresh after 3 seconds.");
} else {
$_SESSION["post_sep"] = time();
}
} else {
$_SESSION["post_sep"] = time();
}
另一個是把win對象作為虛擬機靜態變數,僅僅在頁面載入的時候載入,刷新的時候不載入,就可以很好的解決這個問題。
b) js調用java
在這裡,首先要對載入的applet進行申明,如下:
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">";
echo "<div align=\"center\">";
echo "<applet ";
echo "codebase = \"download/\"";
echo "code = \"multios.applet.Client\" ";
echo "archive = \"multios.jar,AuthKit.jar\" ";
echo "name = \"client\" ";
echo "width = \"0\" ";
echo "height = \"0\" ";
echo "hspace = \"0\" ";
echo "vspace = \"0\" ";
echo "align = \"middle\" ";
echo "mayscript =\"\" ";
echo "> ";
echo "</applet> ";
即載入一個0象素大小的applet,這個applet在頁面不可見,不影響布局。另外注意的就是需要給這個applet對象起一個js能認識的名字,即:
echo "name = \"client\" ";這句話很重要。
Js調用applet的時候,可以這樣子:
window.document.client.SStart.method(),直接跟client的java方法名和參數即可。
值得注意的是,js和applet通信,涉及到頁面對於不同組件載入的問題,即:如果applet載入啟動並開始調用js,而js函數還沒有被頁面載入完成,這怎麼辦?使用firedebug或者safari的html調試器查看可以看見各個元素的載入時序圖,在這裡,一般將js放在html頁面前面,而把applet放在頁面的最後,即可解決這個問題。
另外,某些通信操作可能會造成瀏覽器,如firefox的崩潰,具體原因分析為瀏覽器對jre支持引起的,這個問題解決,但是可以根據實際情況繞過。
最後還有一個問題就是安全性問題,js調用的applet方法如果使用了受限的本地操作怎麼辦?這個問題在後一章會專門討論。
+=+=+=+=
tomqq.cublog.cn
[ 本帖最後由 tomqq 於 2008-5-23 13:05 編輯 ]
[火星人
]
設計支持多os的ssl-vpn客戶端(二)——java和js的通信已經有736次圍觀
http://coctec.com/docs/service/show-post-30327.html