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編譯文件;