設計java

          j2ee輕量級框架,IMVC,IORM && web網絡游戲

          2008年6月11日 #

          抽取最小的jre--BuildJre項目開啟

              java在桌面軟件的失利,很大程度上取決與她運行環境的陪著復雜度,還有隨時帶的一個龐大的jre環境。有時候我們并不需要jre中全部的類庫支持,我們只需要一些對我們項目有用的類庫,能否有一種通用的方法來抽取jre中的這些對我們有用的部分呢?google了下找到了幾篇文章介紹這個的。主要就是用verbose參數運行jar,然后觀察java載入了多少java類,然后手動或者寫個程序自動的吧這些類打包和jvm打包為一個全新的jre環境。這種方法是可行的,但是卻是不通用,而且這種方法還有一個很大的弊端,當有些類導入到我們項目中,但是在verbose的時候沒有用到(比如一些異常類),我們就不會導入,最終可能在發布運行的時候就用到了,這樣可不妙。那么是否還有其他方法來瘦身jre環境呢,然后通過隨身附帶jre發布java程序?答案一定是有的,我已經著手在開發這個應用,我把她起名為BuildJre。
              一,可行性分析(我們加上在win系統下):
                 java.exe是java運行的一個入口程序,當我們鍵入明了 java className的時候,首先啟動都是這個程序,然后這個程序回去查找可用的jre庫,一般是先搜索本目錄和父親目錄,如果接著搜索環境變量,判斷是否為jre的依據是,首先java.exe查找懷疑目錄(比如父目錄)的bin下有沒有java.dll,如果找到,那么他就判定這個是jre目錄然后查找lib\i386下的jvm.cfg,最后更具這里面的參數去啟動bin\client或者bin\server下的jvm.dll,這個才是真正的java虛擬機,到這里,java.exe把控制權全部交給jvm,然后jvm就初始化,分配內存等,運行程序了,運行程序期間導入的jdk包,都在jre目錄下的lib\rt.jar下。
                 說道這里,我們發現,其實不用環境變量,只要有jre環境就能運行java程序,這使得我們更加堅定java程序也可以桌面化,因為他也是可以不用配置那么麻煩的環境變量直接運行的。再回到瘦身來,剛才說了,jdk中所有的以來包全部位于jre\lib\rt.jar下,我們要廋的就是這個,40多M的rt,我們通過類依賴抽取,對于一個普通的java程序,預計可以廋到小于10M,然后配合java.exe,java.dll,等幾個小的程序,預計目標是平均廋身到15M以內。

              二,實施思路,用verbose方法不通用,不能在程序內部抽取jre,而且還有可能遺漏依賴項,不足提倡。我們架設有一個標志的依賴說明庫,比如ArrayList這個類依賴的所有包都一一對應,那么我們如果在程序里import ArrayList的話,那么我們可以迅速抽取相關的依賴包,然后在整個項目的所有import中去重復,不就ok了?現在的問題在于:
                    1,不是所有的jdk包都需要import的,比如java.lang下就不用import
                    2,有些jdk內部類在同一個包下不用寫import也一樣依賴。
                    3,計算jdk內部依賴估計要很長實踐,因為文件很多,依賴很復雜。
              這些問題基本上都有解決方法,我已經開始著手解決。

              希望有一天,我們的java項目發布,只要帶上10M的小型環境,也不用配置環境變量,雙擊,ok。。哈哈

          posted @ 2008-08-05 20:59 剎那 閱讀(2032) | 評論 (2)編輯 收藏

          突然說幾句

              這年頭,webgame一個一個的冒出來,令我們應接不暇,有人說webgame是一場新的泡沫,也有人說是互聯網新的機會,有人說webgame是小公司叫板游戲行業的機會,也有資深游戲人士說小公司做webgmae沒戲(盛大高管說,因為沒有品牌和玩家資源)。不管怎么樣,webgame的興起已經無法阻擋,包括我們公司,也是眾進軍者中的一個。

              webgame游戲商進軍的主要兩個領域是 策略類游戲(往往以js,ajax技術和純通的web技術為基礎),和flash休閑社區游戲(以flash as3等技術為基礎)。策略類游戲很早就有了,甚至比現在的門戶網站還早,只是那個時候沒有現在這么興起,時下具有代表性的主要是一些三國,戰爭類游戲,像盛大這種大游戲公司也介入不少,連baidu這種重來不碰游戲的公司都開始進入了。而flash游戲相對來說比較少,比如夢境家園(純休閑娛樂,可以k歌),比如熱舞街(勁舞團的web版),天空左岸 和 富豪街 等都不錯。還有兩個我本人比較期待的還沒有公測的flash網游,一個是昆侖online,一個是和熱舞街,富豪街同一個公司的 口袋寵物??此麄兊挠螒蚪貓D已經非常類似傳統的大型游戲了。當然,更期待的是我們在開發的flash網游,哈,內容和名字現在還不能透露(小小透露下,我們的網游pk模式和現在任何一種網游的pk模式都不同,挺好玩的哦)。

              。。。。不想說了。。想起來一本書上的一句話“真正有想法的人,已經埋頭在實現自己的想法了,不會把自己的想法寫出來,在網上瞎扯淡的,都是沒事干的。”

          posted @ 2008-07-26 12:49 剎那 閱讀(338) | 評論 (2)編輯 收藏

          游戲開發進展

              游戲前臺主要以flash as3 為主,后臺用java,目前已經初步做出一個原型,包括用戶行走,多用戶移動同步,地圖場景與主程序分離,場景加載等等功能,地圖編輯器也已經做的差不多了,計劃今天能完成,如果完成的話,就可以直接拿給美工去做地圖場景了,最終導出一個xml文件和相關的資源(圖片等),主程序通過這個xml文件加載場景。
              這幾天主要的任務包括 客戶端UI統一界面設計,需要做到高耦合,讓ui界面通過xml文件配置,服務器端數據庫的設計,主程序調用外部swf模塊的企業級設計,游戲任務腳本語言的初步設計,等等。

          posted @ 2008-07-17 07:10 剎那 閱讀(237) | 評論 (0)編輯 收藏

          開始正式做網游啦

          以后開始正式要做網絡游戲啦,flash前臺,java后臺。嘿嘿

          posted @ 2008-07-06 16:03 剎那 閱讀(310) | 評論 (0)編輯 收藏

          IMVC 1.0 提供下載

              還沒有整理出完整的api,里面有一個簡單的例子。

              下載

          posted @ 2008-06-21 20:31 剎那 閱讀(332) | 評論 (0)編輯 收藏

          IMVC框架特性詳解--ajax支持

              IMVC對ajax有了很好的支持。主要體現在兩方面。

              一 ajax View類型支持。Imvc的視同是通過一個View類來返回的,在action中通過return new View("/xxx.html")返回一個視圖,然后IMVC會通過Value中的數據渲染這個視圖。這是一般的流程,有些特殊的流程可以返回其他類型的View,我們先來看看View類的代碼:
          public final class View implements Cloneable{
              
          /**
               * 屬性介紹:普通的view,通過模板轉換
               
          */
              
          public static final int TYPE_VIEW=1;
              
          /**
               * 屬性介紹:轉向,不改變url
               
          */
              
          public static final int TYPE_REDIRECT=2;
              
          /**
               * 屬性介紹:專心 ,改變url
               
          */
              
          public static final int TYPE_REDIRECT2=3;
              
          /**
               * 屬性介紹:直接返回string,path的值
               
          */
              
          public static final int TYPE_AJAX=4;
              
              
          public static final int TYPE_EXCEPTION=5;

              
          private String path;
              
          private int type=1;
              
          public View(String path){
                  
          this.path=path;
              }
              
          public View(String path,int type){
                  
          this.path=path;
                  
          this.type=type;
              }
              
          public View(Map map){
                  JSONObject jsono
          =JSONObject.fromObject(map);
                  path
          =jsono.toString();
                  type
          =TYPE_AJAX;
              }
              
          public View(List array){
                  JSONArray jsona
          =JSONArray.fromObject(array);
                  path
          =jsona.toString();
                  type
          =TYPE_AJAX;
              }
              
          public View(Object bean){
                  JSONObject jsono
          =JSONObject.fromObject(bean);
                  path
          =jsono.toString();
                  type
          =TYPE_AJAX;
              }
              
          public String getPath() {
                  
          return path;
              }
              
          public void setPath(String path) {
                  
          this.path = path;
              }
              
          public int getType() {
                  
          return type;
              }
              
          public void setType(int type) {
                  
          this.type = type;
              }

              
          public View clone(String path){
                  View v
          =cloneBase();
                  v.path
          =path;
                  
          return v;
              }
              
          public View clone(String path,int type){
                  View v
          =cloneBase();
                  v.path
          =path;
                  v.type
          =type;
                  
          return v;
              }
              
          public View clone(Map map){
                  View v
          =cloneBase();
                  JSONObject jsono
          =JSONObject.fromObject(map);
                  v.path
          =jsono.toString();
                  v.type
          =TYPE_AJAX;
                  
          return v;
              }
              
          public View clone(List array){
                  View v
          =cloneBase();
                  JSONArray jsona
          =JSONArray.fromObject(array);
                  v.path
          =jsona.toString();
                  v.type
          =TYPE_AJAX;
                  
          return v;
              }
              
          public View clone(Object bean){
                  View v
          =cloneBase();
                  JSONObject jsono
          =JSONObject.fromObject(bean);
                  v.path
          =jsono.toString();
                  v.type
          =TYPE_AJAX;
                  
          return v;
              }
              
          private View cloneBase(){
                  View v
          =null;
                  
          try {
                      v 
          = (View) super.clone();
                  } 
          catch (CloneNotSupportedException e) {
                      
          // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  
          return v;
              }
          }
          我們主要關注以下幾個變量:
           /**
               * 屬性介紹:普通的view,通過模板轉換
               
          */
              
          public static final int TYPE_VIEW=1;
              
          /**
               * 屬性介紹:轉向,不改變url
               
          */
              
          public static final int TYPE_REDIRECT=2;
              
          /**
               * 屬性介紹:專心 ,改變url
               
          */
              
          public static final int TYPE_REDIRECT2=3;
              
          /**
               * 屬性介紹:直接返回string,path的值
               
          */
              
          public static final int TYPE_AJAX=4;
              
          public static final int TYPE_EXCEPTION=5;
              第一個是普通的View,通過ViewFactory.getView("/tt.html")這個方法返回的是普通的view,也就是可以通過IMVC渲染的視圖,而
          TYPE_REDIRECT則是返回一個跳轉view,可以跳轉到下一個action,TYPE_REDIRECT2也是一個跳轉view,不過是改變URL地址的view。TYPE_AJAX就是ajax試圖了,也是今天要講的主角了,至于最后一個TYPE_EXCEPTION,是把異常返回到客戶端瀏覽器到view,這里暫時不考慮。我們可以通過這樣一個構造函數創造出ajax試圖,比如new  View("這是ajax信息",View.TYPE_AJAX),或者通過ViewFactory.getView("這是ajax信息",View.TYPE_AJAX)也是一樣,不過用factory創建的對象是通過對象的clone創建的,能節省一定的性能開銷。當返回的是一個ajax View的時候,信息就會直接返回,而不是通過渲染試圖,比如上面的就直接返回“這是ajax信息”給客戶端,如果這個action是由客戶端ajax請求的話,直接返回數據,是不是很方便呢?

              接下來的ajx特性也許會讓你覺得更方便,比如以下代碼:

          ....action前面的內如.....
              User u
          =new User();
              u.setAge(
          1);
              u.setName(
          "汪汪汪");
              return ViewFactory.getView(u);
              這樣的返回會直接在客戶端打印出 {"age":1,"name":"汪汪汪"};也就是IMVC把對象映射成立JSON(一種js對象的String形式),這個返回數據在客戶端直接可以調用,比如data.name就直接調用出“汪汪汪”,是不是很方便?而且IMVC還支持把List,數組,Map,還有對象相互無限級嵌套返回成JSON數據,這將大大增加AJAX開發的敏捷性和清晰性。

              二 ajax Chain支持。我們假設有一個全部ajax的網頁,里面有幾個div中的數據都是通過ajax的方式向服務器請求的,那么每個div都會請求一次ajax action,這樣就導致了請求次數頻繁,資源的浪費,IMVC提供了一種ajaxChain的概念,可以通過一個url請求多個action,然后把數據自動合并,比如下面的url
          http://xxx.com/ajaxChain.x?id=|one,two?id=1|
          這個url請請求了兩個action,然后把action數據合并,比如本來one.x返回的數據是{"name":"111"},而two返回的數據是 {"name":"2222"};則現在應該返回的是{"one":{"name":"111"},"two?id=1",{"name":"2222"}},這樣,ajaxChain支持無數個action的連接。這樣以后可以將多個ajax合并為一個ajax,節省服務器資源。

              好了,IMVC的ajax支持就講到這里。

          posted @ 2008-06-11 19:14 剎那 閱讀(729) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 安多县| 建德市| 黑水县| 常宁市| 葫芦岛市| 萨嘎县| 五常市| 吴江市| 通榆县| 绥化市| 微博| 和龙市| 砚山县| 晴隆县| 安远县| 永康市| 阿图什市| 芦山县| 彩票| 天门市| 南投县| 舒城县| 达孜县| 海林市| 改则县| 五峰| 怀远县| 周口市| 大荔县| 安平县| 绥芬河市| 凌云县| 和静县| 库车县| 定西市| 潞西市| 新野县| 建阳市| 额敏县| 绥宁县| 葫芦岛市|