<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Tao

    Tao obeys its own inherent Nature

    基于JavaScript的代碼自動生成工具

    JavaScript Based Code Generator - codegen

    工具主頁

    http://thelei.sourceforge.net

    目的

    快速生成程序代碼, 比如Struts, Spring, Jdbc/Hibernate所有前后臺的代碼.

    簡單介紹

    本工具生成代碼的思想是讀取數據庫中表的結構, 使用JavaScript作為腳本語言編寫模板, 生成各種代碼或者文件, 支持各種格式的文本文件, Java, C#, PHP 等, 只要是文本文件, 都可以生成, 因為生成什么是由你完全自己定義的. 對數據庫的訪問是通過插件的形式進行的, 所以易于擴充, 目前支持Mysql, 以及支持Ado連接的數據庫. 

    本工具開發于2006年, 經過兩年的內部使用, 進行了不斷改進, 現在把它公布出來, 希望能有更多的人用它, 提意見, 然后把它做的更好.

    什么時候用它

    有時候在項目開發過程中有大量的簡單重復勞動, 以Struts, Spring, Jdbc/Hibernate為例, 對數據庫中的每張表, 都有其相對應的Dao(2), Service(2), Action(Class+Validation2), Jsp(list+edit+add=3), 需要新建10多個文件/目錄,  而這個過程是很枯燥的, 但又會花不少時間, 這個工具的最初開發目的就是自動生成這些文件. 這樣,新增一個列表,增刪改的模塊, 如果不考慮界面需要調整, 就只需要幾分鐘的時間, 換句話說, 你可以在很短的時間內把所有需要的表自動生成列表,增刪改的功能.

    為什么用它

    答案很簡單, 因為這個程序簡單容易使用, 而且完全自定義, 能滿足不同項目對代碼的要求, 只要你能描述出要生成的代碼結構和形式的共性,就能把模板寫出來.

    簡單的例子

    public class Base<%=getDomainByTable(sys_table_name)%>{

    <$

    for (var i=0; i<sys_fields.length; i++)

    {

    var type = getJavaBeanType(sys_fields[i].type);$>

    private <%=type%> <%=sys_fields[i].name%>;

    <$

    }



    for (var i=0; i<sys_fields.length; i++)

    {

    var type = getJavaBeanType(sys_fields[i].type);

    $>

    public <%=type%> get<%=formatFieldName(sys_fields[i].name)%>(){

    return <%=sys_fields[i].name%>;

    }

    public void set<%=formatFieldName(sys_fields[i].name)%> (<%=type%> <%=sys_fields[i].name%>){

    this.<%=sys_fields[i].name%> = <%=sys_fields[i].name%>;

    }

    <$

    }

    $>

    }
    如果當前的表名是:Role, 同時它有role_id int, role_name varchar, description varchar等字段, 那么生成的結果就是:

    public class BaseRole{

    private int role_id;

    private String role_name;

    private String description;



    public int getRoleId(){

    return role_id;

    }

    public void setRoleId (int role_id){

    this.role_id = role_id;

    }

    public String getRoleName(){

    return role_name;

    }

    public void setRoleName (String role_name){

    this.role_name = role_name;

    }

    public String getDescription(){

    return description;

    }

    public void setDescription (String description){

    this.description = description;

    }

    }
    從模板里可以看到, 要生成什么樣的代碼都是自己可以定制的, 包括方法的起名, 例子里formatFieldName是自己寫的JavaScript 方法.

    腳本塊

    1. <$
            //Javascript code like: println(sys_fields[0].name);
      $> 執行一段代碼
    2. <$=sys_fields[0].name$> 顯示表達式的值

    預定義的變量

    1. sys_table_name: 當前表名
    2. sys_fields: 當前表的Field 對象數組. 使用sys_fields.length 來獲取字段的數目.
    3. sys_keys: 當前表主鍵的數組, 使用sys_keys.length來獲取主鍵字段的數量.
    4. sys_user_name: 當前連接數據庫的用戶名
    5. sys_db_name: 當前連接到數據庫的名字
    6. sys_output: 內部使用,存儲生成的中間JavaScript代碼
    7. Field 對象屬性, 如果有一個字段: user_name varchar(100) not null default 'user', 下面是Field的屬性和值:
          name: 字段名, String. 如: sys_fields[i].name, 例子值是 user_name
          type: 字段類型, String, 如: sys_fields[i].type, 例子值是 varchar
          size: 字段長度, integer, 如: sys_fields[i].size, 例子值是 100
          scale: 精度, integer, 如: sys_fields[i].scale, 本例子是varchar 類型,本項為空
          default_value: 默認值, String. 如: sys_fields[i].default_value, 例子值是 user
          is_null: 是否可以為空, boolean. 如: sys_fields[i].is_null, 例子值是 false
          is_primary_key: 是否是主鍵, boolean. 如: sys_fields[i].is_primary_key, 例子值是 false.

    預定義的方法

    1. print(str). 輸出str, 沒有換行 
    2. println(str). 輸出str, 結尾換行
    3. getFieldList(). 返回字段列表, 用',' 分割
    4. 一些其他的javascript 方法, 如capitalize, lowercase, uppercase, trim等等. 你也可以通過Tools/Edit public functions增加自己常用的方法

    使用步驟

    1. 創建一個新項目, 設定數據庫連接參數
    2. 添加目錄和模板, 模板采用JavaScript腳本語言, 唯一的區別是用<$ you code$> 把代碼包起來, 或者用<%=expression%> 來打印一個表達式
    3. 生成文件, 分為三種方式: 生成文件, 生成項目中的所有文件, 批量生成(多表, 多模板)

    數據庫連接參數

    1. 選擇數據庫類型
    2. 輸入需要的信息, 如host, port, username, password and database name

    生成文件

    1. 生成當前文件, Template/Generate current file
    2. 生成項目的所有文件, Project/Generate Project Files
    3. 批量生成, Project/Batch Generate, 然后選擇需要生成文件的tables和 templates(folders) 生成文件.

    Tips

    1. 使用JavaScript map, 而不是if ... else ..., 這樣代碼看著非常簡潔
      <$

      var type_defaultvalue={

      'int':'0',

      'tinyint':'false',

      'varchar':'""',

      'datetime':'new Date()',

      };



      for (var i=0; i<sys_fields.length; i++)

      {

      var type = sys_fields[i].type;



      if(undef(type_defaultvalue[type])){

      println("Undefined default value for field type: '"+ type+"'");

      }



      //the following line has the same result
      //println(sys_table_name+".set"+formatFieldName(sys_fields[i].name)+"("+type_defaultvalue[type] + ");");
      $>
      <%=sys_table_name%>.set<%=formatFieldName(sys_fields[i].name)%>(<%=type_defaultvalue[type] %>);
      <$
      }
      $>
    2. 在項目屬性對話框中寫一些項目使用的JavaScript方法, 然后可以為不同的表生成不同的模塊, 如:
      function getModule(tablename){
           if(tablename.startsWith('user')){
               return "user/";
          }
          //code to return other module name
          //...
          return "";
      }
      然后設置目錄或模板的destination path為: <%=getModule(sys_table_name)%><%=getDomainByTable(sys_table_name)%>Action.java, 如果當前的表是user, 目標路徑將是: user/UserAction.java, 如果表名是 log, 目標路徑將是: LogAction.java

    改進這個工具:

    如果有下面的問題, 請和我聯系:

    1. 需要一個新的數據庫插件或者你寫了一個新的數據庫插件
    2. 不知道如何使用這個工具
    3. 發現了Bug
    4. 其他任意的建議...

     

    最后希望這個工具對你能夠有所幫助, 同時減少編碼時Copy&Paste的時間

    posted on 2008-03-05 13:28 wade 閱讀(4579) 評論(18)  編輯  收藏 所屬分類: C++Java

    評論

    # re: 基于JavaScript的代碼自動生成工具 2008-03-06 08:50 ivin

    不錯,不錯啊,非常的實用,而且是用js寫的,也沒什么環境的要求。瀏覽器即可,以前自己也寫過這樣的工具用于處理重復的勞動。  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具[未登錄] 2008-03-06 09:03 wade

    是C++寫的, 用戶使用Javascript來編寫模板, 需要下載, 解壓后即可運行.  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2008-03-06 19:25 WLR

    很好,很強大,支持
    by http://www.vifir.com/?refer=blogjava_programmer  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2008-03-07 11:46 rocket

    不錯的方法。
    是根據已知表結構的情況下進行代碼生成。
    屬于模板方式生成代碼技術。
    其實業內常用的模板方式生成代碼的方法是xdoclet和annotation,使用注釋來提取模板元素,再使用其它的模板框架(比如velocity)來生成代碼。
    如果作者是這個代碼生成工具的維護者,希望能再多借鑒一些代碼生成技術,畢竟用js生成代碼的創意很好。  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2008-03-07 13:01 wade

    @rocket
    最初設計這個工具的時候, 有如下考慮:
    1. 跨平臺(C++, Java, PHP)
    2. 最終要下載或安裝的文件要小, 不能有太多的依賴庫, 那樣可能讓用戶失去信心(C++, PHP)
    3. 界面要簡單, (C++)
    4. 使用常用的腳本語言, 不增加對用戶的要求(Javascript)

    于是, 排除了c#, java, 個人覺得xdoclet和annotation不是很直觀, 可能適合企業中批量的生成代碼, 但上手會有一定的難度.

    所以最終選擇了 c++來開發, 使用javascript作為腳本語言, 目前下載文件5M左右, 缺點就是對數據庫的支持需要一個一個添加

    如果您有什么改進這個工具的想法, 請和我聯系.
    最后感謝您的建議, 我會參考一些其他工具的做法的.
      回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2008-03-13 22:03 wade

    新增了如下內容:
    1. 通過Ado連接各種數據庫的支持.測試了SQL Server, 感覺速度比mysql直接連要慢, Access的MDB很快。
    2. 支持批量生成部分/全部模板, 保存選中的模板到Working Set(Eclipse里的名字),用來保存當前選中的目錄和模板  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具[未登錄] 2008-05-20 13:18 roger

    有沒有辦法通過附加表名來獲取字段的方法,比如當前表table1的字段獲取通過sys_fields[i].name,當前表名sys_table_name,如果在同一個模板中此時我希望獲取table2的字段,我應該怎么做呢?  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2008-05-27 11:19 wade

    @roger
    目前還不支持,我已經把這一點記下來了,下一個版本會加上去,謝謝  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2008-06-16 18:28 路過

    這個好像和你這個差不多,但憑借java可能功能更強大。
    Any-java代碼自動生成工具(java模板語言)發布
    一、Any-java代碼自動生成工具(java模板語言)簡介
    簡單說明:
    模板解釋性語言,在模板中沒有特殊標記的部分,原封不動輸出,
    標記的部分允許所有的java語法,并解釋執行。
    用途:代碼自動生成
    比如:開發完了一個類文件,但還有很多類似的類要做,只是要改變一些個別的地方,
    那么,可以把需要改動的地方用java變量標記,然后運行該模板,自動生成多個類。
    同時,我們也提供了一些工具類(比如excel讀取),則設計書和模板聯動,可以大大提高開發速度。
    當然,如果沒有設計書,也可以直接讀取DB的表結構來自動生成代碼。

    該工具不同與某些java代碼自動生成的工具,規定死了模板,只能生成指定的代碼,
    思路是:把先開發出來的java類,作簡單的變量替換,就生成新的模板,從而生成新的java類。
    也不只限于java類,任何重復的代碼部分都可以做成模板。

    起名為“any"的理由
    1。簡單:只要懂java任何人都可以在2小時內學會。 anyone can use it easily.
    2。靈活:任何文件都可以輕易的轉化為模板。 anything is template.
    3。強大:幾乎能實現你所有想自動化的部分,只要你有靈感。anything is real.
      回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2008-09-09 08:10 aiya

    您的函數不能夠返回中文,這是否是一個bug?  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2009-04-14 10:31 wade

    @aiya
    已經在最新版本(V 1.1.20081228)中修好了,謝謝  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2009-04-14 10:32 wade

    @roger
    已經在最新版本(V 1.1.20081228)中修好了,
    通過db.getTable('your_table_name') 獲取任何一張表的內容.
    謝謝  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具[未登錄] 2009-08-23 20:26 tin555

    不知道為什么..我用ADO連接ORACLE...界面上生成慢到爆.非常非常的慢..是這個軟件本身很慢???  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具[未登錄] 2009-08-23 20:28 tin555

    操作上很慢.....

    關注中......
    我的郵箱:tin555.d@gmail.com  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2009-10-20 17:14 aiya

    getcomment能否支持oracle
    您現在只有Mysql和ado的插件,oracle得不到comment  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2009-10-21 09:49 wade

    @aiya
    我目前正在整理程序結構,增加緩存, 因為根據 tin555的意見, ado連接oracle特別慢, 增加完緩存后我會把oracle的comment獲取出來, 但可能需要一兩個月的時間

    @tin555
    可能需要一兩個月的時間,我會調整程序結構,通過緩存數據庫信息, 提高速度, 軟件本身速度不慢,但每次都要訪問數據庫比較慢  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具[未登錄] 2010-05-27 00:03 愚公

    功能多,設置多,沒有中文文檔,用起來不容易。  回復  更多評論   

    # re: 基于JavaScript的代碼自動生成工具 2010-07-19 17:58 pyd

    希望能加上表之間的關系關聯,這樣會更完善  回復  更多評論   

    導航

    <2008年3月>
    2425262728291
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    統計

    常用鏈接

    留言簿(7)

    隨筆分類

    隨筆檔案

    相冊

    Photo

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费看大美女大黄大色| 日韩在线免费视频| gogo全球高清大胆亚洲| 亚洲AV无码国产精品永久一区| 久草视频免费在线| 青青视频免费在线| 免费看男女下面日出水视频| 亚洲国产成人久久综合| 尤物永久免费AV无码网站| 精品韩国亚洲av无码不卡区| 永久免费看mv网站入口| 337P日本欧洲亚洲大胆艺术图| 免费观看国产小粉嫩喷水| 日本一区二区三区免费高清在线| 亚洲高清无码专区视频| 久久av免费天堂小草播放| 亚洲日韩精品无码一区二区三区 | 一本久到久久亚洲综合| mm1313亚洲国产精品无码试看| 黄网址在线永久免费观看| 菠萝菠萝蜜在线免费视频| 亚洲人成无码网站| 在免费jizzjizz在线播| 亚洲精品无码少妇30P| 亚洲人成无码网WWW| 91热久久免费精品99| 亚洲日韩精品国产3区| 国产精品亚洲二区在线观看| 国产午夜成人免费看片无遮挡 | 水蜜桃视频在线观看免费播放高清| 亚洲国产成人高清在线观看 | 日韩免费高清大片在线| 亚洲一级毛片中文字幕| 韩国18福利视频免费观看| 久久最新免费视频| 亚洲欧洲国产成人精品| 免费在线观看亚洲| 在线人成精品免费视频| 国产麻豆成人传媒免费观看| 亚洲国产一区二区三区青草影视| 国产日本一线在线观看免费|