在SSH项目中,我们应用了service layer模式,所以针对一个模块,它就存在pojo、dao、daoImpl、service、serviceImpl,再到struts中的action、form。假设设计是面向数据库的,针对一个数据库表,那么就要产生7个java文件,如果还要做异常处理,那么就是8个java文件。如果数据库有50个表,那么就是50*8=400个java文件。工程不小。
至于为什么要用service layer模式,论坛上已有讨论http://www.iteye.com/topic/29867
然而我们都知道,web中出现最多的操作是CURD,这400个java文件中有多少代码是重复的?几乎占了80%甚至更多。编写这样重复的代码是很枯燥无味的,而且如果是由不同人负责不同的模块的分工方式,程序员编码的风格是各不相同(虽然可能有规范约束,但是最后出来的东西还是避免不了的带有程序员个人风格的)。
所以为了节省时间和精力,便做一个程序来生成程序。
只要配置好你的项目名,你的模块名,模块路径,就可以在几秒之内完成一个模块的CURD代码,同时你可以自定义模板。
这是工具的大概设计思路:
由ant处理编译、生成目录的工作,velocity处理程序模板,contentEngine为核心处理程序。
产生的目录结构和代码路径:
模块名
--子模块1
----model
------businessobject
------dao
--------hibernate
----service
------impl
----view
------action
------form
----Exception
--子模块2
...
其中model/businessobject中是pojo和hbm.xml,这个由hibernate工具根据数据库表产生。
我们假设模块名为course,子模块名为table,类名为CourseMember。因篇幅问题,我们只看一个daoImpl的例子。
首先我们利用建立一个daoImpl的模板
ObjectDaoHibernateImpl.vm
代码
- ${package_Hibernate}
- ${import_SQLException}
- ${import_List}
- ${import_HibernateCallback}
- ${import_HibernateObjectRetrievalFailureException}
- ${import_HibernateDaoSupport}
- ${import_HibernateException}
- ${import_Query}
- ${import_Session}
- ${import_ObjectNameDao}
- ${import_ObjectName}
- ${import_Finder}
- ${import_Page}
- ${import_Criteria}
- ${import_Projections}
-
- /**
- * The Hibernate implementation of the <code>${ObjectName}Dao</code>.
- *
- * @author ${Author}
- * @see ${ObjectName}Dao
- */
- public class ${ObjectName}DaoHibernateImpl extends HibernateDaoSupport implements ${ObjectName}Dao {
- /**
- * Default constructor.
- */
- public ${ObjectName}DaoHibernateImpl() {
- super();
- }
-
- /**
- * @see ${ObjectName}Dao#save${ObjectName}(${ObjectName})
- */
- public ${ObjectName} save${ObjectName}(${ObjectName} ${objectname}) {
- this.getHibernateTemplate().save(${objectname});
- return ${objectname};
- }
-
- /**
- * @see ${ObjectName}Dao#get${ObjectName}(String)
- */
- public ${ObjectName} get${ObjectName}(String id) {
- return (${ObjectName})this.getHibernateTemplate().load(${ObjectName}.class, id);
- }
-
- /**
- * @see ${ObjectName}Dao#update${ObjectName}(${ObjectName})
- */
- public void update${ObjectName}(${ObjectName} ${objectname}) {
- this.getHibernateTemplate().update(${objectname});
- }
-
- /**
- * @see ${ObjectName}Dao#delete${ObjectName}(${ObjectName})
- */
- public void delete${ObjectName}(${ObjectName} ${objectname}) {
- this.getHibernateTemplate().delete(${objectname});
- }
-
- /**
- * @see ${ObjectName}Dao#getAll${ObjectName}s()
- */
- public List getAll${ObjectName}s() {
- return getHibernateTemplate().executeFind(new HibernateCallback() {
- public Object doInHibernate(Session session)
- throws HibernateException, SQLException {
-
- StringBuffer sb = new StringBuffer(100);
- //sb.append("select distinct ${objectname} ");
- sb.append("SELECT ${objectname} ");
- sb.append("FROM ${ObjectName} ${objectname} ");
- sb.append("order by ${objectname}.id");
-
- Query query = session.createQuery(sb.toString());
- List list = query.list() ;
-
- return list;
- }
- });
- }
-
-
-
- public Object query(final ${ObjectName} ${objectname},
- final int pageNo, final int maxResult) {
- return getHibernateTemplate().execute(new HibernateCallback() {
- public Object doInHibernate(Session session)
- throws HibernateException, SQLException {
- Criteria criteria=session.createCriteria(${ObjectName}.class);
- Criteria anothercriteria=session.createCriteria(${ObjectName}.class);
- criteria.setProjection(Projections.rowCount());
-
- // if (!${objectname}.get${objectname}Name().equals("")
- // && ${objectname}.get${objectname}Name() != null) {
- // criteria.add(Expression.ilike("contactName","%"+customerContactForm.getContactName()+"%"));
- // anothercriteria.add(Expression.ilike("contactName","%"+customerContactForm.getContactName()+"%"));
- // }
- Integer count=(Integer)criteria.uniqueResult();
- List list=anothercriteria.setFirstResult((pageNo-1)*maxResult).setMaxResults(maxResult).list();
- Page page=new Page(count.intValue(), maxResult, pageNo);
- return new Finder(list, page);
- }
- });
- }
-
- public boolean deleteBybatch(final String[] chxSong) {
- StringBuffer cusIdList = new StringBuffer(200);
- cusIdList.append("delete from ${ObjectName} where ${objectName}No=");
- for (int i = 0; i < chxSong.length; i++) {
- if (i == 0)
- cusIdList.append(chxSong[i]);
- else
- cusIdList.append(" or ${objectName}No=" + chxSong[i]);
- }
- this.getSession().createQuery(cusIdList.toString()).executeUpdate();
- return true;
- }
-
- }
<script type="text/javascript">render_code();</script>
声明:
1)其中${}是模板语言中的变量,变量的来源一是通过对应的.properties文件,另外是通过参数传递。
2)注释部分因是分页查询条件,这个涉及到具体字段,无法预知,所以需要在产生代码之后程序员根据查询条件自行修改。另外也涉及到个人项目的分页方法,这个根据具体情况自定义模板。
template.properties
公共属性文件,是所有template文件(.vm)的变量声明处,这个会在后面代码中进行设置。
对于属性文件,可有两种方式:
一是针对每一个template模板文件都建立一个属性文件,优点是在后面ant中设置的参数就少了,而且方便修改。缺点是模板文件数量增多,另外公共部分声明重复。
二是设定一个公共属性文件,将特定的变量交给参数传递。
我们这里先用公共属性文件的方式。
代码
- Author = Cmas R&D Team
- import_Arraylist = import java.util.ArrayList;
- import_List = import java.util.List;
- import_Set = import java.util.Set;
- import_FacesException = import javax.faces.FacesException;
- import_BeanUtils = import org.apache.commons.beanutils.BeanUtils;
- import_Log = import org.apache.commons.logging.Log;
- import_LogFactory = import org.apache.commons.logging.LogFactory;
- import_SQLException = import java.sql.SQLException;
- import_HibernateCallback = import org.springframework.orm.hibernate3.HibernateCallback;
- import_HibernateObjectRetrievalFailureException = import org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException;
- import_HibernateDaoSupport = import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import_HibernateException = import org.hibernate.HibernateException;
- import_Query = import org.hibernate.Query;
- import_Session = import org.hibernate.Session;
- import_Map = import java.util.Map;
- import_HashMap = import java.util.HashMap;
- import_Iterator = import java.util.Iterator;
- import_Criteria=import org.hibernate.Criteria;
- import_Projections=import org.hibernate.criterion.Projections;
- import_DispatchActionSupport=import org.springframework.web.struts.DispatchActionSupport;
- import_Action=import org.apache.struts.action.*;
- import_HttpServletRequest=import javax.servlet.http.HttpServletRequest;
- import_HttpServletResponse=import javax.servlet.http.HttpServletResponse;
- import_BeanUtils=import org.apache.commons.beanutils.BeanUtils;
- import_DataIntegrity=import org.springframework.dao.DataIntegrityViolationException;
接下来是ant部分,我们编写build.xml
build.xml
代码
分享到:
相关推荐
入门文档及应用源码,很适合做自动代码生成 包括:Velocity的中文指南\ velocity中文手册\ \基于Ant+Velocity的简单代码生成器的思路与实现
该代码生成工具说明: 1.实现模板的灵活配置; 2.支持DB2、MySQL、HSQL、PostgreSQL、SQLServer2005、Oracle...3.建议先用已有的模板进行简单代码的生成测试,待掌握后可进行灵活配置。 快速的开发,其实就是这么简单。
所以准确的讲:FCG不是个代码生成器,而是用来开发代码生成器的基础平台. <br/> FCG相比其他生成器,有很多不一样的东西.下面列出FCG几点特性. <br/>1. FCG采用plugin设计体系,一个具体软件架构的生成...
站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2. 定义Simple Weather项目 4.2.1. Yahoo! Weather RSS 4.3. 创建Simple Weather...
基于Velocity的渲染器/生成器(Velocity based renderer/generator) 15.3. 映射文件生成器(Mapping File Generation) 15.3.1. 运行此工具 16. 示例:父子关系(Parent Child Relationships) 16.1. 关于...
基于Velocity的渲染器/生成器(Velocity based renderer/generator) 15.3. 映射文件生成器(Mapping File Generation) 15.3.1. 运行此工具 16. 示例:父子关系(Parent Child Relationships) 16.1. 关于...
5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的...
Pamda是MDA工具(UML到代码生成器)。 它使用UML API解析XMI,因此,与某些其他MDA工具不同,它对XMI扩展很宽容。 作为Ant任务实现,并使用Velocity模板引擎。 经过Enterprise Architect生产的XMI的测试。
将Salesforce Force.com API集成到Apache Velocity中。 提供在模板语言中使用的Ant任务和许多Velocity工具。 可以编写模板以从“自定义对象”元数据生成代码,HTML,数据加载器脚本等。
VeloGen是用Java编写的自定义源生成器,它使用velocity和antlr。 Antlr解析的AST语法被包装并放入Velocity上下文中。 用于生成源的模板以速度模板语言(VTL)编写。 从ANT任务中调用它。