Version 1.3
1.
基本组成:
a)
运行入口CodeEngineRunner的main();里面注册所有的Generator;主要有:IbatisGenerator,ControllerGenerator,JSPGenerator三个;任意一个可以单独运行多次;
b)
代码结构:*Generator,用于生成domain,manager和sqlmap,controller等文件,在生成之后为了保持系统的完整性,通常会调用一些Modifier去修改配置文件;由于每个Generator会单独再次访问配置文件,所以可以单独和重复生成;
c)
主要的配置文件有2个,位于code_engine目录下,分别为:code-engine-config.xml,code-engine-gears.xml,但在实际使用中,我们经常要配置的是code-engine-gears.xml,前者一般在项目开始的时候设定,后者用来生成和修改domain,manager和sqlmap, controller,jsp和相关的一些配置文件;
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’是相对路径; @java指java source code的根目录;
@web指web application的根目录;
templateDir@path指freemarker template所在的目录,这里设定的是$Code_Engin$"template; 此目录下放置用于生成controller和jsp的模板文件(以ftl为文件后缀);
template /lib/下面放置的一个common.ftl为通用的functions,已经用auto imports引入,要调用common.ftl的function,通常类似:<@ce.dosth param=paramObj
/>, ce是namespace,用于限定引用;具体代码见(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 code的package;
<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> 等节点用于生成domain,manager,controller和jsp,可配置0-n个;次序随意; 且每个节点都有可选属性 overwrite (true、false);
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等;否则只是生成controller的java;
template指定freemarker模板;
managers指定要注入manager定义;如果有多个用逗号分割;可选;
services指定要注入service定义;如果有多个用逗号分割;@support用于指定framework下的common service,比如mail,compass等;可选;
defaultMethods里面用于指定生成的controller里面的方法;refModel 指参照的model定义, method@name用于指定方法名,比如list,而且list方法是预定义写在模板里面的; method@style指定代码风格,可选有form,ajax两种;这个风格会同时影响cotroller部分和jsp部分;
method@view指方法返回的tiles定义视图,当然这个属性在style是form的时候有效;可选;
e)
<jsp name="edit_user" refController="UserMgr"
template="edit_jsp.ftl" >
<tinyMCE>Description</tinyMCE>
<tiles>main_layout_1</tiles>
</jsp>
Jsp的name用于生成的jsp页面的文件名,同时还是tiles的定义,在生成controller时候也是有用的;
refController就是指明jsp所参照的controller定义;通过这个refController,jsp可以找到default_methods的style,refModel等信息;
Template指明所使用的freemarker模板;
这里省略了overwrite属性,overwrite属性是可选的,默认为true;
tinyMCE指定要加入tinyMCE支持,同时,所管理的属性为‘Description’; 可选属性;
tiles属性定义了,此jsp所extend的layout,可选属性;
f)
<model name="city_model"
table="city" domain="City" usingLucene="false"
extends="biz.web.framework.domain.BaseEntity"
keyProperty="id"/>
用于生成domain,manager,和sqlmap,可以配置多个;
luceneSupport可选,如为true代表将在domain和manager以及配置文件中加入lucene的支持;
4.创建新项目
A.从codeEngineRunner开始执行createNewProject(“distProject”);(将copy必需的框架文件到目标目录,同时修改jdbc.properties等文件,同时将初始化abator-config.xml;)
B.分别用到了JDBCPropertiesModifier和CodeEngineInitModifier;
C.执行目标工程project目录下的initdb.bat;初始化数据库,加载初始系统表和数据;当然执行此步骤之前要先创建数据库;
D.利用codeEngineRunner的从数据库表,生成相应的文件后,使用project目录下build.bat编译文件;