日期:2014-05-17  浏览次数:20731 次

SSH的一个疑问
据说MVC模式中,Dao层不涉及任何业务代码,所以我的Dao层只提供了CRUD本类的几个方法,但这样一来所有业务就移到业务层了其中包括一些需要操作数据库的方法,那不是要在业务层继承HibernateDaoSupport类了吗,

比如:
我根据用户ID查询其下所有订单的方法,这个方法是放到Dao层还是Service层?

如果放到Service层,那业务层不也充当了持久化的角色了,不矛盾了吗,就这边疑惑承蒙各位解答?

------解决方案--------------------
Dao层只声明接口,不要去实现,实现放在Dao的实现层:
如:com.dao包下 有UserDao.java这个接口
public interface UserDao
{
public void save(User user);
public void delete(int userId);
public void update(User user);
public User getUser();
public List<User> getUsers();
}
在com.dao.impl包下,UserDaoImpl.java类
public class UserDaoImpl extends HibernateDaoSupport implements UserDao
{
//编写业务方法......
}


根据用户ID查询其下所有订单的方法,放到业务层即com.dao.impl下

com.dao = com.service
com.dao.impl = com.service.impl

UserDao = UserService
UserDaoImpl UserServiceImpl
(有时service也换成manager)
SSH架构包一般如下:
com.lgp.cms.action --放StrutsAction
com.lgp.cms.exception -- 处理系统异常
com.lgp.cms.form --放Actionform用作数据传输,和model差不多
com.lgp.cms.manager -- 抽象业务方法
com.lgp.cms.manager.impl -- 业务方法的实现
com.lgp.cms.model --实体类,即持久层数据存放
com.lgp.cms.util -- 工具类
beans.xml
hibernate.cfg.xml
log4j.properties
struts.xml

一般做项目的时候都会对com.lgp.cms.manager.impl里面的业务方法进行测试用Junit所以另件一个文件夹命名test下面建包com.lgp.cms.test

一般常规项目开发都是这样的,不要被什么层所蒙蔽,要弄清楚Struts和hibernate和spring各是干什么的就够了。。。。。




------解决方案--------------------
业务 --当然是处理业务的了 ,数据获取当然不在这里啦 ,数据获取应该在Dao里面吧
------解决方案--------------------
放在service层 通过DAO层进行数据RRUD的操作
------解决方案--------------------
严格分层的话 就在 dao层 查询获取数据 再service层去调用 dao
可能代码有点冗余 但是这样是严格分层的 如果项目大的话 就这样做 小项目就无所谓了