在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
代码
分享到:
相关推荐
3. **基于Ant+Velocity的简单代码生成器的思路与实现 - - Java - JavaEye论坛.mht**:这个文件可能是一个论坛帖子的存档,展示了使用Ant和Velocity构建代码生成器的具体步骤和案例讨论。 4. **velocity(1).rar** 和 ...
所以准确的讲:FCG不是个代码生成器,而是用来开发代码生成器的基础平台. <br/> FCG相比其他生成器,有很多不一样的东西.下面列出FCG几点特性. <br/>1. FCG采用plugin设计体系,一个具体软件架构的生成...
### 知识点一:Apache Velocity 概述与发展历程 - **Apache Velocity**是一种用于Java应用程序的模板引擎,它能够使Web开发人员高效地创建动态HTML网页和其他类型的文档。 - **版本**: Apache Velocity 1.3.x是该书...
对于不满足现成工具的特定需求,开发者也可以编写自己的代码生成器。使用JDBC API获取数据库表信息,结合模板引擎(如FreeMarker或Velocity),生成定制化的Java类。这种方式虽然复杂,但具有更高的灵活性。 4. **...
这个框架提供了项目生成器,使用Maven的archetype插件来创建符合特定规范的项目结构。SpringSide3.0使用Velocity语法的项目模板,生成的项目包括运行所需的配置文件和示例代码。 在开始使用SpringSide3之前,需要...
26. **commonclipse**:基于Apache Commons Lang的代码生成插件,简化常见方法的编写。 27. **AntView**:运行Ant构建文件的插件,方便项目构建管理。 28. **StrutsIDE**:Struts框架的集成开发环境,图形化管理...
- `antlr-2.7.6.jar`是ANTLR,一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。 - `velocity-1.4.jar`是Velocity模板引擎,它可以用来生成HTML、XML等格式的输出,与Spring的视图层...
13. **Implementors**:在追踪代码时,可以直接跳转到方法的具体实现,而非接口。 14. **Call Hierarchy**:展示方法的调用层次结构,便于理解代码间的依赖关系。 15. **EclipseTidy**:基于HTML Tidy,提供HTML和...
在Spring MVC项目中,Ant主要用来编译源代码、生成WAR文件等。 - **配置build.xml**:Ant的工作基于一个XML文件——build.xml,其中定义了各种任务(target)及其依赖关系。 - **编译源码**:使用`<javac>`任务...
10. JSP与Velocity模板:JSP(Java Server Pages)是用于创建动态网页的技术,而Velocity是一个模板引擎,可以用于生成动态内容。 11. 校验机制:本教程介绍使用CommonsValidator来对用户输入进行校验,以确保数据...
2. **创建项目目录和Ant Build文件**:使用Equinox提供的脚本工具创建项目的基本目录结构,并生成Ant Build文件,简化构建过程。 - **项目目录结构**:Equinox为项目提供了基本的目录结构,包括源码、测试代码、...
12. **使用逻辑标签**:Struts提供的逻辑标签(如`<logic:iterate>`、`<logic:equal>`等)可以方便地在JSP页面中实现逻辑控制,避免过多的脚本语言代码。 通过以上步骤的学习,开发者可以掌握基本的Struts应用开发...
_velocity是一种模板引擎,可以用于生成Web页面的动态内容。 最后,我们会添加验证功能,使用CommonsValidator来确保用户输入的数据是有效且安全的。通过这些步骤,我们将完成一个基本的Spring应用程序的开发,并...
16. **Jelly**: Jelly是一个基于XML的脚本和处理引擎,可以用于命令行、Ant或Servlet环境,类似于JSP和Velocity的结合。 17. **Jexl**: Jexl是一个表达式语言,扩展了JSTL,并借鉴了Velocity的经验,可以用于Java...
基于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. 关于...
Spring MVC是Spring框架的一部分,它是一种成熟的、功能丰富的基于动作-响应模型的Web框架,广泛用于处理各种与用户界面(UI)相关和与用户界面无关的Web层用例。Spring MVC以其灵活性、易用性和高度的可配置性而...