`
devil13th
  • 浏览: 43408 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

这样的J2EE SSH框架结构如何大家伙评评

阅读更多

先看一下结构图(点击下图看大图)

 

 说明:

红色部门是DAO

蓝色部门是SERVICE

绿色部门是ACTION(或是Spring的Controller)

 

DAO部分说明

BaseDao是基类,所有的DAO都继承此BaseDao,BaseDao继承了HibernateDaoSupport,用HibernateTemplate实现了一些基础的方法(插删改查),以下是代码

package com.thd.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.thd.bean.Page;
import com.thd.util.MyBeanUtils;

public class BaseDao extends HibernateDaoSupport {
	/**
	 * @description 保存对象
	 * @param obj 保存的对象
	 */
	public void save(Object obj) {
		this.getHibernateTemplate().save(obj);
	};
	
	/**
	 * @description 更新对象
	 * @param obj 更新的对象
	 */
	public void update(Object obj) {
		this.getHibernateTemplate().update(obj);
	}
	
	/**
	 * @description 根据参数对象更新数据库对象
	 * @param original 根据此对象不为空的属性更新数据库中的对象
	 * @param id 需要更新对象的id
	 * @param nullProperties 需要设置为空的属性
	 * @throws Exception
	 */
	public void update(Object original,Serializable id,String[] nullProperties) throws Exception{
		Object dest = this.findById(original.getClass(), id);
		MyBeanUtils.copyNotNullProperties(dest, original);
		MyBeanUtils.setObjNullProperties(dest, nullProperties);
		this.getHibernateTemplate().update(dest);
	}
	
	/**
	 * @description 删除对象
	 * @param obj 删除的对象 对象要有主键
	 */
	public void delete(Object obj) {
		this.getHibernateTemplate().delete(obj);
	}
	
	/**
	 * @description 根据id删除对象
	 * @param c 删除的对象类型
	 * @param id 删除的对象的主键
	 */
	public void delete(Class c,Serializable id){
		Object obj = findById(c,id);
		this.delete(obj);
	}
	
	/**
	 * @description 保存或更新对象
	 * @param obj 保存或更新的对象 有主键则是更新 没有主键则是保存
	 */
	public void saveOrUpdate(Object obj){
		this.getHibernateTemplate().saveOrUpdate(obj);
	}
	
	/**
	 * @description 根据id查找对象
	 * @param c 对象的类
	 * @param id 对象的id
	 * @return 
	 */
	@SuppressWarnings("unchecked")
	public Object findById(Class c,Serializable id){
		return this.getHibernateTemplate().get(c, id);
	}
	
	
	/**
	 * @description hql基础查询
	 * @param hql hql查询语句
	 * @param params 条件的值,对应hql中的"?"
	 * @param currPage 当前页
	 * @param pageSIze 每页显示条目数量
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Object> findByHql(final String hql,final Object[] params,final int currPage,final int pageSize) {
		return this.getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session) {
				Query query = session.createQuery(hql);
				if(params!=null && params.length>0){
					for(int i = 0 , j = params.length ; i < j ; i++){
						query.setParameter(i,params[i]);
					}
				}
				if (currPage >= 1 && pageSize >= 1) {
					query.setFirstResult((currPage - 1) * pageSize);
					query.setMaxResults(pageSize);
				}
				return query.list();
			}
		});
	}
	
	
	/**
	 * @description 无参数的hql全部记录查询
	 * @param hql hql语句
	 * @return
	 */
	public List findByHql(String hql){
		return findByHql(hql,null,0,0);
	}
	
	/**
	 * @description 带有参数的hql全部记录查询
	 * @param hql hql语句
	 * @param params  条件的值,对应hql中的"?"
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Object> findByHql(final String hql,final Object[] params) {
		return findByHql(hql,params,0,0);
	}
	
	/**
	 * @description 不带参数的hql分页查询
	 * @param hql hql语句
	 * @param currPage 当前页
	 * @param pageSize 每页显示条目数量
	 * @return
	 */
	public List<Object> findByHql(String hql,int currPage,int pageSize) {
		return findByHql(hql,null,currPage,pageSize);
	}
	
	
	/**
	 * @description sql基础查询
	 * @param sql sql语句
	 * @param params 条件的值,对应sql语句中的"?"
	 * @param currPage 当前页
	 * @param pageSize 每页显示条目数量
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Object> findBySql( final String sql,final Object[] params,final int currPage, final int pageSize) {
		return this.getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session s) throws HibernateException,SQLException {
				Query query = s.createSQLQuery(sql);
				if(params!=null && params.length>0){
					for(int i = 0 , j = params.length ; i < j ; i++){
						query.setParameter(i,params[i]);
					}
				}
				if (currPage >= 1  && pageSize >= 1) {
					query.setFirstResult((currPage - 1) * pageSize);
					query.setMaxResults(pageSize);
				}
				List list = query.list();
				return list;
			}
		});
	}
	
	/**
	 * @description 不带参数的sql全部记录查询
	 * @param sql sql语句
	 * @return
	 */
	public List<Object> findBySql(final String sql) {
		return this.findBySql(sql, null, 0, 0);
	}
	
	
	/**
	 * @description 带参数的sql全部记录查询
	 * @param sql
	 * @param params
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Object> findBySql(final String sql,final Object[] params) {
		return this.findBySql(sql, params, 0, 0);
	}
	
	/**
	 * 不带参数的sql分页查询
	 * @param sql sql语句
	 * @param currPage 当前页
	 * @param pageSize 每页显示条目数量
	 */
	public List<Object> findBySql(final String sql,int currPage,int pageSize) {
		return this.findBySql(sql, null, currPage, pageSize);
	}
	
	/**
	 * @description 执行sql语句
	 * @param sql
	 */
	@SuppressWarnings("unchecked")
	public void executeSql(final String sql) {
		this.getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session) {
				Query query = session.createSQLQuery(sql);
				query.executeUpdate();
				return null;
			}
		});
	}
	
	
	/**
	 * @description 执行带"?"的sql语句
	 * @param sql sql语句
	 * @param params 条件的值,对应sql语句中的"?"
	 */
	@SuppressWarnings("unchecked")
	public void executeSql(final String sql,final Object[] params) {
		this.getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session) {
				Query query = session.createSQLQuery(sql);
				if(params!=null && params.length>0){
					for(int i = 0 , j = params.length ; i < j ; i++){
						query.setParameter(i,params[i]);
					}
				}
				query.executeUpdate();
				return null;
			}
		});
	}
	
	public Object getOne(List<Object> l ){
		if( (l!=null) && !l.isEmpty()){
			if(l.get(0)!=null){
				return l.get(0);
			}else{
				return null;
			}			
		}else{
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List pageSQL(String sql,Object[] obj,Page page){
		List allResult = this.findBySql(sql, obj);
		if (allResult != null && !allResult.isEmpty()) {
			int rowsNum = allResult.size();
			int temp = rowsNum % page.getPageSize(); // 取模
			int pageNum = 0;
			if (temp > 0) {// 如果有余数
				pageNum = rowsNum / page.getPageSize() + 1;
			} else if (temp == 0)
				pageNum = rowsNum / page.getPageSize();
			page.setListSize(rowsNum);// 设置总记录条数
			page.setMaxPage(pageNum);// 设置最大页数
			return this.findBySql(sql.toString(), obj, page.getCurrentPage(), page
					.getPageSize());
		} else {
			page.setListSize(0);
			page.setMaxPage(0);
			page.setCurrentPage(1);
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List pageHQL(String hql,Object[] obj,Page page){
		List allResult = this.findByHql(hql, obj);
		if (allResult != null && !allResult.isEmpty()) {
			int rowsNum = allResult.size();
			int temp = rowsNum % page.getPageSize(); // 取模
			int pageNum = 0;
			if (temp > 0) {// 如果有余数
				pageNum = rowsNum / page.getPageSize() + 1;
			} else if (temp == 0)
				pageNum = rowsNum / page.getPageSize();
			page.setListSize(rowsNum);// 设置总记录条数
			page.setMaxPage(pageNum);// 设置最大页数
			return this.findByHql(hql.toString(), obj, page.getCurrentPage(), page
					.getPageSize());
		} else {
			page.setListSize(0);
			page.setMaxPage(0);
			page.setCurrentPage(1);
			return null;
		}
	}
	
	
}
 

对于所有模块的DAO,Spring配置中都注入到了DaoFactory中,DaoFactory代码如下

package com.thd.dao;

import com.thd.dao.tree.TreeDao;
import com.thd.dao.user.UserDao;

public class DaoFactory {
	private UserDao userDao;
	private TreeDao treeDao;
	public TreeDao getTreeDao() {
		return treeDao;
	}

	public void setTreeDao(TreeDao treeDao) {
		this.treeDao = treeDao;
	}

	public UserDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}

 DaoFactory中有所有模块的DAO提供给Service使用。

 

 

SERVICE部门说明

BaseServiceImpl是所有模块Service的基类,BaseServiceImpl有DaoFactory的引用 还有ServiceFactory的引用(因为有可能一个Service调用另外一个Service的方法,所以引用了ServiceFactory,ServiceFactory在下面有说明),所有模块的Service继承BaseServiceImpl后就可以拿到所有的DAO和Service。ServiceFactory分为两种IocServiceFactoryImpl和InjectionServiceFactoryImpl,他们都实现了ServiceFactory接口(此接口有所有模块Service的Setter Getter方法),只不过Getter方式不同,一个是通过Spring IOC容器注入然后获取Service Bean,一个是通过代码拿到Spring IOC中的Service Bean.ServiceFactory的实现注入到BaseServiceImpl以提供给所有模块的Service。

 

IocServiceFactoryImpl的代码如下:

package com.thd.serviceimpl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.thd.service.ServiceFactory;
import com.thd.service.tree.TreeService;
import com.thd.service.user.UserService;
/**
 * @description 此类是通过从Spring ioc容器中直接获取service的封装
 * 
 */
public class IocServiceFactoryImpl implements ServiceFactory {
	
	private ApplicationContext factory=new ClassPathXmlApplicationContext("classpath:appContext-*.xml");   
	
	public UserService getUserService(){
		return (UserService)factory.getBean("userService");
	};
	
	public TreeService getTreeService(){
		return (TreeService)factory.getBean("treeService");
	};
	
	
	

}
 

InjectionServiceFactoryImpl的代码如下:

package com.thd.serviceimpl;

import com.thd.service.ServiceFactory;
import com.thd.service.tree.TreeService;
import com.thd.service.user.UserService;
/**
 * @description 此类是通过注入的方式来封装所有的service
 *
 */
public class InjectionServiceFactoryImpl implements ServiceFactory{
	private UserService userService;
	private TreeService treeService;
	public TreeService getTreeService() {
		return treeService;
	}
	public void setTreeService(TreeService treeService) {
		this.treeService = treeService;
	}
	public UserService getUserService() {
		return userService;
	}
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
}
 

 

 

Action部分说明

ServiceFactory被注入到PubAction ,所有模块的Action继承PubAction获取ServiceFactory来拿到所有的Service。

 

最后事务切的是Service层

 

这样配置后 所有模块的Action可以拿到所有模块的Service来进行操作,模块的Service可以拿到所有的DAO,以及可以做到Service之前的相互调用,我感觉很方便

 

附件中是源码和图片

 

大家评评这么配置的优点和缺点,有什么地方还有不足的还望指教

 

  • 描述: SSH框架结构
  • 大小: 110.1 KB
分享到:
评论

相关推荐

    J2EE SSH框架整合教程

    《J2EE SSH框架整合详解》 在Java企业级开发中,SSH(Struts、Spring、Hibernate)框架的整合是常见的技术实践,它能够提供强大的表现层、业务逻辑层和数据持久化层的支持。SSH框架整合的核心在于如何将这三个框架...

    j2ee ssh 框架整合

    在IT行业中,SSH框架是Java企业级开发中的一个重要组合,主要由Spring、Struts和Hibernate三个框架构成。这个"j2ee ssh 框架整合"主题深入...学习并实践这样的整合案例,有助于开发者更好地理解和掌握SSH框架的应用。

    j2ee的SSH框架整合(coding和jar包)

    在Java企业级开发中,SSH框架整合是相当关键的一个环节,它涉及到Spring、Struts和Hibernate这三个主流的开源框架。SSH框架的整合可以提供强大的业务逻辑处理能力,以及高效的持久层支持,使得开发者能更专注于业务...

    J2EE SSH 架构经典结合

    J2ee Struts,Spring Framework,Hibernate 经典结合,项目源码。控制层、数据层、业务层分层 架构经典搭配,学习、研究的好东西。

    J2EE SSH2架构(2)

    在IT行业中,SSH2(Struts2、Spring、Hibernate)是一种经典的Java企业级应用开发框架组合,用于构建高效、可维护且易于扩展的Web应用程序。本篇将详细讲解J2EE SSH2架构的设计原理和整合过程,以及Struts2.1.8、...

    J2EE流行框架(SSH)

    ### J2EE流行框架(SSH)详解:Struts、Hibernate、Spring 在现代软件开发领域,尤其是企业级应用开发中,Java技术栈以其强大的生态体系和成熟的技术解决方案,占据着举足轻重的地位。其中,Struts、Hibernate、...

    J2EE包含SSH框架

    此ppt主要讲解了J2EE,包括SSH框架,以及具体的操作和代码

    J2EE SSH2架构(1)

    以下是这三大框架的核心概念和它们在J2EE SSH2架构中的作用。 1. **Spring框架** Spring是Java企业级应用的核心框架,它提供了一个全面的编程和配置模型,简化了Java应用的开发。在SSH2架构中,Spring主要负责依赖...

    j2ee框架笔记详细介绍j2ee的框架结构

    **J2EE框架详解——构建企业级应用的基石** J2EE(Java 2 Platform, ...通过理解J2EE框架结构及其组件,开发者可以更好地组织代码,实现模块化开发,并有效地利用服务器资源,构建出高性能、可维护的企业级应用。

    j2ee ssh 框架

    这个框架组合提供了一种高效、灵活且可扩展的解决方案,用于构建基于J2EE的应用程序。本篇文章将深入探讨SSH框架的每一个组成部分,并通过一个简单的实例来展示它们如何协同工作。 **Spring框架** Spring是一个全面...

    j2ee的ssh框架的搭建和性能优化本科毕业(设计)论文.doc

    2. SSH 框架结构 SSH 框架是由 Spring、Struts 和 Hibernate 三个主要组件组成的。其中,Spring 提供了 IoC 容器和 AOP 功能,Struts 负责处理用户请求和视图渲染,Hibernate 负责数据库持久层的操作。 3. Spring ...

    J2EE SSH介绍

    ### J2EE SSH框架介绍与应用 #### 一、引言 随着信息技术的快速发展,Java技术在企业级应用开发中的地位越来越重要。J2EE(Java 2 Platform, Enterprise Edition)作为一套完整的Java企业级应用解决方案,其核心是...

    J2EE SSH 笔试复习

    根据给定文件中的标题、描述、标签以及部分内容,可以总结并生成以下与J2EE SSH框架相关的知识点: ### J2EE SSH框架理论复习 #### 一、基础知识回顾 1. **J2EE(Java 2 Platform, Enterprise Edition)**: - 是...

    基于J2EE SSH框架的个人理财管理平台

    完整的系统源码,个人理财管理平台,采用web应用的典型框架,集成Struts2、Spring以及hibernate框架。其中包括股票、基金以及存款投资产品的登记管理功能,并且在交易时间可以动态获取最新股票信息。 包括源码...

    基于J2EE框架的SSH整合

    **基于J2EE框架的SSH整合** 在Java企业级开发中,SSH(Spring、Struts、Hibernate)是一个常见的集成框架,用于构建高效、灵活且可维护的Web应用程序。SSH框架结合了Spring的依赖注入(DI)和面向切面编程(AOP),...

    大学毕业论文-—j2ee的ssh框架的搭建和性能优化.doc

    J2EE 的 SSH 框架的搭建和性能优化 摘要: 本文主要介绍了 J2EE 的 SSH 框架的搭建和性能优化。SSH 框架是当前 Java Web 应用程序开发中的一种流行的架构模式,由 Spring、Struts 和 Hibernate 三个组件组成。本文...

    j2ee项目SSH框架网上购物

    这个"j2ee项目SSH框架网上购物"压缩包包含了SQL脚本文件,这些脚本通常用于初始化数据库结构,包括创建表、索引、存储过程等。用户可以导入到数据库管理系统中执行,快速设置好项目所需的数据环境。 【标签】"整个...

    j2ee.zip_ssh_ssh 源码_李刚 j2ee_李刚 ssh_李刚 源码

    基本SSH框架实现,李刚轻量级SSH框架上的源码,Struts2+Spring3+Hibernate3,做为初学者是个很不错的学习源码!

Global site tag (gtag.js) - Google Analytics