分层架构模式

系统分层
    1)为什么要分层
        为了方便代码的维护,需要保证类的职责单一,这样就产生了分层(也就是将一个类才分成多个类,形成类之间的调用关系)
    2)如何分层
        a、业务层(也叫服务层):封装业务逻辑
            第一步:建一个service包,写一个接口,在写一个类实现这个接口,重写这个接口的方法 在这个类的上面写@Service("loginService")这个注解
            给这个类写一个成员变量 这个成员变量是持久层的那个dao里面的那个接口,在这个成员变量的上面添加@Resource(name="adminDAO")这个注解
                这边这个name的值是成员变量实现类的id
            重写的这个方法的方法体相当于以前的servlet中处理数据那一部分
            例如:@Service("loginService")
                             public class LoginServiceImpl implements LoginService{
                         @Resource(name="adminDAO")
                         private AdminDao dao;
                         //业务层实现类
                         public Admin checkLogin(String code, String pwd) {
                     Admin admin=null;
                     admin=dao.findByCode(code);
                     if(admin==null){
                 /*拋一个应用异常
                 注:应用异常,指的是由于用户错误的操作硬气的异常
                比如账号错误,对于应用异常,应该明确的提示用户采取正确的操作*/
                throw new AppException("账号错误");
                   }
                    if(!admin.getPassword().equals(pwd)){
                 throw new AppException("密码错误");
                    }
        
        
                 //登录通过
                 return admin;
                   }
    
                      }


        b、持久层(也叫数据访问层):封装数据访问逻辑    
                   第一步:在applicationContext.xml这个配置文件里,读取数据库的那个配置文件(db.properties) 创建一个连接池的bean 然后在给这个连接池的各个变量赋              值,赋的值是从配置文件通过spring-mvc表达式读取过来的。
              例如: <!-- 读取配置文件 -->
                    <util:properties id="db" location="classpath:db.properties"/>


                <bean id="bs" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
                         <property name="driverClassName" value="#{db.driver}"/>
                         <property name="url" value="#{db.url}"/>
                         <property name="username" value="#{db.user}"/>
                          <property name="password" value="#{db.pwd}"/>
                         <property name="initialSize" value="#{db.initsize}"/>
                         <property name="maxActive" value="#{db.maxsize}"/>
        
                  </bean>
           第二步:写entity 和 dao  entity和以前的一样就是建一个类 dao的话要先建一个接口,然后建一个类实现那个接口 在这个类的上面添加                                             @Repository("adminDAO")然后重写接口里面的方法,括号里面的可以自己改,意思是相当于创建了一<bean id="adminDAO" class=""/>
              再在类中写一个成员变量,变量的类型为那个连接池 然后在这个成员变量的上面添加@Resource(name="bs")这个注解,这里面的name的值
               是在applicationContext.xml这个配置文件里的连接池的那个id
                例如:   @Repository("adminDAO")
                                        public class AdminDaoJdbcImpl implements AdminDao{
                                    @Resource(name="bs")
                                    private DataSource bs;//依赖注入要尽量用接口,避免类之间的耦合性
               这个方法的方法体和以前的一样(创建sql语句,创建语句对象,执行sql语句,处理结果集)

        c、表示层(UI层):1)数据展现和操作界面,另外还要负责请求分发     就是那个controller包下的,重定向或转发到各个jsp页面的那些功能
                   2)在表示层中调用业务层 在表示层的那个类中写一个成员变量 这个变量的类型就是业务层的那个接口 在这个成员变量的上面
                   添加@Resource(name="loginService")这个注解,这里的name就是业务层中那个实现类的id 然后就在方法体中调用实现类的方法
                   对结果进行判断,对页面进行重定向或转发
                   注:相当于以前的接收请求参数和发送响应那一部分

        三者之间的关系:表示层调用业务层,业务层调用持久层
                上一层要通过接口来调用下一层(这样下一层的实现发生了改变,不影响上一层-)

        注:要在web.xml中添加前端控制器的配置、中文乱码配置
           要在pom.xml中添加导包spring-webmvc和spring-jdbc和ojdbc和dbcp
           要在applicationContext.xml配置文件中添加组件扫描、连接池、视图解析器、mvc、拦截器

        表示层是相当于以前的接收请求参数和发送响应那一部分
        业务层 重写的这个方法的方法体相当于以前的servlet中处理数据那一部分
        持久层相当于之前的连接数据库,和实体库对应的一个Java实体类,执行sql语句的dao

猜你喜欢

转载自blog.csdn.net/donghua19900508/article/details/77973380