Version 1.3

1.       基本組成:

a)         運行入口CodeEngineRunnermain();里面注冊所有的Generator;主要有:IbatisGeneratorControllerGeneratorJSPGenerator三個;任意一個可以單獨運行多次;

b)        代碼結構:*Generator,用于生成domainmanagersqlmapcontroller等文件,在生成之后為了保持系統的完整性,通常會調用一些Modifier去修改配置文件;由于每個Generator會單獨再次訪問配置文件,所以可以單獨和重復生成;

c)        主要的配置文件有2個,位于code_engine目錄下,分別為:code-engine-config.xmlcode-engine-gears.xml,但在實際使用中,我們經常要配置的是code-engine-gears.xml,前者一般在項目開始的時候設定,后者用來生成和修改domainmanagersqlmap, controllerjsp和相關的一些配置文件;

d)        模板文件位于template文件夾下面;可以任意添加和調用;語法為freemarker,但是,通常只需參照其他模板文件,一般都可以寫出新模板;

e)         每次運行codeengine都會在backup目錄下面生成備份文件,以備再次生成和修改;

f)         生成日志在logs目錄下;

g)        Framework目錄是框架目錄,可重用部分,在生成新項目時候拷貝用;

h)        Reference目錄是一些開發組件,主要是寫js組件;

2. code-engine-config.xml 配置簡介

       <?xml version="1.0" encoding="UTF-8"?>

<codeEngineConfiguration>

    <context>

        <distDir path="D:"wiczone"trunk"wiczone" java="src" web="war"/>

        <!--<distDir path="D:"test"trunk"project" java="src" web="war"/>-->

        <!--<distDir path="build" java="src" web="war"/>-->

        <templateDir path="template"/>

        <i18nSupport>true</i18nSupport>

        <database classPath="lib"mysql-connector-java-3.1.7-bin.jar">

            <driverClass>org.gjt.mm.mysql.Driver</driverClass>

            <url>jdbc:mysql://localhost:3306/wiczone</url>

            <username>root</username>

            <password>root</password>

        </database>

        <package base="biz.wic" app="application">

        <!--<package base="biz.web" app="framework">-->

            <domain>domain</domain>

            <controller>web</controller>

            <manager>manager</manager>

            <service>service</service>

        </package>

        <web layoutComponent="tiles">

            <manager>WEB-INF"applicationContext-manager.xml</manager>

            <lucene>WEB-INF"applicationContext-lucene.xml</lucene>

            <servlet>WEB-INF"action-servlet.xml</servlet>

            <security>WEB-INF"applicationContext-acegi.xml</security>

            <sqlMapConfig>WEB-INF"sql-map-config.xml</sqlMapConfig>

            <messages>WEB-INF"classes"messages.properties</messages>

            <tiles>WEB-INF"defs</tiles>

            <jdbc>WEB-INF"jdbc.properties</jdbc>

        </web>

    </context>

    <!--

    IMPORTANT NOTES:

    1.in most cases, we no necessary to modify the <context/> part, since we have already set done;

    2.each of controller/jsp can be re-created alternatively.

    3.please becareful that metadata's character case.

    4.the basis rule is:

        if not existed we will created;

        if already existed we may overwrited;

    -->

</codeEngineConfiguration>

1) 如上所示,< database > 用于配置數據庫的連接,注意要保證driver能訪問到;

2) <Package>負責生成各種代碼使用,

3) <web>用于指定一些配置文件;

4) 以上文件通常在項目開始的時候設定;

<context>詳解

a<distDir path="build" java="src" web="war"/>

        <!--<distDir path="D:"dist_project" java="src" web="war"/>-->

        <templateDir path="template"/>

        <i18nSupport>true</i18nSupport>

distDir@path指目標項目的路徑,‘build’是相對路徑; @javajava source code的根目錄;

@webweb application的根目錄;

templateDir@pathfreemarker template所在的目錄,這里設定的是$Code_Engin$"template; 此目錄下放置用于生成controllerjsp的模板文件(以ftl為文件后綴);

template /lib/下面放置的一個common.ftl為通用的functions,已經用auto imports引入,要調用common.ftlfunction,通常類似:<@ce.dosth param=paramObj />, cenamespace,用于限定引用;具體代碼見(BaseGenerator.java

5) i18nSupport是指定jsp是否支持多語言;一般設定為支持的;

<package base="biz.wic" app="application">

            <domain>domain</domain>

            <controller>web</controller>

            <manager>manager</manager>

            <service>service</service>

        </package>

用于設定java codepackage

       <web layoutComponent="tiles">

            <manager>WEB-INF"applicationContext-manager.xml</manager>

            <servlet>WEB-INF"jbcc-servlet.xml</servlet>

            <security>WEB-INF"applicationContext-acegi.xml</security>

            <sqlMapConfig>WEB-INF"sql-map-config.xml</sqlMapConfig>

            <messages>WEB-INF"classes"messages.properties</messages>

            <tiles>WEB-INF"defs</tiles>

6)         </web>

3.code-engine-gears.xml配置詳解:

<?xml version="1.0" encoding="UTF-8"?>

<gears>

    <!--

    Generate model, related sqlmap manager file via abator, in most case we don't need modify the abator-config.xml;

    just add the following model node will work;

    and this model node can create more than one; model name should be unique;

    default extends is : biz.web.framework.domain.BaseEntity

    -->

    <model name="city_model" table="city" domain="City" usingLucene="false"

           extends="biz.web.framework.domain.BaseEntity" keyProperty="id"/>

    <!--

    Create *Controller and *MgrController, modify layout component like Tiles of Sitemesh;

    modify action-servlet.xml, applicationContext-*.xml

    defaultMethods@keyProperty default to "id"

    -->

    <controller name="City" springBeanDef="true" template="controller.ftl">

        <managers>CityMgr</managers>

        <!--<services support="MailService"></services>-->

        <defaultMethods refModel="city_model">

            <method name="index" style="form" view="list_city"/>

            <method name="listAll" style="ajax" />

            <method name="list" style="ajax" />

            <method name="get" style="ajax"/>

        </defaultMethods>

    </controller>

    <!-- using the option [extends] to generated Mgr controller,

        overwrite default to true;

        method view default to

        -->

    <controller name="CityMgr" springBeanDef="true" template="controller_mgr.ftl"

                extends="City" overwrite="true">

        <!--<services support="CompassService"></services>-->

        <defaultMethods refModel="city_model">

            <method name="manager" style="form" view="list_mgr_city"/>

            <method name="update" style="form" view="edit_city"/>

            <method name="create" style="form" view="edit_city"/>

            <method name="save" style="form" view="edit_city"/>

            <method name="edit" style="form" view="edit_city"/>

            <method name="delete" style="ajax"/>

        </defaultMethods>

    </controller>

    <!-- overwrite default to true;

        jsp name attribute used for jsp file name, and also used for tiles definition

    -->

    <jsp name="list_mgr_city" refController="CityMgr" template="list_mgr_jsp.ftl" overwrite="false">

        <tiles>main_layout_4</tiles>

    </jsp>

    <jsp name="edit_city" refController="CityMgr" template="edit_jsp.ftl" overwrite="false">

        <!--<tinyMCE>content</tinyMCE>-->

        <!--<tiles>main_layout_4</tiles>-->

    </jsp>

    <!--<jsp name="detail_recommend" refController="City" template="detail_jsp.ftl" overwrite="false">-->

        <!--<tinyMCE>content</tinyMCE>-->

        <!--<tiles>main_layout_1</tiles>-->

    <!--</jsp>-->

    <!--overwrite default to true;-->

    <!--<jsp name="list_city" refController="City" template="list_jsp.ftl" overwrite="false">-->

        <!--<tiles>main_layout_2</tiles>-->

    <!--</jsp>-->

</gears>

1<model> <controller><jsp> 等節點用于生成domainmanagercontrollerjsp,可配置0-n個;次序隨意; 且每個節點都有可選屬性 overwrite truefalse);

overwrite指定當目標controller文件存在時,是否要覆寫該文件,否則就生成.generated為后綴的文件;overwrite屬性是可選的,默認為true

2<controller name="CityMgr" springBeanDef="true" template="controller_mgr.ftl"

                extends="City" overwrite="true">

<managers>CityMgr</managers>

        <!--<services support="CompassService"></services>-->

        <defaultMethods refModel="city_model">

            <method name="manager" style="form" view="list_mgr_city"/>

            <method name="update" style="form" view="edit_city"/>

            <method name="create" style="form" view="edit_city"/>

            <method name="save" style="form" view="edit_city"/>

            <method name="edit" style="form" view="edit_city"/>

            <method name="delete" style="ajax"/>

        </defaultMethods>

    </controller>

這個配置看上去有些復雜,是為了提供更好的靈活性;name用于在code engine中標識controller,同時用于生成的controller.java的命名;在配置文件中應該是唯一的;

springBeanDef用于指出是否在相關的配置文件中添加spring bean的定義,比如xxx-servlet.xml等;否則只是生成controllerjava

template指定freemarker模板;

managers指定要注入manager定義;如果有多個用逗號分割;可選;

services指定要注入service定義;如果有多個用逗號分割;@support用于指定framework下的common service,比如mailcompass等;可選;

defaultMethods里面用于指定生成的controller里面的方法;refModel 指參照的model定義, method@name用于指定方法名,比如list,而且list方法是預定義寫在模板里面的; method@style指定代碼風格,可選有formajax兩種;這個風格會同時影響cotroller部分和jsp部分;

method@view指方法返回的tiles定義視圖,當然這個屬性在styleform的時候有效;可選;

e <jsp name="edit_user" refController="UserMgr" template="edit_jsp.ftl" >

        <tinyMCE>Description</tinyMCE>

        <tiles>main_layout_1</tiles>

    </jsp>

Jspname用于生成的jsp頁面的文件名,同時還是tiles的定義,在生成controller時候也是有用的;

refController就是指明jsp所參照的controller定義;通過這個refControllerjsp可以找到default_methodsstylerefModel等信息;

Template指明所使用的freemarker模板;

這里省略了overwrite屬性,overwrite屬性是可選的,默認為true

tinyMCE指定要加入tinyMCE支持,同時,所管理的屬性為‘Description’; 可選屬性;

tiles屬性定義了,此jspextendlayout,可選屬性;

f)

<model name="city_model" table="city" domain="City" usingLucene="false"

           extends="biz.web.framework.domain.BaseEntity" keyProperty="id"/>

用于生成domainmanager,和sqlmap,可以配置多個;

luceneSupport可選,如為true代表將在domainmanager以及配置文件中加入lucene的支持;

4.創建新項目

A.codeEngineRunner開始執行createNewProject(“distProject”);(將copy必需的框架文件到目標目錄,同時修改jdbc.properties等文件,同時將初始化abator-config.xml;)

B.分別用到了JDBCPropertiesModifierCodeEngineInitModifier

C.執行目標工程project目錄下的initdb.bat;初始化數據庫,加載初始系統表和數據;當然執行此步驟之前要先創建數據庫;

D.利用codeEngineRunner的從數據庫表,生成相應的文件后,使用project目錄下build.bat編譯文件;