<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的代碼自動(dòng)生成工具

    JavaScript Based Code Generator - codegen

    工具主頁(yè)

    http://thelei.sourceforge.net

    目的

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

    簡(jiǎn)單介紹

    本工具生成代碼的思想是讀取數(shù)據(jù)庫(kù)中表的結(jié)構(gòu), 使用JavaScript作為腳本語(yǔ)言編寫模板, 生成各種代碼或者文件, 支持各種格式的文本文件, Java, C#, PHP 等, 只要是文本文件, 都可以生成, 因?yàn)樯墒裁词怯赡阃耆约憾x的. 對(duì)數(shù)據(jù)庫(kù)的訪問是通過插件的形式進(jìn)行的, 所以易于擴(kuò)充, 目前支持Mysql, 以及支持Ado連接的數(shù)據(jù)庫(kù). 

    本工具開發(fā)于2006年, 經(jīng)過兩年的內(nèi)部使用, 進(jìn)行了不斷改進(jìn), 現(xiàn)在把它公布出來, 希望能有更多的人用它, 提意見, 然后把它做的更好.

    什么時(shí)候用它

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

    為什么用它

    答案很簡(jiǎn)單, 因?yàn)檫@個(gè)程序簡(jiǎn)單容易使用, 而且完全自定義, 能滿足不同項(xiàng)目對(duì)代碼的要求, 只要你能描述出要生成的代碼結(jié)構(gòu)和形式的共性,就能把模板寫出來.

    簡(jiǎn)單的例子

    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%>;

    }

    <$

    }

    $>

    }
    如果當(dāng)前的表名是:Role, 同時(shí)它有role_id int, role_name varchar, description varchar等字段, 那么生成的結(jié)果就是:

    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);
      $> 執(zhí)行一段代碼
    2. <$=sys_fields[0].name$> 顯示表達(dá)式的值

    預(yù)定義的變量

    1. sys_table_name: 當(dāng)前表名
    2. sys_fields: 當(dāng)前表的Field 對(duì)象數(shù)組. 使用sys_fields.length 來獲取字段的數(shù)目.
    3. sys_keys: 當(dāng)前表主鍵的數(shù)組, 使用sys_keys.length來獲取主鍵字段的數(shù)量.
    4. sys_user_name: 當(dāng)前連接數(shù)據(jù)庫(kù)的用戶名
    5. sys_db_name: 當(dāng)前連接到數(shù)據(jù)庫(kù)的名字
    6. sys_output: 內(nèi)部使用,存儲(chǔ)生成的中間JavaScript代碼
    7. Field 對(duì)象屬性, 如果有一個(gè)字段: 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: 字段長(zhǎng)度, integer, 如: sys_fields[i].size, 例子值是 100
          scale: 精度, integer, 如: sys_fields[i].scale, 本例子是varchar 類型,本項(xiàng)為空
          default_value: 默認(rèn)值, 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.

    預(yù)定義的方法

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

    使用步驟

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

    數(shù)據(jù)庫(kù)連接參數(shù)

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

    生成文件

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

    Tips

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

      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. 在項(xiàng)目屬性對(duì)話框中寫一些項(xiàng)目使用的JavaScript方法, 然后可以為不同的表生成不同的模塊, 如:
      function getModule(tablename){
           if(tablename.startsWith('user')){
               return "user/";
          }
          //code to return other module name
          //...
          return "";
      }
      然后設(shè)置目錄或模板的destination path為: <%=getModule(sys_table_name)%><%=getDomainByTable(sys_table_name)%>Action.java, 如果當(dāng)前的表是user, 目標(biāo)路徑將是: user/UserAction.java, 如果表名是 log, 目標(biāo)路徑將是: LogAction.java

    改進(jìn)這個(gè)工具:

    如果有下面的問題, 請(qǐng)和我聯(lián)系:

    1. 需要一個(gè)新的數(shù)據(jù)庫(kù)插件或者你寫了一個(gè)新的數(shù)據(jù)庫(kù)插件
    2. 不知道如何使用這個(gè)工具
    3. 發(fā)現(xiàn)了Bug
    4. 其他任意的建議...

     

    最后希望這個(gè)工具對(duì)你能夠有所幫助, 同時(shí)減少編碼時(shí)Copy&Paste的時(shí)間

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

    評(píng)論

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

    不錯(cuò),不錯(cuò)啊,非常的實(shí)用,而且是用js寫的,也沒什么環(huán)境的要求。瀏覽器即可,以前自己也寫過這樣的工具用于處理重復(fù)的勞動(dòng)。  回復(fù)  更多評(píng)論   

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

    是C++寫的, 用戶使用Javascript來編寫模板, 需要下載, 解壓后即可運(yùn)行.  回復(fù)  更多評(píng)論   

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

    很好,很強(qiáng)大,支持
    by http://www.vifir.com/?refer=blogjava_programmer  回復(fù)  更多評(píng)論   

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

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

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

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

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

    所以最終選擇了 c++來開發(fā), 使用javascript作為腳本語(yǔ)言, 目前下載文件5M左右, 缺點(diǎn)就是對(duì)數(shù)據(jù)庫(kù)的支持需要一個(gè)一個(gè)添加

    如果您有什么改進(jìn)這個(gè)工具的想法, 請(qǐng)和我聯(lián)系.
    最后感謝您的建議, 我會(huì)參考一些其他工具的做法的.
      回復(fù)  更多評(píng)論   

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

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

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

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

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

    @roger
    目前還不支持,我已經(jīng)把這一點(diǎn)記下來了,下一個(gè)版本會(huì)加上去,謝謝  回復(fù)  更多評(píng)論   

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

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

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

    起名為“any"的理由
    1。簡(jiǎn)單:只要懂java任何人都可以在2小時(shí)內(nèi)學(xué)會(huì)。 anyone can use it easily.
    2。靈活:任何文件都可以輕易的轉(zhuǎn)化為模板。 anything is template.
    3。強(qiáng)大:幾乎能實(shí)現(xiàn)你所有想自動(dòng)化的部分,只要你有靈感。anything is real.
      回復(fù)  更多評(píng)論   

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

    您的函數(shù)不能夠返回中文,這是否是一個(gè)bug?  回復(fù)  更多評(píng)論   

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

    @aiya
    已經(jīng)在最新版本(V 1.1.20081228)中修好了,謝謝  回復(fù)  更多評(píng)論   

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

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

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

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

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

    操作上很慢.....

    關(guān)注中......
    我的郵箱:tin555.d@gmail.com  回復(fù)  更多評(píng)論   

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

    getcomment能否支持oracle
    您現(xiàn)在只有Mysql和ado的插件,oracle得不到comment  回復(fù)  更多評(píng)論   

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

    @aiya
    我目前正在整理程序結(jié)構(gòu),增加緩存, 因?yàn)楦鶕?jù) tin555的意見, ado連接oracle特別慢, 增加完緩存后我會(huì)把oracle的comment獲取出來, 但可能需要一兩個(gè)月的時(shí)間

    @tin555
    可能需要一兩個(gè)月的時(shí)間,我會(huì)調(diào)整程序結(jié)構(gòu),通過緩存數(shù)據(jù)庫(kù)信息, 提高速度, 軟件本身速度不慢,但每次都要訪問數(shù)據(jù)庫(kù)比較慢  回復(fù)  更多評(píng)論   

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

    功能多,設(shè)置多,沒有中文文檔,用起來不容易。  回復(fù)  更多評(píng)論   

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

    希望能加上表之間的關(guān)系關(guān)聯(lián),這樣會(huì)更完善  回復(fù)  更多評(píng)論   

    導(dǎo)航

    <2009年8月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    統(tǒng)計(jì)

    常用鏈接

    留言簿(7)

    隨筆分類

    隨筆檔案

    相冊(cè)

    Photo

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 久久水蜜桃亚洲av无码精品麻豆| 亚洲欧洲自拍拍偷精品 美利坚 | 亚洲heyzo专区无码综合| 免费在线视频你懂的| 亚欧日韩毛片在线看免费网站| 亚洲片国产一区一级在线观看| 免费福利在线观看| 国产亚洲美女精品久久久| 一级毛片在线播放免费| 亚洲中文久久精品无码ww16| 久久www免费人成精品香蕉| 亚洲男同帅GAY片在线观看| 在线看片免费人成视频播| 久久久亚洲欧洲日产国码二区| 99精品视频在线观看免费专区| 亚洲综合视频在线观看| 国产一卡二卡四卡免费| 亚洲色大18成人网站WWW在线播放| 免费看美女裸露无档网站| 亚洲一区二区三区高清在线观看 | 一色屋成人免费精品网站| 亚洲成a人片在线不卡| 国产成人3p视频免费观看| 一级毛片在线播放免费| 亚洲人成电影亚洲人成9999网| 我的小后妈韩剧在线看免费高清版 | 黄 色一级 成 人网站免费| 国产亚洲成av人片在线观看| 亚洲美女视频免费| 亚洲成a人无码亚洲成av无码| 久久激情亚洲精品无码?V| 99在线观看免费视频| 亚洲夂夂婷婷色拍WW47| 精品亚洲一区二区三区在线观看 | 免费国产午夜高清在线视频| 亚洲人成伊人成综合网久久| 亚洲精品国产电影| 亚洲免费中文字幕| 本道天堂成在人线av无码免费| 久久精品蜜芽亚洲国产AV| 国产国产人免费视频成69大陆|