JAVA

          人生若只如初見,何事秋風悲畫扇。

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

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


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


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


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


            應用的時候可以如下:
          DataTransferUtil?util = new ?DataTransferUtil();
          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()));
          ????????????.

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

          oos? = ? new ?ObjectOutputStream(response.getOutputStream());
          oos.writeObject(rtnMap);???
          ?

          ?  OK, 差不多啦!序列化也要注意些問題,如對象類型,前后順序。


            小結:通過以上,可以實現如下功能:
            1:將做好的APPLET打成JAR包后,通過簽名可以將其工嵌入到JSP中運行。
            2: 就可以實現在applet中調用JSP中JS,對程序做出相應的處理。
            3: 數據在applet與servelt通信。

          ?  最后我們就可以在JSP Applet與Servlet三者之間就以放心地跑了。


            做項目過程看到的好的代碼丟了還真舍不得!寫得比較急,可能有蠻多的地方連語句都不通。敬請諒解!
          ???
          ??? 近來加班狂多(現在天都已經亮了,相信也有不少同仁跟我一樣),又不能上網!都好幾個月沒更新了。挺想念這兒的,真的!愿與君共勉!





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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 苍山县| 正宁县| 岳普湖县| 合肥市| 宜兰市| 泸州市| 稻城县| 吕梁市| 平安县| 恩平市| 文成县| 大安市| 镶黄旗| 庐江县| 团风县| 鲁山县| 武平县| 孙吴县| 朝阳市| 碌曲县| 文昌市| 吉安市| 河曲县| 麟游县| 洞口县| 孝义市| 旺苍县| 巴林左旗| 洛扎县| 修水县| 哈密市| 杨浦区| 天峨县| 谢通门县| 阜宁县| 明光市| 阆中市| 安顺市| 永平县| 峨山| 积石山|