Web开发三层架构的理解

1、Model2的MVC理解:

  |--M:包含JavaBean(entity)、Dao、Service

  |--V:包含JSP、HTML

  |--C:包含Servlet

2、各层的职责:

  |--M中的Dao层只负责处理数据库的CRUD,其它有关的业务逻辑均交由上层处理。在Dao中只写关于CRUD的相关方法即可。

  |--M中的Service层只负责业务处理、封装对象交由Dao或上层处理。

  |--在Dao和Service层之间定义接口,接口的作用是用来解耦的,如代码所示:

    

Dao层代码分为接口和实现:

package com.dao;
public interface UserDao{
  public void addUser(User user);
  public void deleteUser(String id);    
}

package com.dao.impl;
public class UserDaoImpl_mysql implements UserDao{
    public void addUser(User user){
        Connection conn = DbUtil.getConn();
        ...................
        ............    
    }
    public void deleteUser(String id){
        Connection conn = DbUtil.getConn();
        ...........
        ...........
    }
}

Service层代码调用Dao层的功能,从为为上层提供服务,Service也分为接口与实现:

package com.service;
public interface UserService{
//接口中只定义为上层提供服务的接口方法,具体的调用Dao实现的业务功能交由Service的实现类去处理:
    //提供用户注册服务的接口方法,具体实现由实现类去做:
    public void register(User user);
    public void delete(String id);
}
package com.service.impl;
public class UserServiceImpl implements UserService{
    //调用Dao的方法:
        //下面这句是直接用实现类实例化对象:
        //UserDaoImpl_mysql userDaoImpl = new UserDaoImpl_mysql();
        //以下是用接口创建实现类实例对象:
        UserDao userDaoImpl = new UserDaoImpl_mysql();
        public void register(User user){
            userDaoImpl.addUser(user);
        }
        public void delete (String id){
            userDaoImpl.deleteUser(id);
        }        
----------------------------------------------------------------------        
以上的代码,层与层之间定义接口的好处:
    一般接口只定义功能,与具体的实现无关,一般在项目中不会改变,改变是具体的业务实现,比如,Dao层,原来是连接Mysql的实现代码,但要改成Oracle的实现,
    如果没有接口听定义,在Service层中调用Dao的代码是这样的:UerDaoImpl_mysql userDaoImpl_mysql = new UerDaoImpl_mysql(), 此时则需要:    
        1、增加相当的Dao实现(public class UserDaoImpl_Oracle{} ) 
        2、更改Service相关的调用代码:
        将 UerDaoImpl_mysql userDaoImpl = new UerDaoImpl_mysql(),改为:UerDaoImpl_Oracle userDaoImpl = new UerDaoImpl__Oracle();
        ----------------------------------------------------
        如果定义了接口,相关的调用是这样的:
        原来的:UerDao userDaoImpl = new UerDaoImpl_mysql();
        改变后:UerDao userDaoImpl = new UerDaoImpl_Oracle();
        则在业务层代码中即使更改代码至少前边的部分(UerDao userDaoImpl)产需要更改了。
        如果规范的开发中,则要求,当Dao层发生改变时,Service层不需要改动任何代码,则需要用工厂动态生成所需要的具体实现类的实例.
View Code

  |--利用工厂实现解耦的代码:  

/*配置文件:instance.properties
mysqlImpl = com.dao.impl.UserDaoImpl_mysql
oracleImpl = com.dao.impl.UserDaoImpl_oracle 
*/


/**
 * 工厂:创建dao或service实例
 * @author Jie.Yuan
 *
 */
public class BeanFactory {
    
    // 加载配置文件
    private static ResourceBundle bundle;
    static {
        bundle = ResourceBundle.getBundle("instance");
    }

    /**
     * 根据指定的key,读取配置文件获取类的全路径; 创建对象
     * @return
     */
    public static <T> T getInstance(String key,Class<T> clazz) {
        String className = bundle.getString(key);
        try {
            return (T) Class.forName(className).newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
View Code

 

posted @ 2015-12-30 10:28  心灵召唤  阅读(493)  评论(0)    收藏  举报