以前曾考慮過簡化web框架,很大原因是struts的配置特麻煩,大致也做了個開始。然。。。自己清楚得很,自己畢竟不是大師,而且畢竟要掙錢糊口。客觀上沒那個條件能做出非常完美和具有通用性,并且能夠被廣泛接受的框架。至多能做出一個比較有特色的,在某個領域比較簡單的東西,就好比機械化時代后的手工刀,只能自己欣賞把玩而已。
相比之下,對于自動代碼生成的思考,則無疑更有實用意義。在實際工作中,我們會發現做了很多重復的東西。經常粘貼代碼就說明:代碼出現了重復。我總相信:每段代碼都是獨一無二的,把代碼寫的這么重復累贅,代碼就已經不再是藝術品,我們的工作也變得乏味無趣。
解決這個問題,我有兩個思路:若采用自己的簡化框架,則可能靈活性不夠,且也沒法與市場,與工業化的軟件環境接軌,就仿佛火器時代的劍客,這是死路。則,看看自動代碼生成的構想:
我們所做的應用,最簡單也最常見的為針對實體對象的:create ,read ,update, delete,query(list).
按目前我公司的struts標準框架,有:dao/bo/action(form)/jsp +資源文件和配置文件
使用spring為配置工具,Velocity為模板引擎。
截圖有點麻煩,這里就懶一點。大致的思路,是完整地進行對pojo的描述,然后指定相關模板,最后組織為任務組,進行批量執行代碼生成。附上spring配置,可以看出思路:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="commTask" class="com.shen.autocode.task.CommTask" abstract="true">
<property name="pojo" ref="pojoDesc" />
<property name="path" value="f:/test/" />
</bean>
<bean id="commModifer" class="com.shen.autocode.task.CommPathModifer" abstract="true" />
<bean id="taskSet" class="com.shen.autocode.task.TaskSet">
<property name="tasks">
<list>
<!-- dao/model -->
<bean parent="commTask">
<property name="name" value="dao" />
<property name="template" value="vm/auto/dao.vm" />
<property name="extend" value="#/dao/##DAO.java" />
</bean>
<bean parent="commTask">
<property name="name" value="dao" />
<property name="template" value="vm/auto/model.vm" />
<property name="extend" value="#/dao/##Model.java" />
</bean>
<!-- bo -->
<bean parent="commTask">
<property name="name" value="bo" />
<property name="template" value="vm/auto/bean.vm" />
<property name="extend" value="#/domain/##Bean.java" />
</bean>
<bean parent="commTask">
<property name="name" value="bo" />
<property name="template" value="vm/auto/bo.vm" />
<property name="extend" value="#/domain/##BO.java" />
</bean>
<!-- action c2 r1 u2 d1 q2 ,以及form,以及action的csv列表準備加權限 -->
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_c1.vm" />
<property name="extend" value="#/action/##CreateShowAction.java" />
</bean>
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_c2.vm" />
<property name="extend" value="#/action/##CreateAction.java" />
</bean>
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_r.vm" />
<property name="extend" value="#/action/##ViewAction.java" />
</bean>
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_u1.vm" />
<property name="extend" value="#/action/##UpdateShowAction.java" />
</bean>
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_u2.vm" />
<property name="extend" value="#/action/##UpdateAction.java" />
</bean>
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_d.vm" />
<property name="extend" value="#/action/##DeleteAction.java" />
</bean>
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_q1.vm" />
<property name="extend" value="#/action/##SearchAction.java" />
</bean>
<bean parent="commTask">
<property name="name" value="action" />
<property name="template" value="vm/auto/action_q2.vm" />
<property name="extend" value="#/action/##ListAction.java" />
</bean>
<!-- jsp 以及資源文件-->

</list>
</property>
</bean>

</beans>

以及定義pojo的配置示例
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 對于實體對象的定義 -->
<bean id = "pojo" class = "com.shen.autocode.entity.PojoDesc" abstract="true"/>
<bean id = "field" class = "com.shen.autocode.entity.FieldDesc" abstract="true"/>
<bean id="pojoDesc" parent="pojo">
<property name="task" value="/dao/bo/action/jsp/"/>
<property name="name" value="asset" />
<property name="chName" value="資產" />
<property name="dbName" value="T_ASSET" />
<property name="fields">
<list>
<bean parent="field">
<property name="name" value="id" />
<property name="chName" value="編號" />
<property name="dbName" value="ASSET_ID" />
<property name="type" value="1" />
<property name="length" value="0" />
</bean>
<bean parent="field">
<property name="name" value="name" />
<property name="chName" value="名稱" />
<property name="dbName" value="ASSET_Name" />
<property name="type" value="0" />
<property name="length" value="10" />
</bean>
</list>
</property>
</bean></beans>

如上,加上velocity模板,一個簡單的自動生成代碼的引擎就可以運作了
相比之下,對于自動代碼生成的思考,則無疑更有實用意義。在實際工作中,我們會發現做了很多重復的東西。經常粘貼代碼就說明:代碼出現了重復。我總相信:每段代碼都是獨一無二的,把代碼寫的這么重復累贅,代碼就已經不再是藝術品,我們的工作也變得乏味無趣。
解決這個問題,我有兩個思路:若采用自己的簡化框架,則可能靈活性不夠,且也沒法與市場,與工業化的軟件環境接軌,就仿佛火器時代的劍客,這是死路。則,看看自動代碼生成的構想:
我們所做的應用,最簡單也最常見的為針對實體對象的:create ,read ,update, delete,query(list).
按目前我公司的struts標準框架,有:dao/bo/action(form)/jsp +資源文件和配置文件
使用spring為配置工具,Velocity為模板引擎。
截圖有點麻煩,這里就懶一點。大致的思路,是完整地進行對pojo的描述,然后指定相關模板,最后組織為任務組,進行批量執行代碼生成。附上spring配置,可以看出思路:


















































































以及定義pojo的配置示例
































如上,加上velocity模板,一個簡單的自動生成代碼的引擎就可以運作了