系统分层
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
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