- 浏览: 31470 次
- 性别:
- 来自: 广州
最新评论
-
meler:
有问题不理解:<value>rmi://serve ...
spring 远程接口访问及集群方案(三) -
djy1135:
东西实在是太多了
【转】Java开源项目(备查)
测试情形二:
web层捕获异常并处理,Service捕获异常并处理,DAO层不捕获异常.
修改StudentManagerServiceImp类
代码
public class StudentManagerServiceImp implements StudentManagerService{
private StudentDAO stdDAO;
public void setStdDAO(StudentDAO stdDAO){
this.stdDAO=stdDAO;
}
//此方法为事务型的,删除student1中的记录成功且插入student2的记录也成功
//如果insertStudent2()方法执行失败,那么deleteStudent1()也应该会失败
public void bus_method(){
try{
this.stdDAO.deleteStudent1();
this.stdDAO.insertStudent2();
}
catch(DataAccessException de)
System.err.println("service execute exception!");
}
}
}
运行程序:启动服务器,并部署.进入index.jsp页面,点击"执行"超链接"---->页面跳向chenggong.jsp
查看控制台:打印有:service execute exception!
查看数据库: student1表中的[1 xiaoming wuhan] 记录不存在,student2表仍然为空.
小结:如果Service捕获异常并处理而不向外抛出,web层捕获不到异常,spring事务管理失败!
测试情形(还原表中的数据)三:
web层捕获异常,Service捕获异常,DAO层也捕获异常.
修改StudentDAOImp类代码
代码
public class StudentDAOImp extends JdbcDaoSupport implements StudentDAO{
//删除student1表中的id=1的记录
public void deleteStudent1(){
try{
JdbcTemplate jt=this.getJdbcTemplate();
jt.update("delete from student1 where id=1");
}
catch(DataAccessException e){
System.err.println("dao deleteStudent1 execute exception!");
}
}
//将student1表中删除的记录插入到student2中,但是此方法实现有错,因为
//id字段设置为自增长的,所以在插入记录时我们不能指定值
public void insertStudent2(){
try{
JdbcTemplate jt=this.getJdbcTemplate();
String arg[]=new String[3];
arg[0]="1";
arg[1]="xiaoming";
arg[2]="wuhan";
jt.update("insert student2(id,name,address) values(?,?,?)",arg);
}
catch(DataAccessException e){
System.err.println("dao insertStudent2 execute exception!");
}
}
}
运行程序:启动服务器,并部署.进入index.jsp页面,点击"执行"超链接"---->页面跳向chenggong.jsp
查看控制台:打印有:dao insertStudent2 execute exception!
查看数据库: student1表中的 1,xiaoming,wuhan 记录不存在,student2表仍然为空.
小结如果DAO的每一个方法自己捕获异常并处理而不向外抛出,Service层捕获不到异常,Web层同样捕获不到异常,spring事务管理失败!
测试情形四:
还原数据库中的数据
还原StudentDAOImp类中的方法为测试情形一中的实现
web层捕获异常Service抛出的自定义异常StudentManagerException
Service捕获DataAccessException并抛出StudentManagerException,
StudentManagerException为DataAccessException的子类
DAO层不捕获异常
修改StudentManagerServiceImp类的实现:
代码
public class StudentManagerServiceImp implements StudentManagerService{
private StudentDAO stdDAO;
public void setStdDAO(StudentDAO stdDAO){
this.stdDAO=stdDAO;
}
//此方法为事务型的,删除student1中的记录成功且插入student2的记录也成功
//如果insertStudent2()方法执行失败,那么deleteStudent1()也应该会失败
public void bus_method() throws StudentManagerException{
try{
this.stdDAO.deleteStudent1();
this.stdDAO.insertStudent2();
}
catch(DataAccessException de)
System.err.println("service execute exception!");
throw new StudentManagerException();//StudentManagerException类继承DataAcce //ssException异常
}
}
}
修改StudentManagerAction
代码
public class StudentManagerAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
try{
WebApplicationContext appContext=WebApplicationContextUtils.
getWebApplicationContext(this.getServlet().getServletContext());
StudentManagerService stdm=(StudentManagerService)appContext.
getBean("stdServiceManager");
stdm.bus_method();
return mapping.findForward("chenggong");
}
catch(StudentManagerException e){
System.err.println("action execute service exception!");
return mapping.findForward("shibai");
}
}
}
运行程序:启动服务器,并部署.进入index.jsp页面,点击"执行"超链接"---->页面跳向shibai.jsp
查看控制台:打印有:service execute exception!
action execute service exception!
查看数据库: student1表中的 [1,xiaoming,wuhan] 记录仍然存在,student2表仍然为空.
小结如果DAO的每一个方法不捕获异常,Service层捕获DataAccessException异常并抛出自己定义异常(自定义异常为DataAccessException的子类),Web层可以捕获到异常,spring事务管理成功!
结合源码总结:
1.spring在进行声明时事务管理时,通过捕获Service层方法的DataAccessException来提交和回滚事务的,而Service层方法的DataAccessException又是来自调用DAO层方法所产生的异常.
2.我们一般在写DAO层代码时,如果继承JdbcDaoSupport 类,并使用此类所实现的JdbcTemplate来执行数据库操作,此类会自动把低层的SQLException转化成 DataAccessException以及DataAccessException
的子类.
3.一般在Service层我们可以自己捕获DAO方法所产成的DataAccessException,然后再抛出一个业务方法有意义的异常 (ps:此异常最好继承DataAccessException),然后在Web层捕获,这样我们就可以手动编码的灵活实现通过业务方法执行的成功和失败 来向用户转发不同的页面.
来源:http://www.iteye.com/topic/34867
web层捕获异常并处理,Service捕获异常并处理,DAO层不捕获异常.
修改StudentManagerServiceImp类
代码
public class StudentManagerServiceImp implements StudentManagerService{
private StudentDAO stdDAO;
public void setStdDAO(StudentDAO stdDAO){
this.stdDAO=stdDAO;
}
//此方法为事务型的,删除student1中的记录成功且插入student2的记录也成功
//如果insertStudent2()方法执行失败,那么deleteStudent1()也应该会失败
public void bus_method(){
try{
this.stdDAO.deleteStudent1();
this.stdDAO.insertStudent2();
}
catch(DataAccessException de)
System.err.println("service execute exception!");
}
}
}
运行程序:启动服务器,并部署.进入index.jsp页面,点击"执行"超链接"---->页面跳向chenggong.jsp
查看控制台:打印有:service execute exception!
查看数据库: student1表中的[1 xiaoming wuhan] 记录不存在,student2表仍然为空.
小结:如果Service捕获异常并处理而不向外抛出,web层捕获不到异常,spring事务管理失败!
测试情形(还原表中的数据)三:
web层捕获异常,Service捕获异常,DAO层也捕获异常.
修改StudentDAOImp类代码
代码
public class StudentDAOImp extends JdbcDaoSupport implements StudentDAO{
//删除student1表中的id=1的记录
public void deleteStudent1(){
try{
JdbcTemplate jt=this.getJdbcTemplate();
jt.update("delete from student1 where id=1");
}
catch(DataAccessException e){
System.err.println("dao deleteStudent1 execute exception!");
}
}
//将student1表中删除的记录插入到student2中,但是此方法实现有错,因为
//id字段设置为自增长的,所以在插入记录时我们不能指定值
public void insertStudent2(){
try{
JdbcTemplate jt=this.getJdbcTemplate();
String arg[]=new String[3];
arg[0]="1";
arg[1]="xiaoming";
arg[2]="wuhan";
jt.update("insert student2(id,name,address) values(?,?,?)",arg);
}
catch(DataAccessException e){
System.err.println("dao insertStudent2 execute exception!");
}
}
}
运行程序:启动服务器,并部署.进入index.jsp页面,点击"执行"超链接"---->页面跳向chenggong.jsp
查看控制台:打印有:dao insertStudent2 execute exception!
查看数据库: student1表中的 1,xiaoming,wuhan 记录不存在,student2表仍然为空.
小结如果DAO的每一个方法自己捕获异常并处理而不向外抛出,Service层捕获不到异常,Web层同样捕获不到异常,spring事务管理失败!
测试情形四:
还原数据库中的数据
还原StudentDAOImp类中的方法为测试情形一中的实现
web层捕获异常Service抛出的自定义异常StudentManagerException
Service捕获DataAccessException并抛出StudentManagerException,
StudentManagerException为DataAccessException的子类
DAO层不捕获异常
修改StudentManagerServiceImp类的实现:
代码
public class StudentManagerServiceImp implements StudentManagerService{
private StudentDAO stdDAO;
public void setStdDAO(StudentDAO stdDAO){
this.stdDAO=stdDAO;
}
//此方法为事务型的,删除student1中的记录成功且插入student2的记录也成功
//如果insertStudent2()方法执行失败,那么deleteStudent1()也应该会失败
public void bus_method() throws StudentManagerException{
try{
this.stdDAO.deleteStudent1();
this.stdDAO.insertStudent2();
}
catch(DataAccessException de)
System.err.println("service execute exception!");
throw new StudentManagerException();//StudentManagerException类继承DataAcce //ssException异常
}
}
}
修改StudentManagerAction
代码
public class StudentManagerAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
try{
WebApplicationContext appContext=WebApplicationContextUtils.
getWebApplicationContext(this.getServlet().getServletContext());
StudentManagerService stdm=(StudentManagerService)appContext.
getBean("stdServiceManager");
stdm.bus_method();
return mapping.findForward("chenggong");
}
catch(StudentManagerException e){
System.err.println("action execute service exception!");
return mapping.findForward("shibai");
}
}
}
运行程序:启动服务器,并部署.进入index.jsp页面,点击"执行"超链接"---->页面跳向shibai.jsp
查看控制台:打印有:service execute exception!
action execute service exception!
查看数据库: student1表中的 [1,xiaoming,wuhan] 记录仍然存在,student2表仍然为空.
小结如果DAO的每一个方法不捕获异常,Service层捕获DataAccessException异常并抛出自己定义异常(自定义异常为DataAccessException的子类),Web层可以捕获到异常,spring事务管理成功!
结合源码总结:
1.spring在进行声明时事务管理时,通过捕获Service层方法的DataAccessException来提交和回滚事务的,而Service层方法的DataAccessException又是来自调用DAO层方法所产生的异常.
2.我们一般在写DAO层代码时,如果继承JdbcDaoSupport 类,并使用此类所实现的JdbcTemplate来执行数据库操作,此类会自动把低层的SQLException转化成 DataAccessException以及DataAccessException
的子类.
3.一般在Service层我们可以自己捕获DAO方法所产成的DataAccessException,然后再抛出一个业务方法有意义的异常 (ps:此异常最好继承DataAccessException),然后在Web层捕获,这样我们就可以手动编码的灵活实现通过业务方法执行的成功和失败 来向用户转发不同的页面.
来源:http://www.iteye.com/topic/34867
发表评论
-
C#客户端调用Axis2 Java webservice int参数传值问题
2012-08-16 09:40 1654现象: 采用C# webservice studio工具调试a ... -
Linux下JfreeChart中文乱码问题解决
2012-07-17 15:28 924JFreeChart和中文验证码的乱码问题和jsp的编码无关, ... -
spring 注解式事务管理
2010-08-16 13:46 1108最近在开发一项目时使用了spring注解式事务管理,现介绍如下 ... -
spring 事务管理
2010-08-16 13:43 828Spring配置文件中关于事务配置总是由三个组成部分,分别是D ... -
[转]关于spring声明式事务管理异常处理的测试和小结一
2010-08-16 13:36 1070关于spring事务管理以及异常处理的帖子,本论坛争论颇多,各 ... -
jboss4.2.2GA+Cluster+HASingleton
2010-08-03 08:29 1316Here is an outline of the steps ... -
JBOSS 端口修改说明
2010-07-30 16:32 13421.jboss 的端口修改位置总结 Jboss通常占用的端口 ... -
jboss4.0.4 GA+EJB环境部署
2010-07-29 16:44 10941,开发环境 jbossIDE myclipse ... -
EJB3.0与JBOSS4.0.4GA集群部署实战(二)
2010-07-09 14:41 1021环境 MyEclipse5.5 JBoss4.0.4 测试 ... -
EJB3.0与JBOSS4.0.4GA集群部署实战(一)
2010-07-09 14:34 1203EJB中的三种bean 会话bean(session bea ... -
spring 远程接口访问及集群方案(三)
2010-07-09 14:03 3607前两篇文章已经对spring rmi方式的远程接口调用进行了说 ... -
spring 远程接口访问及集群方案(二)
2010-07-09 11:02 1617针对spring远程接口访问,本文给出一个实际的例子供参考,如 ... -
spring 远程接口访问及集群方案(一)
2010-07-09 10:46 1921Spring提供类用于集成各种远程访问技术。这种对远程访问的支 ... -
Java应用从集中式步入分布式
2010-07-07 14:02 673记得Martin大叔在《企业 ...
相关推荐
6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider ...
6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider ...
13.6 管理集成测试中的事务 530 13.6.1 问题 530 13.6.2 解决方案 530 13.6.3 工作原理 531 13.7 在集成测试中访问数据库 536 13.7.1 问题 536 13.7.2 解决方案 536 13.7.3 工作原理 537 13.8 使用...
9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 ...
6.4声明式事务 6.4.1定义事务参数 6.4.2代理事务 6.4.3在spring2.0里声明事务 6.4.4定义注释驱动事务 6.5小结 第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2...
13.6 管理集成测试中的事务 530 13.6.1 问题 530 13.6.2 解决方案 530 13.6.3 工作原理 531 13.7 在集成测试中访问数据库 536 13.7.1 问题 536 13.7.2 解决方案 536 13.7.3 工作原理 537 13.8 使用...
9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...
9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 ...
9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...
9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...
9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...
9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...
- Spring提供了一套完善的事务管理机制,可以通过声明式事务管理或编程式事务管理来实现。 #### 四、总结 本文详细介绍了在SSI框架环境下,一个典型的操作是如何被执行的。从请求的接收、处理到响应的生成,每...
Spring框架提供了声明式事务管理,可以在方法上添加@Transactional注解,简化事务控制。 6. 异常处理 DAO层应捕获并封装数据库操作可能抛出的异常,如SQLException,转化为业务友好的异常类型,如...
- **Spring中事务AOP的配置**:通过声明式事务管理实现。 - **Spring+MyBatis业务实现**:结合Spring和MyBatis进行业务逻辑处理。 #### SpringMVC配置详解 **10.1 SpringMVC web模型** SpringMVC的工作流程。 **...
1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 ...
其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...