一直想來涂些東西,越來越感覺自己好多好多東西都不懂,懂的東西又好膚淺!慚愧!慚愧!
? 這兒涂些關(guān)于applet的東西。時(shí)間不多,希望涂完后還可以休息下,開始吧:
首先自己做一個(gè)applet,然后打成JAR包(在Eclipse中可以用fatjar這個(gè)插件來完成)這里涉及到給applet簽名:
如何給applet簽名(參考):
沒有經(jīng)過數(shù)字簽名的Applet在默認(rèn)情況下沒有寫本地文件的權(quán)限。那么讓我們準(zhǔn)備簽名代碼吧。
首先用keytool命令產(chǎn)生用來簽名的key。下面這個(gè)命令產(chǎn)生一個(gè)叫"mykey"的key,它存儲(chǔ)在我們新建的叫"mystore"的keystore中。
keytool -genkey -alias mykey -keystore mystore
接下來它會(huì)問一些問題包括keystore的密碼,key的密碼等,如下所示:
輸入keystore密碼:? storepass
您的名字與姓氏是什么?
? [Unknown]:? AYellow
您的組織單位名稱是什么?
? [Unknown]:? 我的組織單位
您的組織名稱是什么?
? [Unknown]:? 我的組織
您所在的城市或區(qū)域名稱是什么?
? [Unknown]:? 北京
您所在的州或省份名稱是什么?
? [Unknown]:? 北京
該單位的兩字母國(guó)家代碼是什么
? [Unknown]:? CN
CN=AYellow, OU=我的組織單位, O=我的組織, L=北京, ST=北京, C=CN 正確嗎?
? [否]:? Y
輸入<mykey>的主密碼
??????? (如果和 keystore 密碼相同,按回車):? keypass
完成后會(huì)在當(dāng)前目錄下生成一個(gè)叫mystore的文件,這個(gè)文件包含了我們的key。用jarsigner命令簽名我們的代碼test.jar(需要輸入keystore和key的密碼):
再次運(yùn)行Applet,在Applet加載的時(shí)候會(huì)出現(xiàn)一個(gè)對(duì)話框,說該Applet由不可信任的發(fā)行者簽名并宣稱代碼是安全的,是不是要對(duì)Applet授權(quán)。選擇"授權(quán)于會(huì)話",然后點(diǎn)擊我們的按鈕,看看是不是成功的創(chuàng)建了文件?
輔助:寫一個(gè)CLASS,通過其可在applet中調(diào)用JSP中的JS代碼
可以看到其中主要用到了netscape.javascript.JSObject這個(gè)object(<%=jdk_home%>\jre\lib\plugin.jar(jdk1.5)),它允許 Java 代碼訪問 JavaScript 方法和屬性
主要通過反射用到了JsObject的getWindow與evel二個(gè)方法來完成此類
JSObject主要方法如下:
可想而知,用CallJS就如下所示了:
如何通過APPLET與Servlet通信,這個(gè)很簡(jiǎn)單了。因?yàn)閍pplet本來就是一個(gè)jar包了。不過,將欲傳輸?shù)膶?duì)象序列化到流里面(較大些的,
如持久化對(duì)象),也可以放到一個(gè)請(qǐng)求(request)中(相對(duì)較小的字符串等)。如下所示:
應(yīng)用的時(shí)候可以如下:
這兒第二個(gè)參數(shù)放了一個(gè)LIST,可以根據(jù)具體情況使用。只是到了Servet端的servlet獲取的時(shí)候做相應(yīng)的處理就OK了(馬上可以看到)。
這樣applet就把數(shù)據(jù)傳輸?shù)絬rl的servlet中去了。
servlet中發(fā)生了些什么呢?
?????????? ?
呵呵,放在request中的數(shù)據(jù)request.getHeader取了出來,流中的數(shù)據(jù)也取了出來。
最后要想往applet中返回結(jié)果,則同樣做如下處理即可:
? OK, 差不多啦!序列化也要注意些問題,如對(duì)象類型,前后順序。
小結(jié):通過以上,可以實(shí)現(xiàn)如下功能:
1:將做好的APPLET打成JAR包后,通過簽名可以將其工嵌入到JSP中運(yùn)行。
2: 就可以實(shí)現(xiàn)在applet中調(diào)用JSP中JS,對(duì)程序做出相應(yīng)的處理。
3: 數(shù)據(jù)在applet與servelt通信。
? 最后我們就可以在JSP Applet與Servlet三者之間就以放心地跑了。
做項(xiàng)目過程看到的好的代碼丟了還真舍不得!寫得比較急,可能有蠻多的地方連語句都不通。敬請(qǐng)諒解!
???
??? 近來加班狂多(現(xiàn)在天都已經(jīng)亮了,相信也有不少同仁跟我一樣),又不能上網(wǎng)!都好幾個(gè)月沒更新了。挺想念這兒的,真的!愿與君共勉!
? 這兒涂些關(guān)于applet的東西。時(shí)間不多,希望涂完后還可以休息下,開始吧:
首先自己做一個(gè)applet,然后打成JAR包(在Eclipse中可以用fatjar這個(gè)插件來完成)這里涉及到給applet簽名:
如何給applet簽名(參考):
沒有經(jīng)過數(shù)字簽名的Applet在默認(rèn)情況下沒有寫本地文件的權(quán)限。那么讓我們準(zhǔn)備簽名代碼吧。
首先用keytool命令產(chǎn)生用來簽名的key。下面這個(gè)命令產(chǎn)生一個(gè)叫"mykey"的key,它存儲(chǔ)在我們新建的叫"mystore"的keystore中。
keytool -genkey -alias mykey -keystore mystore
接下來它會(huì)問一些問題包括keystore的密碼,key的密碼等,如下所示:
輸入keystore密碼:? storepass
您的名字與姓氏是什么?
? [Unknown]:? AYellow
您的組織單位名稱是什么?
? [Unknown]:? 我的組織單位
您的組織名稱是什么?
? [Unknown]:? 我的組織
您所在的城市或區(qū)域名稱是什么?
? [Unknown]:? 北京
您所在的州或省份名稱是什么?
? [Unknown]:? 北京
該單位的兩字母國(guó)家代碼是什么
? [Unknown]:? CN
CN=AYellow, OU=我的組織單位, O=我的組織, L=北京, ST=北京, C=CN 正確嗎?
? [否]:? Y
輸入<mykey>的主密碼
??????? (如果和 keystore 密碼相同,按回車):? keypass
完成后會(huì)在當(dāng)前目錄下生成一個(gè)叫mystore的文件,這個(gè)文件包含了我們的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
再次運(yùn)行Applet,在Applet加載的時(shí)候會(huì)出現(xiàn)一個(gè)對(duì)話框,說該Applet由不可信任的發(fā)行者簽名并宣稱代碼是安全的,是不是要對(duì)Applet授權(quán)。選擇"授權(quán)于會(huì)話",然后點(diǎn)擊我們的按鈕,看看是不是成功的創(chuàng)建了文件?
輔助:寫一個(gè)CLASS,通過其可在applet中調(diào)用JSP中的JS代碼
public
?
class
?CallJavascript?{
???? public ?CallJavascript()?{
????}
???? /**
?????*
?????*? @param ?ob?Object?這是一個(gè)applet對(duì)象
?????*? @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?這是一個(gè)applet對(duì)象
?????*? @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這個(gè)object(<%=jdk_home%>\jre\lib\plugin.jar(jdk1.5)),它允許 Java 代碼訪問 JavaScript 方法和屬性
主要通過反射用到了JsObject的getWindow與evel二個(gè)方法來完成此類
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通信,這個(gè)很簡(jiǎn)單了。因?yàn)閍pplet本來就是一個(gè)jar包了。不過,將欲傳輸?shù)膶?duì)象序列化到流里面(較大些的,
如持久化對(duì)象),也可以放到一個(gè)請(qǐng)求(request)中(相對(duì)較小的字符串等)。如下所示:
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中返回的數(shù)據(jù)
????????????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中返回的數(shù)據(jù)
????????????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();
????????????}
????????}
????}
}
應(yīng)用的時(shí)候可以如下:
DataTransferUtil?util
=
new
?DataTransferUtil();
Map?paraMap = new ?HashMap();
paraMap.put( " method " , " import " );
Map?map = util.getData(paraMap,list,url); // 取得servlet返回的數(shù)據(jù)(經(jīng)過封裝)
Map?paraMap = new ?HashMap();
paraMap.put( " method " , " import " );
Map?map = util.getData(paraMap,list,url); // 取得servlet返回的數(shù)據(jù)(經(jīng)過封裝)
這兒第二個(gè)參數(shù)放了一個(gè)LIST,可以根據(jù)具體情況使用。只是到了Servet端的servlet獲取的時(shí)候做相應(yīng)的處理就OK了(馬上可以看到)。
這樣applet就把數(shù)據(jù)傳輸?shù)絬rl的servlet中去了。
servlet中發(fā)生了些什么呢?
response.setContentType(
"
application/octest-stream
"
);
???????? // req.setCharacterEncoding("gb2312");
????????log.debug( " is?handlRequest
.
"
);
???????? // 準(zhǔn)備傳輸數(shù)據(jù)
????????ObjectOutputStream?oos? = ? null ;
????????ObjectInputStream?ois? = ? null ;
????????Map?rtnMap? = ? new ?HashMap();
???????? // 執(zhí)行方法
???????? try ?{
????????????String?method? = ?(String)request.getHeader( " method " );
????????????ois? = ? new ?ObjectInputStream( new ?BufferedInputStream(request.getInputStream()));
????????????

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

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



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