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层不需要改动任何代码,则需要用工厂动态生成所需要的具体实现类的实例.
|--利用工厂实现解耦的代码:
/*配置文件: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); } } }

浙公网安备 33010602011771号