对于一个常常和代码打交道的人来说,代码重用是非常重要的。在我们开发系统时免不了会经常写些功能极其类似的代码,而这些代码若不加以管理便会使得程序变得十分臃肿,让后期的维护变得非常痛苦。软件工程师的一个目标就是通过重复使用代码来避免编写新的代码。这样做并不是因为他们懒,而是因为重新使用已有的代码可以降低成本、增加代码的可靠性并提高它们的一致性。
在SSH(Struts + Spring + Hibernate)的开发中尤其如此。在刚刚开始学SSH架构的时候,会发现经常要写一大堆雷同的代码,每个Action都如此雷同(都是什么图表呀、查询呀、翻页呀),每个Dao都是如此相似(都是什么get呀、save呀、delete呀),让人写代码的时候烦不胜烦。这么多相同的字段,类似的方法,如果在每个类中都写一次,无疑是件让崩溃的事(上个星期我还是这么做的,痛苦)。
如果在写程序时注重代码的重用,不但可以大大地提高开发效率,也让后期的修改维护轻松很多(千万别以为代码重用是复制粘贴~)。学会面向接口编程和善于利用合理的继承,才是真正的做到代码的重用。
前几天看到了一个SSH的开源应用——Micrite(http://code.google.com/p/micrite/),拿来当学习范例实在是不错,它的代码写的很漂亮(起码对我来说是的),让我学到了不少代码重用的知识(这些东西在书上应该是很难学到的)。
首先,是面向接口编程(这个就不多说啦,很好懂)。
其次,是善于利用合理的继承(记住是“合理”的基础,因为一般java的继承是有害的,见http://niyunjiu.iteye.com/blog/321401)。
例如说,我们可以让让所有的dao都继承置一个抽象类GenericDAOImpl,利用泛型编程将在Dao层常用的方法都抽象出来,这样就不用每次都痛苦的写get、save、update、delete了。利用泛型编程,实在是件大快人心的事(之前用那些List、Iterator的泛型感觉很爽,现在才发现原来自己也可写泛型编程,哈哈)。
//以下是Micrite中的GenericDAOImpl
public abstract class GenericDAOImpl<T,ID extends Serializable>
extends HibernateDaoSupport implements IGenericDAO<T, ID> {
private Class<T> persistentClass;
//泛型编程,以后直接继承就可以省写很多重复代码了
@SuppressWarnings("unchecked")
public GenericDAOImpl() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public Class<T> getPersistentClass() {
return persistentClass;
}
public void save(T entity) {
getHibernateTemplate().save(entity);
}
public void update(T entity) {
getHibernateTemplate().update(entity);
}
public void delete(T entity) {
getHibernateTemplate().delete(entity);
}
@SuppressWarnings("unchecked")
public T get(ID id) {
return (T) getHibernateTemplate().get(getPersistentClass(), id);
}
}
又例如说,我们可以让所有用到分页、图表、查询的Action都继承自一个基类GenericAction,用来包含有分页信息,自定义查询等信息,有了这种方法就不用为分页而感到烦恼了(如果每个Action都写进这些分页信息,那真是敲键盘敲到手软)。
//以下是Micrite中的GenericAction,
public class GenericAction extends ActionSupport {
private static final long serialVersionUID = -6554298643237377735L;
//以Map格式存放操作的结果,然后由struts2-json插件转换为json对象
private Map<String, Object> resultMap = new HashMap<String, Object>();
// 分页起始索引
private int start;
// 分页限制数
private int limit;
// 分页记录总数(分页中改变页码时,会传递该参数过来)
private int totalCount;
private int chartWidth = 600;
private int chartHeight = 450;
//用来保存用户自定义查询信息,也是一个代码重用的好方法,稍后再说
private SearchBean[] queryBean;
public boolean isFirstSearch() {
return totalCount == 0;
}
@SuppressWarnings("unchecked")
public void putResultList(List data) {
resultMap.put("totalCount", totalCount);
resultMap.put("success", true);
resultMap.put("data", data);
}
public void putChartResultList(JFreeChart chart) {
StandardEntityCollection entityCollection = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(entityCollection);
String filename = "";
try {
filename = ServletUtilities.saveChartAsPNG(chart, getChartWidth(), getChartHeight(), info, null);
String mapName = "map" + new Date();
String mapInfo = ChartUtilities.getImageMap(mapName, info);
resultMap.put("success", true);
resultMap.put("filename", filename);
resultMap.put("map", mapInfo);
resultMap.put("mapName", mapName);
} catch (IOException e) {
resultMap.put("success", false);
}
}
//省略Setter and Getter部分
//没有setQueryBean(),而是利用queryString来构造queryBean[],好方法呀
public void setQueryString(String queryString) {
/*SearchFactory类可根据一个String来生成queryBean,
还可用来生成Hibernate用到的DetachedCriteria,
大大简化了查询过程*/
this.queryBean = SearchFactory.getSearchTeam(queryString);
}
}
下面简单说说SearchBean,它是用来保存自定义查询的相关数据的类,结构很简单:
public class SearchBean {
//字段名称
private String name;
//字段值
private String value;
//条件关系,包含:=, <, >, <=, >=, like, in
private String relation;
//省略Setter and Getter
}
这样封装了查询的数据后可以使开发中查询过程所需的数据更方便处理,在写查询方法的时候,只需提供Class和SearchBean的参数就可以了,一个方法就可以实现多种查询功能,而且让代码更可靠更统一了(又少写了一堆代码,哈哈,不知道这种算不算重用呢?)。
下面再看看在Micrite中SearchFactory类的两个主要方法(它可将自定义查询的值封装为SearchBean数组,并动态生成Hibernate查询时所需的DetachedCriteria对象实例)
public class SearchFactory {
/**
* @param scarchBunch 格式:
* [name,value,relation],[name,value,relation],[name,value,relation]
* name: 字段名称
* value: 字段值
* relation:条件关系,包含:=, <, >, <=, >=, like, in
* @return
*/
public static SearchBean[] getSearchTeam(String scarchBunch) {
//略
}
/**
* @param entity 查询的对象类型
* @param searchBean 查询条件
* @return DetachedCriteria对象实例
*/
public static DetachedCriteria generateCriteria(Class entity, SearchBean[] searchBean) {
//略
}
}
后记:我实在不想写Struts那些什么校验、国际化、标签之类的(到处都找的到的东西)作为学习笔记,我只想随手写写学习中的想法,把一些Java编程中的一些有用的思想记录下来(我相信Struts没多久就会过时的,我看好JSF)。
分享到:
相关推荐
java学习笔记涉及了Java编程语言的方方面面,从基础知识到应用方向,从开发工具到语言特性,再到环境配置和程序运行原理,每一个知识点都为Java初学者打下了坚实的基础。 首先,Java学习笔记中提到了Java的不同开发...
【Java知识学习笔记】 在Java世界中,学习MVC、Servlet、JSP、Spring和Hibernate是成为一名合格的Web开发者的基础。下面将详细讲解这些概念及其重要性。 **一、MVC(模型-视图-控制器)** MVC是一种设计模式,...
在本学习笔记中,我们将重点关注Spring与Hibernate的整合,特别是如何利用c3p0作为数据库连接池来提高应用程序的性能和资源管理。 首先,Spring是一个强大的轻量级框架,它提供了依赖注入(DI)和面向切面编程(AOP)等...
SSH是Java Web开发中的一个经典组合,由Struts、Spring和Hibernate三个框架组成。这篇半年培训笔记主要涵盖了这三个框架的基本概念、使用方法以及它们之间的整合。以下是对每个框架的详细解释: **Struts** Struts...
### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...
【Spring 2.5 学习笔记】 在深入学习Spring 2.5的过程中,我们可以了解到一系列关键的概念和技术。首先,面向抽象编程是Spring的核心理念之一,它鼓励开发者编写可重用且松散耦合的代码,通过接口而非具体实现进行...
### JSP 学习笔记概览 #### 一、Java EE 核心十三种技术介绍 **Java EE**(Java Platform, Enterprise Edition)是Java的一个版本,专为开发企业级应用而设计。它包含了多种技术和规范,这些技术共同构建了一个...
在提供的"spring+struts集成学习笔记和项目源码"中,你将有机会深入理解这些概念,通过实际操作来学习如何将Spring的优秀特性与Struts的高效处理机制结合起来,构建出高效稳定的Web应用。源码分析和实践操作是加深...
在描述中提到的“Spring2学习笔记帮你完善管理SSH”,这里的SSH通常是指Struts、Spring和Hibernate的组合,这是一种经典的Java Web开发架构。 首先,我们来详细讲解Spring 2中的核心概念: 1. **依赖注入...
通过这些知识点的学习和实践,你可以掌握如何构建一个完整的SSH项目,包括处理用户请求、操作数据库、事务管理以及组件的松散耦合。同时,项目源码分析可以帮助你更深入理解这些技术的实际应用。
该平台采用了SSH框架(Struts+Spring+Hibernate),并结合了B/S模式(Browser/Server,浏览器/服务器模式),提供了一个不受时空限制的学习环境,使得学生可以通过网络进行Java编程的学习和练习。文章还详细阐述了...
《MLDN_J2EE框架_笔记--精华---(包括jsp struts hibernate spring)》这份压缩包文件聚焦于Java企业级开发中的核心技术,涵盖了JSP、Struts、Hibernate和Spring四大框架,它们是构建现代J2EE应用的基础。以下是这些...
### Spring框架案例学习文档笔记知识点总结 #### 面向抽象编程 - **定义**:面向抽象编程是一种软件设计原则,旨在通过抽象层隔离具体实现细节。这种方式有助于提高代码的可维护性和灵活性。 - **实践**:在Spring...
SSH(Struts、Spring、Hibernate)是Java Web开发中的一个经典企业级应用架构,它将MVC设计模式应用到Web应用的各个层次,实现了良好的分层和解耦。这篇学习总结旨在帮助读者理解和掌握SSH框架的核心理念及其在实际...
Struts 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它使得开发者能够更方便地组织和管理业务逻辑、视图和控制器。Struts通过Action类处理用户请求,并通过配置文件定义请求与Action之间的映射...
以上内容只是根据文件名进行的推测,实际的学习笔记和源码可能会提供更详细的信息,帮助读者深入了解Spring框架的各个方面。通过这些资料,开发者可以逐步掌握Spring的基本概念,进而利用Spring进行高效的企业级应用...