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编译文件;