MVC与三层架构的研讨

一、MVC架构
Struts是一个不错的MVC架构,我一直以来都用它,通过简单的配置即可将view,controler,和Model结合起来。View主要以JSP来实现,因为它是面向标签的,所以对于网页设计人员提供了很好的接口。FormBean是介于JSP和Action之间的中间数据载体,它肩负着数据从JSP到ACTION的传递过程。Action是流程的中转站,不同的业务在不同的Action中以不同的Model调用来实现。Model就是实现具体业务的操作过程,不过这种过程是一种在较高水平上的实现。
总之,MVC架构实现了三层结构中的两层,即表现层和业务层,另外还有一层被称之为持久化层。
二、三层架构
正如以上所说的,三层架构即“表现层”,“业务层”,“持久化层”。表现层实现的代表作品是Struts框架,业务层实现的代表作品是Spring,持久层实现的代表作品是Hibernate。不过在我的开发中Spring被省掉了,因为我认为业务过于简单,还不至于用Spring来实现。下面我将具体的来说说我的三层实现。
1、三种Bean
在我的实现中,总共有三种Bean,它们都是为保存对象状态而存在的。持久层中,这种Bean就是POJO对象。它是面向数据库的,或者说多少得照顾到数据库的实现,因为我习惯于用PowerDesigner来设计数据库,做出来的结构也是比较中规中矩的,而如果直接用Hibernate来实数据库的话,就不那么干净了。所以POJO对象的设计就不能完全面向对象。业务层中的Bean我把它称之为Entity,这是一个完全面向程序逻辑的Bean。它可能是好几个POJO的集合。对于业务逻辑来,这种被称之为Entity的Bean做到了“拿来就用”,很便于业务的进行。在显示层中的Bean就是FormBean了,主要用于传入数据所用。
POJO仅生存于持久化层,到了业务层就将数据交给Entity了。而Entity不仅生存于业务层,它还被传到了JSP中,用于显示。
2、Pojo与Dao
我认为这是数据与操作的关系,Dao只在呼操作,而Pojo仅用于保存数据。下面是我Dao接口的实个现。
public interface Dao {

  //********** operattion method *********
  void resetPO(Pojo pojo);//重新设置POJO实体
  String save();//保存或更新POJO实体
  Pojo load();//通过ID值获取确切的POJO
  List find(short by);//通过某一属性值来获取POJO
  void close();//显示调用,以关闭session,至此该DAO将不再可用。
}
所有的涉及具体操作的Dao类均实现它。三个方法把Hibernate的查询语句封装起来。在业务层中只关心save(),load(),或find()。下面是一个具体UserDao的实现。
public class UserDao implements Dao {

  public final short _ALL = 0;
  public final short _BY_NAME = 1;
  public final short _BY_ACCOUNT = 2;
  public final short _BY_PASSWORD = 3;
  public final short _BY_ACCOUNT_PASSWORD = 4;

  private UserPo userPo;
  private static Log log = LogFactory.getLog(DocumentDAO.class);
  private Session session;

  //************ initial method *************** 
  public UserDao() {
    userPo = new UserPo();
    session = HibernateUtil.currentSession();
  }

  public UserDao(UserPo user){
    this.userPo = user;
    session = HibernateUtil.currentSession();
  }

  //************ method begin ***************

   /**
    * resetPO()
    *重新加载POJO对象
    * @param pojo Pojo
    */
   public void resetPO(Pojo pojo) {
     this.userPo = (UserPo)pojo;
   }


   /**
    * save()
    * 保存UserPo对象于数据库,如果是一个已持久的对象,则进行update操作
    * @return String
    */
   public String save() {
    String oid = null;
    try{
      //Session session = HibernateUtil.currentSession() 已经被提至构造函数中初始化了
      Transaction tx = session.beginTransaction();
      if (userPo.getId() == null) {
        oid = (String)session.save(userPo);//如果这是一个新的pojo则进行insert操作。
        session.flush();
        tx.commit();
      }else{
        session.update(userPo,userPo.getId());//如果该pojo已被初始化过则进行update操作
        session.flush();
        tx.commit();
      }
    }catch(HibernateException ex){
      System.out.println("//********* error **********///n UserDao.save()出现异常!");
      log.error("UserDao.save()出现异常!",ex);
    }
    return oid;
  }

  /**
   * get()
   * 通过id值,从数据库中获得指定的UserPo对象
   * @return Pojo
   */
  public Pojo load() {
    UserPo tmp = new UserPo();
    try{
      //Session session = HibernateUtil.currentSession() 已经被提至构造函数中初始化了
      tmp = (UserPo) session.get(UserPo.class, userPo.getId()); //用确切存在的ID值获得对象
    }catch(HibernateException hbe){
      hbe.printStackTrace();
    }
    if (tmp != null) {
      userPo = tmp;
      return userPo;
    }
    else
      return null;
  }

  /**
   * find()
   * 从数据库中查找一个User对象
   * @return Pojo
   */
  public List find(short by) {
    //Session session = HibernateUtil.currentSession() 已经被提至构造函数中初始化了
    Query query = null;
    String where=null;
    switch(by){
      case 0 :
        where = "";
        break;
      case 1 :
        where = " where us.name='"+userPo.getName()+"'";
        break;
      case 2 :
        where = " where us.account='"+userPo.getAccount()+"'";
        break;
      case 3 :
        where = " where us.password='"+userPo.getPassword()+"'";
        break;
      case 4 :
        where = " where us.account='"+userPo.getAccount()+"' and us.password='"+userPo.getPassword()+"'";
    }
    query = session.createQuery("from UserPo us"+where);
    return query.list();
  }

  public void close(){
    HibernateUtil.closeSession();
  }

}
其中HibernateUtil是一个Hibernate方法类,它提供线程安全的Session。和关闭这个Session的方法(虽然关闭Session过于简单)。每个Dao是由DaoFactory来产生的。DaoFactory也有一个公共的接口。如下:
public interface DaoFactory {
  /**
   * DAO对象工厂,获取各个数据实体的DAO对象,返回一个统一的接口 Dao
   * @return Dao
   */
  Dao getDocumentDAO();
  Dao getDocHeadDAO();
  Dao getDocAccessoryDAO();
  Dao getUserDao(User u);

}
下面是一个基于Hibernate的Dao的实现。
public class HbDaoFactory implements DaoFactory {

  public HbDaoFactory() {
  }

  /**
   * getDocumentDao
   *
   * @return Dao
   */
  public Dao getDocumentDAO() {
    /**@todo Implement this com.cecs.dao.DaoFactory method*/
    return new com.cecs.dao.DocumentDAO();
  }

  /**
   * getDocHeadDao
   *
   * @return Dao
   */
  public Dao getDocHeadDAO() {
    /**@todo Implement this com.cecs.dao.DaoFactory method*/
    throw new java.lang.UnsupportedOperationException("Method getDocHeadDAO() not yet implemented.");
  }

  /**
   * getDocAccessoryDao
   *
   * @return Dao
   */
  public Dao getDocAccessoryDAO() {
    /**@todo Implement this com.cecs.dao.DaoFactory method*/
    throw new java.lang.UnsupportedOperationException("Method getDocAccessoryDAO() not yet implemented.");
  }

  /**
   * getUserDao
   *获取UserDao对象
   * @return Dao
   */
  public Dao getUserDao(User u) {
    return new UserDao(u);
  }

}
这样一但不用Hibernate来实现持久层,也可以很方便改为其它的Dao而不用修改业务层。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值