一直想來涂些東西,越來越感覺自己好多好多東西都不懂,懂的東西又好膚淺!慚愧!慚愧!
? 這兒涂些關于applet的東西。時間不多,希望涂完后還可以休息下,開始吧:
首先自己做一個applet,然后打成JAR包(在Eclipse中可以用fatjar這個插件來完成)這里涉及到給applet簽名:
如何給applet簽名(參考):
沒有經過數字簽名的Applet在默認情況下沒有寫本地文件的權限。那么讓我們準備簽名代碼吧。
首先用keytool命令產生用來簽名的key。下面這個命令產生一個叫"mykey"的key,它存儲在我們新建的叫"mystore"的keystore中。
keytool -genkey -alias mykey -keystore mystore
接下來它會問一些問題包括keystore的密碼,key的密碼等,如下所示:
輸入keystore密碼:? storepass
您的名字與姓氏是什么?
? [Unknown]:? AYellow
您的組織單位名稱是什么?
? [Unknown]:? 我的組織單位
您的組織名稱是什么?
? [Unknown]:? 我的組織
您所在的城市或區域名稱是什么?
? [Unknown]:? 北京
您所在的州或省份名稱是什么?
? [Unknown]:? 北京
該單位的兩字母國家代碼是什么
? [Unknown]:? CN
CN=AYellow, OU=我的組織單位, O=我的組織, L=北京, ST=北京, C=CN 正確嗎?
? [否]:? Y
輸入<mykey>的主密碼
??????? (如果和 keystore 密碼相同,按回車):? keypass
完成后會在當前目錄下生成一個叫mystore的文件,這個文件包含了我們的key。用jarsigner命令簽名我們的代碼test.jar(需要輸入keystore和key的密碼):
再次運行Applet,在Applet加載的時候會出現一個對話框,說該Applet由不可信任的發行者簽名并宣稱代碼是安全的,是不是要對Applet授權。選擇"授權于會話",然后點擊我們的按鈕,看看是不是成功的創建了文件?
輔助:寫一個CLASS,通過其可在applet中調用JSP中的JS代碼
可以看到其中主要用到了netscape.javascript.JSObject這個object(<%=jdk_home%>\jre\lib\plugin.jar(jdk1.5)),它允許 Java 代碼訪問 JavaScript 方法和屬性
主要通過反射用到了JsObject的getWindow與evel二個方法來完成此類
JSObject主要方法如下:
可想而知,用CallJS就如下所示了:
如何通過APPLET與Servlet通信,這個很簡單了。因為applet本來就是一個jar包了。不過,將欲傳輸的對象序列化到流里面(較大些的,
如持久化對象),也可以放到一個請求(request)中(相對較小的字符串等)。如下所示:
應用的時候可以如下:
這兒第二個參數放了一個LIST,可以根據具體情況使用。只是到了Servet端的servlet獲取的時候做相應的處理就OK了(馬上可以看到)。
這樣applet就把數據傳輸到url的servlet中去了。
servlet中發生了些什么呢?
?????????? ?
呵呵,放在request中的數據request.getHeader取了出來,流中的數據也取了出來。
最后要想往applet中返回結果,則同樣做如下處理即可:
? OK, 差不多啦!序列化也要注意些問題,如對象類型,前后順序。
小結:通過以上,可以實現如下功能:
1:將做好的APPLET打成JAR包后,通過簽名可以將其工嵌入到JSP中運行。
2: 就可以實現在applet中調用JSP中JS,對程序做出相應的處理。
3: 數據在applet與servelt通信。
? 最后我們就可以在JSP Applet與Servlet三者之間就以放心地跑了。
做項目過程看到的好的代碼丟了還真舍不得!寫得比較急,可能有蠻多的地方連語句都不通。敬請諒解!
???
??? 近來加班狂多(現在天都已經亮了,相信也有不少同仁跟我一樣),又不能上網!都好幾個月沒更新了。挺想念這兒的,真的!愿與君共勉!
? 這兒涂些關于applet的東西。時間不多,希望涂完后還可以休息下,開始吧:
首先自己做一個applet,然后打成JAR包(在Eclipse中可以用fatjar這個插件來完成)這里涉及到給applet簽名:
如何給applet簽名(參考):
沒有經過數字簽名的Applet在默認情況下沒有寫本地文件的權限。那么讓我們準備簽名代碼吧。
首先用keytool命令產生用來簽名的key。下面這個命令產生一個叫"mykey"的key,它存儲在我們新建的叫"mystore"的keystore中。
keytool -genkey -alias mykey -keystore mystore
接下來它會問一些問題包括keystore的密碼,key的密碼等,如下所示:
輸入keystore密碼:? storepass
您的名字與姓氏是什么?
? [Unknown]:? AYellow
您的組織單位名稱是什么?
? [Unknown]:? 我的組織單位
您的組織名稱是什么?
? [Unknown]:? 我的組織
您所在的城市或區域名稱是什么?
? [Unknown]:? 北京
您所在的州或省份名稱是什么?
? [Unknown]:? 北京
該單位的兩字母國家代碼是什么
? [Unknown]:? CN
CN=AYellow, OU=我的組織單位, O=我的組織, L=北京, ST=北京, C=CN 正確嗎?
? [否]:? Y
輸入<mykey>的主密碼
??????? (如果和 keystore 密碼相同,按回車):? keypass
完成后會在當前目錄下生成一個叫mystore的文件,這個文件包含了我們的key。用jarsigner命令簽名我們的代碼test.jar(需要輸入keystore和key的密碼):
jarsigner?
-
keystore?mystore?myJarName.jar?mykey
Enter?Passphrase? for ?keystore:?storepass
Enter?key?password? for ?mykey:?keypass
Enter?Passphrase? for ?keystore:?storepass
Enter?key?password? for ?mykey:?keypass
再次運行Applet,在Applet加載的時候會出現一個對話框,說該Applet由不可信任的發行者簽名并宣稱代碼是安全的,是不是要對Applet授權。選擇"授權于會話",然后點擊我們的按鈕,看看是不是成功的創建了文件?
輔助:寫一個CLASS,通過其可在applet中調用JSP中的JS代碼
public
?
class
?CallJavascript?{
???? public ?CallJavascript()?{
????}
???? /**
?????*
?????*? @param ?ob?Object?這是一個applet對象
?????*? @param ?str?String
????? */
???? public ?String?callJs(Object?ob,?String?str)?{
????????String?jscmd? = ?str;
????????System.out.println( " javasriptL " ? + ?str);
????????String?jsresult? = ? null ;
???????? boolean ?success? = ? false ;
???????? try ?{
????????????Method?getw? = ? null ,?eval? = ? null ;
????????????Object?jswin? = ? null ;
????????????Class?c? = ?Class.forName( " netscape.javascript.JSObject " );
???????????? /* ?does?it?in?IE?too? */
????????????Method?ms[]? = ?c.getMethods();
???????????? for ?( int ?i? = ? 0 ;?i? < ?ms.length;?i ++ )?{
???????????????? if ?(ms[i].getName().compareTo( " getWindow " )? == ? 0 )
????????????????????getw? = ?ms[i];
???????????????? else ? if ?(ms[i].getName().compareTo( " eval " )? == ? 0 )
????????????????????eval? = ?ms[i];
????????????}
????????????Object?a[]? = ? new ?Object[ 1 ];
????????????a[ 0 ]? = ?ob;? /* ?this?is?the?applet? */
????????????jswin? = ?getw.invoke(c,?a);? /* ?this?yields?the?JSObject? */
????????????a[ 0 ]? = ?jscmd;
????????????Object?result? = ?eval.invoke(jswin,?a);
???????????? if (result != null ){
???????????????? if ?(result? instanceof ?String){
????????????????????jsresult? = ?(String)?result;
????????????????} else {
????????????????????jsresult? = ?result.toString();
????????????????}
????????????}
????????????
????????????success? = ? true ;
????????} catch ?(InvocationTargetException?ite)?{
????????????ite.printStackTrace();
????????????jsresult? = ? "" ? + ?ite.getTargetException();
????????}? catch ?(Exception?ex)?{
????????????ex.printStackTrace();
????????????jsresult? = ? "" ? + ?ex;
????????}
???????? if ?(success){
????????????System.out.println( " eval?succeeded,?result?is? " ? + ?jsresult);
????????} else {
????????????System.out.println( " eval?failed?with?error? " ? + ?jsresult);
????????}
???????? return ?jsresult;
????}
}
???? public ?CallJavascript()?{
????}
???? /**
?????*
?????*? @param ?ob?Object?這是一個applet對象
?????*? @param ?str?String
????? */
???? public ?String?callJs(Object?ob,?String?str)?{
????????String?jscmd? = ?str;
????????System.out.println( " javasriptL " ? + ?str);
????????String?jsresult? = ? null ;
???????? boolean ?success? = ? false ;
???????? try ?{
????????????Method?getw? = ? null ,?eval? = ? null ;
????????????Object?jswin? = ? null ;
????????????Class?c? = ?Class.forName( " netscape.javascript.JSObject " );
???????????? /* ?does?it?in?IE?too? */
????????????Method?ms[]? = ?c.getMethods();
???????????? for ?( int ?i? = ? 0 ;?i? < ?ms.length;?i ++ )?{
???????????????? if ?(ms[i].getName().compareTo( " getWindow " )? == ? 0 )
????????????????????getw? = ?ms[i];
???????????????? else ? if ?(ms[i].getName().compareTo( " eval " )? == ? 0 )
????????????????????eval? = ?ms[i];
????????????}
????????????Object?a[]? = ? new ?Object[ 1 ];
????????????a[ 0 ]? = ?ob;? /* ?this?is?the?applet? */
????????????jswin? = ?getw.invoke(c,?a);? /* ?this?yields?the?JSObject? */
????????????a[ 0 ]? = ?jscmd;
????????????Object?result? = ?eval.invoke(jswin,?a);
???????????? if (result != null ){
???????????????? if ?(result? instanceof ?String){
????????????????????jsresult? = ?(String)?result;
????????????????} else {
????????????????????jsresult? = ?result.toString();
????????????????}
????????????}
????????????
????????????success? = ? true ;
????????} catch ?(InvocationTargetException?ite)?{
????????????ite.printStackTrace();
????????????jsresult? = ? "" ? + ?ite.getTargetException();
????????}? catch ?(Exception?ex)?{
????????????ex.printStackTrace();
????????????jsresult? = ? "" ? + ?ex;
????????}
???????? if ?(success){
????????????System.out.println( " eval?succeeded,?result?is? " ? + ?jsresult);
????????} else {
????????????System.out.println( " eval?failed?with?error? " ? + ?jsresult);
????????}
???????? return ?jsresult;
????}
}
可以看到其中主要用到了netscape.javascript.JSObject這個object(<%=jdk_home%>\jre\lib\plugin.jar(jdk1.5)),它允許 Java 代碼訪問 JavaScript 方法和屬性
主要通過反射用到了JsObject的getWindow與evel二個方法來完成此類
JSObject主要方法如下:
Method?????????描述
call???????????????Calls?a?JavaScript?方法
eval??????????????Evaluates?a?JavaScript?expression
getMember?????????Retrieves?a?named?member?of?a?JavaScript?object
getSlot??????????Retrieves?an?indexed?member?of?a?JavaScript?object
removeMember????Removes?a?named?member?of?a?JavaScript?object
setMember??????????Sets?a?named?member?of?a?JavaScript?object
setSlot??????????Sets?an?indexed?member?of?a?JavaScript?object
toString??????????Converts?a?JSObject?to?a?string
call???????????????Calls?a?JavaScript?方法
eval??????????????Evaluates?a?JavaScript?expression
getMember?????????Retrieves?a?named?member?of?a?JavaScript?object
getSlot??????????Retrieves?an?indexed?member?of?a?JavaScript?object
removeMember????Removes?a?named?member?of?a?JavaScript?object
setMember??????????Sets?a?named?member?of?a?JavaScript?object
setSlot??????????Sets?an?indexed?member?of?a?JavaScript?object
toString??????????Converts?a?JSObject?to?a?string
可想而知,用CallJS就如下所示了:
CallJavascript?calljs?
=
?
new
?CallJavascript();
String?type? = ?calljs.callJs( this ,? " document.pmMstForm.type.value; " );
or
calljs.callJs( this ,? " waiting() " );
String?type? = ?calljs.callJs( this ,? " document.pmMstForm.type.value; " );
or
calljs.callJs( this ,? " waiting() " );
如何通過APPLET與Servlet通信,這個很簡單了。因為applet本來就是一個jar包了。不過,將欲傳輸的對象序列化到流里面(較大些的,
如持久化對象),也可以放到一個請求(request)中(相對較小的字符串等)。如下所示:
import
?java.net.URL;
import ?java.net.URLConnection;
import ?java.io.ObjectInputStream;
import ?java.io.IOException;
import ?java.util.Map;
import ?java.io.ObjectOutputStream;
import ?java.util.List;
import ?java.util.Iterator;
/**
?*
?*?<p>Title:</p>
?*
?*?<p>Description:?</p>
?*
?*?<p>Copyright:?Copyright?(c)?2006</p>
?*
?*?<p>Company:?</p>
?*
?*? @author ?not?attributable
?*? @version ?1.0
? */
public ? class ?DataTransferUtil?{
???? public ?DataTransferUtil()?{
????}
???? public ? static ?Map?getData(Map?paraMap,?List?list,?URL?strURL)?{
????????URL?url? = ? null ;
????????URLConnection?urlcon? = ? null ;
????????ObjectInputStream?ois? = ? null ;
????????ObjectOutputStream?oos? = ? null ;
???????? try ?{
????????????url? = ?strURL;
????????????urlcon? = ?url.openConnection();
????????????Iterator?iter? = ?paraMap.keySet().iterator();
???????????? while ?(iter.hasNext())?{
????????????????String?key? = ?(String)?iter.next();
????????????????urlcon.addRequestProperty(key,?(String)?paraMap.get(key));
????????????}
????????????urlcon.setUseCaches( false );
????????????urlcon.setDoInput( true );
????????????urlcon.setDoOutput( true );
????????????urlcon.setRequestProperty( " Content-type " ,? " application/octest-stream " );
????????????oos? = ? new ?ObjectOutputStream(urlcon.getOutputStream());
????????????oos.writeObject(list);
???????????? if ?(oos? != ? null )?{
????????????????oos.flush();
????????????????oos.close();
????????????}
????????????ois? = ? new ?ObjectInputStream(urlcon.getInputStream()); // 開始取得servlet中返回的數據
????????????Map?mapRtn? = ?(Map)?ois.readObject();
???????????? return ?mapRtn;
????????}? catch ?(IOException?ioe)?{
????????????ioe.printStackTrace();
???????????? return ? null ;
????????}? catch ?(ClassNotFoundException?cnfe)?{
????????????cnfe.printStackTrace();
???????????? return ? null ;
????????}? finally ?{
???????????? try ?{
???????????????? if ?(ois? != ? null )?{
????????????????????ois.close();
????????????????}
????????????}? catch ?(IOException?ioe)?{
????????????????ioe.printStackTrace();
????????????}
????????}
????}
}
import ?java.net.URLConnection;
import ?java.io.ObjectInputStream;
import ?java.io.IOException;
import ?java.util.Map;
import ?java.io.ObjectOutputStream;
import ?java.util.List;
import ?java.util.Iterator;
/**
?*
?*?<p>Title:</p>
?*
?*?<p>Description:?</p>
?*
?*?<p>Copyright:?Copyright?(c)?2006</p>
?*
?*?<p>Company:?</p>
?*
?*? @author ?not?attributable
?*? @version ?1.0
? */
public ? class ?DataTransferUtil?{
???? public ?DataTransferUtil()?{
????}
???? public ? static ?Map?getData(Map?paraMap,?List?list,?URL?strURL)?{
????????URL?url? = ? null ;
????????URLConnection?urlcon? = ? null ;
????????ObjectInputStream?ois? = ? null ;
????????ObjectOutputStream?oos? = ? null ;
???????? try ?{
????????????url? = ?strURL;
????????????urlcon? = ?url.openConnection();
????????????Iterator?iter? = ?paraMap.keySet().iterator();
???????????? while ?(iter.hasNext())?{
????????????????String?key? = ?(String)?iter.next();
????????????????urlcon.addRequestProperty(key,?(String)?paraMap.get(key));
????????????}
????????????urlcon.setUseCaches( false );
????????????urlcon.setDoInput( true );
????????????urlcon.setDoOutput( true );
????????????urlcon.setRequestProperty( " Content-type " ,? " application/octest-stream " );
????????????oos? = ? new ?ObjectOutputStream(urlcon.getOutputStream());
????????????oos.writeObject(list);
???????????? if ?(oos? != ? null )?{
????????????????oos.flush();
????????????????oos.close();
????????????}
????????????ois? = ? new ?ObjectInputStream(urlcon.getInputStream()); // 開始取得servlet中返回的數據
????????????Map?mapRtn? = ?(Map)?ois.readObject();
???????????? return ?mapRtn;
????????}? catch ?(IOException?ioe)?{
????????????ioe.printStackTrace();
???????????? return ? null ;
????????}? catch ?(ClassNotFoundException?cnfe)?{
????????????cnfe.printStackTrace();
???????????? return ? null ;
????????}? finally ?{
???????????? try ?{
???????????????? if ?(ois? != ? null )?{
????????????????????ois.close();
????????????????}
????????????}? catch ?(IOException?ioe)?{
????????????????ioe.printStackTrace();
????????????}
????????}
????}
}
應用的時候可以如下:
DataTransferUtil?util
=
new
?DataTransferUtil();
Map?paraMap = new ?HashMap();
paraMap.put( " method " , " import " );
Map?map = util.getData(paraMap,list,url); // 取得servlet返回的數據(經過封裝)
Map?paraMap = new ?HashMap();
paraMap.put( " method " , " import " );
Map?map = util.getData(paraMap,list,url); // 取得servlet返回的數據(經過封裝)
這兒第二個參數放了一個LIST,可以根據具體情況使用。只是到了Servet端的servlet獲取的時候做相應的處理就OK了(馬上可以看到)。
這樣applet就把數據傳輸到url的servlet中去了。
servlet中發生了些什么呢?
response.setContentType(
"
application/octest-stream
"
);
???????? // req.setCharacterEncoding("gb2312");
????????log.debug( " is?handlRequest
.
"
);
???????? // 準備傳輸數據
????????ObjectOutputStream?oos? = ? null ;
????????ObjectInputStream?ois? = ? null ;
????????Map?rtnMap? = ? new ?HashMap();
???????? // 執行方法
???????? try ?{
????????????String?method? = ?(String)request.getHeader( " method " );
????????????ois? = ? new ?ObjectInputStream( new ?BufferedInputStream(request.getInputStream()));
????????????

.
???????? // req.setCharacterEncoding("gb2312");
????????log.debug( " is?handlRequest

???????? // 準備傳輸數據
????????ObjectOutputStream?oos? = ? null ;
????????ObjectInputStream?ois? = ? null ;
????????Map?rtnMap? = ? new ?HashMap();
???????? // 執行方法
???????? try ?{
????????????String?method? = ?(String)request.getHeader( " method " );
????????????ois? = ? new ?ObjectInputStream( new ?BufferedInputStream(request.getInputStream()));
????????????



?????????? ?
呵呵,放在request中的數據request.getHeader取了出來,流中的數據也取了出來。
最后要想往applet中返回結果,則同樣做如下處理即可:
oos?
=
?
new
?ObjectOutputStream(response.getOutputStream());
oos.writeObject(rtnMap);???
? oos.writeObject(rtnMap);???
? OK, 差不多啦!序列化也要注意些問題,如對象類型,前后順序。
小結:通過以上,可以實現如下功能:
1:將做好的APPLET打成JAR包后,通過簽名可以將其工嵌入到JSP中運行。
2: 就可以實現在applet中調用JSP中JS,對程序做出相應的處理。
3: 數據在applet與servelt通信。
? 最后我們就可以在JSP Applet與Servlet三者之間就以放心地跑了。
做項目過程看到的好的代碼丟了還真舍不得!寫得比較急,可能有蠻多的地方連語句都不通。敬請諒解!
???
??? 近來加班狂多(現在天都已經亮了,相信也有不少同仁跟我一樣),又不能上網!都好幾個月沒更新了。挺想念這兒的,真的!愿與君共勉!