小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Snaker開發(fā)筆記(1)-實現(xiàn)插件

          Posted on 2012-01-20 15:27 小明 閱讀(1984) 評論(2)  編輯  收藏 所屬分類: 開發(fā)日志
          程序員的核心價值是創(chuàng)造有用的軟件。
                                   ----------小明

          背景
          我有時會去特定的網(wǎng)站去下載一些資料,比如去englishpod.com去下載英語聽力資料,或者去某論壇下載美女貼圖:-),但是通用的爬蟲無法滿足需求,一來很多網(wǎng)站需要登錄才能下載,另外我也不想下載不需要的東西,只想下載特定的內容,所以我只能寫一些小程序來去下載。這樣的小程序寫了幾個,重復的部分很多,所以能不能寫一個通用的平臺,讓寫類似的程序更簡單?于是有了現(xiàn)在這個開源項目Snaker:http://code.google.com/p/ssnaker/

          插件設計
          我的目標之一,是讓寫特定的爬蟲更簡單,一個想法是做成插件式的。有幾個需求:
          1. 很容易添加插件
          2. 很容易修改插件,不需要重啟程序
          3. 特定網(wǎng)站的邏輯都應該在插件中,framework只包含通用部分。

          所以插件最好是用一種腳本語言來書寫。平臺層我使用Java來開發(fā),插件腳本我決定用javascript來編寫。為什么用javascript?主要是受到nodejs和greasemonkey的啟發(fā),尤其是greasemonkey那種javascript插件的方式,我覺得非常不錯。

          Java和JavaScript的互動

          我選擇了mozilla的rhino庫來實現(xiàn)腳本的執(zhí)行。
          Java調用Javascript腳本比較簡單:

          Context cx = Context.enter();
                  
          try {
                      Scriptable scope = cx.initStandardObjects();
           
                     Script script = cx.compileString(sourceCode, engine.getName(), 1null);
                      script.exec(cx, scope);
                  } 
          finally {
                      Context.exit();
                  }

          因為javascript本身并沒有網(wǎng)絡下載的功能,所以我要定義一些方法,讓javascript可以調用java的方法來實現(xiàn)下載,這稱為Host object。具體的方法請參見rhino的官方文檔,我這里貼出一小段code。

          下面這個類定義了一個sleep的方法。
          Java:
          public class JsHelper extends NativeObject {
              
          public JsHelper() {
              }

              @Override
              
          public String getClassName() {
                  
          return "JsHelper";
              }

              
          public void jsFunction_sleep(int millis) {
                  
          try {
                      Thread.sleep(millis);
                  } 
          catch (InterruptedException e) {
                      logger.error(
          "interrupted",e);
                  }
              }
          }

          Scriptable tx = cx.newObject(scope, "JsHelper");
          scope.put("$", scope, tx);


          這樣就可以在javascript中調用了:

          $.sleep(1000);

          更多的Snaker API設計請參考:

          評論

          # re: Snaker開發(fā)筆記(1)-實現(xiàn)插件  回復  更多評論   

          2012-01-20 21:36 by nkjava
          程序挺好,只是注釋寫得不多

          # re: Snaker開發(fā)筆記(1)-實現(xiàn)插件  回復  更多評論   

          2012-01-23 23:13 by tb
          挺好的
          主站蜘蛛池模板: 卢湾区| 新源县| 城步| 灌阳县| 通渭县| 天全县| 玉林市| 吉木萨尔县| 饶河县| 电白县| 江口县| 金沙县| 福州市| 呼图壁县| 漯河市| 泸定县| 铜梁县| 禄丰县| 策勒县| 沙湾县| 盘山县| 天长市| 金坛市| 根河市| 青河县| 威远县| 上栗县| 繁峙县| 汪清县| 通道| 西华县| 喀什市| 安丘市| 沧源| 潍坊市| 峨眉山市| 福清市| 内乡县| 乌鲁木齐县| 镇平县| 武鸣县|