国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Spring聲明式處理
關(guān)于spring事務(wù)管理以及異常處理的帖子,本論壇爭(zhēng)論頗多,各有各的測(cè)試代碼,也各有各的測(cè)試結(jié)果,
不知道是spring版本的不同還是各測(cè)試的例子的不同而導(dǎo)致測(cè)試結(jié)果出現(xiàn)差異.
本人也很想弄清楚spring是如何對(duì)Service進(jìn)行事務(wù)管理的,并且還去看了一下spring框架關(guān)于事務(wù)管理幾個(gè)相關(guān)類(lèi)的源碼,可惜由于本人功力有限,只看懂了皮毛.
既然源代碼看不懂,那么只有運(yùn)用例子進(jìn)行測(cè)試,雖然笨了點(diǎn),不過(guò)管是白貓還是黑貓,能捉老鼠就是好貓.:)
為引起不必要的爭(zhēng)論,本帖子只針對(duì)本案例的測(cè)試結(jié)果進(jìn)行小結(jié),并保證此測(cè)試代碼在本人的運(yùn)行環(huán)境絕對(duì)正確.

開(kāi)發(fā)環(huán)境:
OS:windows 2003 Server
Web Server: jakarta-tomcat-5.0.28
DataBase Server: MS SQL Server 2000 (打了SP3補(bǔ)丁)
IDE:  Eclipse 3.2.0+MyEclipse 5.0GA

測(cè)試案例系統(tǒng)結(jié)構(gòu):
web層<---->Service層<---->DAO層

web層使用struts 1.1,DAO使用的spring的JDBC,spring版本1.2

數(shù)據(jù)庫(kù)中有兩張表:
student1和Student2,表結(jié)構(gòu)相同:id,name,address.其中id為主鍵且為自增長(zhǎng)型.
student1表中有一條記錄:
Java代碼 
1.    id  name       address 
2.    1   xiaoming    wuhan 
3.     
4.    student2表中記錄為空 


測(cè)試情形一:
web層捕獲異常并處理,DAO層不捕獲異常,Service也不捕獲異常.

Service層接口:
Java代碼 
1.    public interface StudentManagerService { 
2.       
3.        public void  bus_method(); 
4.    } 


DAO層接口
Java代碼 
1.    public interface StudentDAO { 
2.       
3.        public void  deleteStudent1(); 
4.        public void  insertStudent2(); 
5.    } 


StudentDAO接口的實(shí)現(xiàn):
Java代碼 
1.    public class StudentDAOImp extends JdbcDaoSupport implements StudentDAO{ 
2.         //刪除student1表中的id=1的記錄 
3.         public void  deleteStudent1(){ 
4.         JdbcTemplate jt=this.getJdbcTemplate(); 
5.         jt.update("delete from student1 where id=1");      
6.       } 
7.          
8.         //將student1表中刪除的記錄插入到student2中,但是此方法實(shí)現(xiàn)有錯(cuò),因?yàn)?nbsp;
9.       //id字段設(shè)置為自增長(zhǎng)的,所以在插入記錄時(shí)我們不能指定值 
10.          public void  insertStudent2(){ 
11.           JdbcTemplate jt=this.getJdbcTemplate(); 
12.                String arg[]=new String[3]; 
13.           arg[0]="1"; 
14.                arg[1]="xiaoming"; 
15.           arg[2]="wuhan"; 
16.                jt.update("insert student2(id,name,address) values(?,?,?)",arg); 
17.         } 
18.     
19.    }  


StudentManagerService 接口的實(shí)現(xiàn):
Java代碼 
1.    public class StudentManagerServiceImp implements StudentManagerService{ 
2.      private StudentDAO  stdDAO; 
3.      
4.      public void setStdDAO(StudentDAO   stdDAO){ 
5.         this.stdDAO=stdDAO; 
6.      } 
7.        
8.      //此方法為事務(wù)型的:刪除student1中的記錄成功且插入student2的記錄也成功, 
9.     //如果insertStudent2()方法執(zhí)行失敗,那么deleteStudent1()方法也應(yīng)該會(huì)失敗 
10.      public void  bus_method(){ 
11.        this.stdDAO.deleteStudent1(); 
12.        this.stdDAO.insertStudent2(); 
13.      } 
14.       
15.    }  



web層:
三個(gè)jsp,一個(gè)action:
index.jsp ==>首頁(yè)面.上面僅僅有一個(gè)超鏈接<a herf="test.do">執(zhí)行</a>
chenggong.jsp ==>Service執(zhí)行成功后轉(zhuǎn)向的JSP頁(yè)面
shibai.jsp ====>Service執(zhí)行失敗后轉(zhuǎn)向的JSP頁(yè)面

action實(shí)現(xiàn):
Java代碼 
1.    public class StudentManagerAction  extends  Action{ 
2.     
3.         public ActionForward execute(ActionMapping mapping, ActionForm form, 
4.        HttpServletRequest request, HttpServletResponse response) { 
5.             try{ 
6.                 WebApplicationContext appContext=WebApplicationContextUtils.  
7.                      getWebApplicationContext(this.getServlet().getServletContext()); 
8.            StudentManagerService stdm=(StudentManagerService)appContext. 
9.                                            getBean("stdServiceManager"); 
10.                stdm.bus_method(); 
11.                return mapping.findForward("chenggong"); 
12.         } 
13.         catch(DataAccessException e){ 
14.            System.err.println("action execute service exception!"); 
15.            return mapping.findForward("shibai"); 
16.          } 
17.     
18.        } 
19.    } 



配置文件:

web.xml
Java代碼 
1.    <?xml version="1.0" encoding="UTF-8"?> 
2.    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
3.      <context-param> 
4.        <param-name>log4jConfigLocation</param-name> 
5.        <param-value>/WEB-INF/log4j.properties</param-value> 
6.      </context-param> 
7.      <context-param> 
8.        <param-name>contextConfigLocation</param-name> 
9.        <param-value>/WEB-INF/applicationContext.xml</param-value> 
10.      </context-param> 
11.      <listener> 
12.        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
13.      </listener> 
14.      <listener> 
15.        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
16.      </listener> 
17.      <servlet> 
18.        <servlet-name>action</servlet-name> 
19.        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
20.        <init-param> 
21.          <param-name>config</param-name> 
22.          <param-value>/WEB-INF/struts-config.xml</param-value> 
23.        </init-param> 
24.        <init-param> 
25.          <param-name>debug</param-name> 
26.          <param-value>3</param-value> 
27.        </init-param> 
28.        <init-param> 
29.          <param-name>detail</param-name> 
30.          <param-value>3</param-value> 
31.        </init-param> 
32.        <load-on-startup>0</load-on-startup> 
33.      </servlet> 
34.      <servlet-mapping> 
35.        <servlet-name>action</servlet-name> 
36.        <url-pattern>*.do</url-pattern> 
37.      </servlet-mapping> 
38.    </web-app> 


sturts-config.xml
Java代碼 
1.    <struts-config> 
2.      <action-mappings > 
3.        <action  input="/index.jsp"  path="/test"  type="test.StudentManagerAction   > 
4.          <forward name="chenggong" path="/chenggong.jsp" /> 
5.          <forward name="shibai" path="/shibai.jsp" /> 
6.        </action> 
7.      </action-mappings> 
8.      <message-resources parameter="test.ApplicationResources" /> 
9.    </struts-config> 



applicationContext.xml
Java代碼 
1.    <?xml version="1.0" encoding="UTF-8"?> 
2.    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
3.    <beans> 
4.        <bean id="dataSource" 
5.          class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" > 
6.          <property name="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"></property> 
7.          <property name="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=test"></property> 
8.           <property name="username" value="sa"></property> 
9.           <property name="password" value="sa"></property> 
10.        </bean> 
11.         
12.         <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
13.            <property name="dataSource" ref="dataSource"/> 
14.         </bean> 
15.             
16.        <bean id="baseTxProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true"> 
17.            <property name="transactionManager"> 
18.            <ref bean="transactionManager" /> 
19.             </property> 
20.             <property name="transactionAttributes"> 
21.             <props> 
22.                 <prop key="*">PROPAGATION_REQUIRED</prop> 
23.            </props> 
24.             </property> 
25.        </bean> 
26.     
27.        <bean id="stdServiceManager"  parent="baseTxProxy" > 
28.            <property name="target"> 
29.                 <bean class="test.StudentManagerServiceImp">     
30.                           <property name="stdDAO"> 
31.                          <ref bean="stdDAO"/> 
32.                           </property>     
33.                      </bean>  
34.            </property>  
35.        </bean> 
36.     
37.        <bean id="stdDAO" class="test.StudentDAOImp"> 
38.           <property name="dataSource" ref="dataSource"/> 
39.        </bean> 
40.    </beans> 


運(yùn)行程序:?jiǎn)?dòng)服務(wù)器,并部署.進(jìn)入index.jsp頁(yè)面,點(diǎn)擊"執(zhí)行"超鏈接"---->頁(yè)面跳向shibai.jsp
查看控制臺(tái):打印有:action execute service exception!
查看數(shù)據(jù)庫(kù): student1表中的[1 xiaoming  wuhan] 記錄仍然存在,student2表仍然為空.
小結(jié):如果DAO層和Service不捕獲異常而在web層捕獲異常,web成功捕獲異常,spring事務(wù)管理成功!


測(cè)試情形二:
web層捕獲異常并處理,Service捕獲異常并處理,DAO層不捕獲異常.

修改StudentManagerServiceImp類(lèi)
Java代碼 
1.    public class StudentManagerServiceImp implements StudentManagerService{ 
2.      private StudentDAO  stdDAO; 
3.      
4.      public void setStdDAO(StudentDAO   stdDAO){ 
5.         this.stdDAO=stdDAO; 
6.      } 
7.        
8.      //此方法為事務(wù)型的,刪除student1中的記錄成功且插入student2的記錄也成功 
9.     //如果insertStudent2()方法執(zhí)行失敗,那么deleteStudent1()也應(yīng)該會(huì)失敗 
10.      public void  bus_method(){ 
11.       try{ 
12.          this.stdDAO.deleteStudent1(); 
13.          this.stdDAO.insertStudent2(); 
14.       } 
15.       catch(DataAccessException de) 
16.           System.err.println("service execute exception!"); 
17.        } 
18.      } 
19.       
20.    } 


運(yùn)行程序:?jiǎn)?dòng)服務(wù)器,并部署.進(jìn)入index.jsp頁(yè)面,點(diǎn)擊"執(zhí)行"超鏈接"---->頁(yè)面跳向chenggong.jsp
查看控制臺(tái):打印有:service execute exception!
查看數(shù)據(jù)庫(kù): student1表中的[1  xiaoming  wuhan] 記錄不存在,student2表仍然為空.
小結(jié):如果Service捕獲異常并處理而不向外拋出,web層捕獲不到異常,spring事務(wù)管理失??!


測(cè)試情形(還原表中的數(shù)據(jù))三:
web層捕獲異常,Service捕獲異常,DAO層也捕獲異常.

修改StudentDAOImp類(lèi)代碼
Java代碼 
1.    public class StudentDAOImp extends JdbcDaoSupport implements StudentDAO{ 
2.         //刪除student1表中的id=1的記錄 
3.         public void  deleteStudent1(){ 
4.            try{ 
5.         JdbcTemplate jt=this.getJdbcTemplate(); 
6.         jt.update("delete from student1 where id=1"); 
7.           } 
8.           catch(DataAccessException e){ 
9.             System.err.println("dao deleteStudent1 execute exception!"); 
10.           }      
11.       } 
12.          
13.         //將student1表中刪除的記錄插入到student2中,但是此方法實(shí)現(xiàn)有錯(cuò),因?yàn)?nbsp;
14.       //id字段設(shè)置為自增長(zhǎng)的,所以在插入記錄時(shí)我們不能指定值 
15.          public void  insertStudent2(){ 
16.              try{ 
17.           JdbcTemplate jt=this.getJdbcTemplate(); 
18.                String arg[]=new String[3]; 
19.           arg[0]="1"; 
20.                arg[1]="xiaoming"; 
21.           arg[2]="wuhan"; 
22.                jt.update("insert student2(id,name,address) values(?,?,?)",arg); 
23.             } 
24.             catch(DataAccessException  e){ 
25.                System.err.println("dao insertStudent2  execute exception!"); 
26.     
27.             } 
28.         } 
29.     
30.    }  


運(yùn)行程序:?jiǎn)?dòng)服務(wù)器,并部署.進(jìn)入index.jsp頁(yè)面,點(diǎn)擊"執(zhí)行"超鏈接"---->頁(yè)面跳向chenggong.jsp
查看控制臺(tái):打印有:dao insertStudent2  execute exception!
查看數(shù)據(jù)庫(kù): student1表中的 1,xiaoming,wuhan 記錄不存在,student2表仍然為空.
小結(jié)如果DAO的每一個(gè)方法自己捕獲異常并處理而不向外拋出,Service層捕獲不到異常,Web層同樣捕獲不到異常,spring事務(wù)管理失?。?


測(cè)試情形四:

還原數(shù)據(jù)庫(kù)中的數(shù)據(jù)
還原StudentDAOImp類(lèi)中的方法為測(cè)試情形一中的實(shí)現(xiàn)
web層捕獲異常Service拋出的自定義異常StudentManagerException
Service捕獲DataAccessException并拋出StudentManagerException,
StudentManagerException為DataAccessException的子類(lèi)
DAO層不捕獲異常

修改StudentManagerServiceImp類(lèi)的實(shí)現(xiàn):
Java代碼 
1.    public class StudentManagerServiceImp implements StudentManagerService{ 
2.      private StudentDAO  stdDAO; 
3.      
4.      public void setStdDAO(StudentDAO   stdDAO){ 
5.         this.stdDAO=stdDAO; 
6.      } 
7.        
8.      //此方法為事務(wù)型的,刪除student1中的記錄成功且插入student2的記錄也成功 
9.     //如果insertStudent2()方法執(zhí)行失敗,那么deleteStudent1()也應(yīng)該會(huì)失敗 
10.      public void  bus_method() throws StudentManagerException{ 
11.       try{ 
12.          this.stdDAO.deleteStudent1(); 
13.          this.stdDAO.insertStudent2(); 
14.       } 
15.       catch(DataAccessException de) 
16.           System.err.println("service execute exception!"); 
17.         throw new StudentManagerException();//StudentManagerException類(lèi)繼承DataAcce                          //ssException異常 
18.        } 
19.      } 
20.    } 



修改StudentManagerAction 
Java代碼 
1.    public class StudentManagerAction  extends  Action{ 
2.     
3.         public ActionForward execute(ActionMapping mapping, ActionForm form, 
4.        HttpServletRequest request, HttpServletResponse response) { 
5.             try{ 
6.                 WebApplicationContext appContext=WebApplicationContextUtils.  
7.                      getWebApplicationContext(this.getServlet().getServletContext()); 
8.            StudentManagerService stdm=(StudentManagerService)appContext. 
9.                                            getBean("stdServiceManager"); 
10.                stdm.bus_method(); 
11.                return mapping.findForward("chenggong"); 
12.         } 
13.         catch(StudentManagerException e){ 
14.            System.err.println("action execute service exception!"); 
15.            return mapping.findForward("shibai"); 
16.          } 
17.     
18.        } 
19.    } 

運(yùn)行程序:?jiǎn)?dòng)服務(wù)器,并部署.進(jìn)入index.jsp頁(yè)面,點(diǎn)擊"執(zhí)行"超鏈接"---->頁(yè)面跳向shibai.jsp
查看控制臺(tái):打印有:service execute exception!
action execute service exception!
查看數(shù)據(jù)庫(kù): student1表中的 [1,xiaoming,wuhan] 記錄仍然存在,student2表仍然為空.
小結(jié)如果DAO的每一個(gè)方法不捕獲異常,Service層捕獲DataAccessException異常并拋出自己定義異常(自定義異常為DataAccessException的子類(lèi)),Web層可以捕獲到異常,spring事務(wù)管理成功!



結(jié)合源碼總結(jié):
1.spring在進(jìn)行聲明時(shí)事務(wù)管理時(shí),通過(guò)捕獲Service層方法的DataAccessException來(lái)提交和回滾事務(wù)的,而Service層方法的DataAccessException又是來(lái)自調(diào)用DAO層方法所產(chǎn)生的異常.

2.我們一般在寫(xiě)DAO層代碼時(shí),如果繼承JdbcDaoSupport類(lèi),并使用此類(lèi)所實(shí)現(xiàn)的JdbcTemplate來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作,此類(lèi)會(huì)自動(dòng)把低層的SQLException轉(zhuǎn)化成DataAccessException以及DataAccessException
的子類(lèi).

3.一般在Service層我們可以自己捕獲DAO方法所產(chǎn)成的DataAccessException,然后再拋出一個(gè)業(yè)務(wù)方法有意義的異常(ps:此異常最好繼承DataAccessException),然后在Web層捕獲,這樣我們就可以手動(dòng)編碼的靈活實(shí)現(xiàn)通過(guò)業(yè)務(wù)方法執(zhí)行的成功和失敗來(lái)向用戶轉(zhuǎn)發(fā)不同的頁(yè)面.
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Spring事務(wù)處理探究
struts2.1.6+spring整合
spring整合MyBatis思路
SSM框架整合完整案例
MyBatis3整合Spring3、SpringMVC3
JDBC數(shù)據(jù)庫(kù)通用DAO
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服