JAVA

          人生若只如初見,何事秋風(fēng)悲畫扇。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 25 文章 :: 157 評(píng)論 :: 0 Trackbacks
            一直想來涂些東西,越來越感覺自己好多好多東西都不懂,懂的東西又好膚淺!慚愧!慚愧!

          ?  這兒涂些關(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


            再次運(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;
          ????}
          }


            可以看到其中主要用到了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


            可想而知,用CallJS就如下所示了:
          CallJavascript?calljs? = ? new ?CallJavascript();
          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();
          ????????????}
          ????????}
          ????}
          }


            應(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)過封裝)


            這兒第二個(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()));
          ????????????.

          ?????????? ?
            呵呵,放在request中的數(shù)據(jù)request.getHeader取了出來,流中的數(shù)據(jù)也取了出來。
            最后要想往applet中返回結(jié)果,則同樣做如下處理即可:

          oos? = ? new ?ObjectOutputStream(response.getOutputStream());
          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è)月沒更新了。挺想念這兒的,真的!愿與君共勉!





          posted on 2007-03-30 05:47 Jkallen 閱讀(3954) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高碑店市| 穆棱市| 仁寿县| 偃师市| 集贤县| 林甸县| 丰原市| 高邮市| 池州市| 金溪县| 泰顺县| 全州县| 纳雍县| 关岭| 清原| 南江县| 镇平县| 四平市| 宁武县| 普兰店市| 石嘴山市| 年辖:市辖区| 凌海市| 易门县| 信丰县| 新源县| 广宁县| 泊头市| 丰都县| 乌鲁木齐市| 彰化县| 桐庐县| 武冈市| 秀山| 鞍山市| 新乡县| 安福县| 沭阳县| 明溪县| 九江县| 敦化市|