Spring事务管理配置过程 说明 该实例是针对web容器的实例, Spring的配置文件的初始化工作完成之后,将存在于web服务容器中。 Spring事务管理配置文件 数据源定义 S(jdbc driver Name) S jdbc. url) Sdbe username value> jdbc. max Active) contextconfigLocation
Spring 事务管理配置过程 说明 该实例是针对 web 容器的实例,Spring 的配置文件的初始化工作完成之后,将存在于 web 服务容器中。 Spring 事务管理配置文件 ${jdbc.driverClassName} ${jdbc.url} ${jdbc.username} ${jdbc.password} ${jdbc.maxActive} 初始化配置文件 在 web 应用中的 web.xml 中添加如下代码即可进行初始化工作 contextConfigLocation
的配置文件放在web-inf/c1 asses/ spring目录下--> /WEB-INE/spring/*.xml org. springframework web context. ContextLoaderlistener 上述代码的意义很简单,通过 Context loader Listener调用 context-param中所定义的 Spring配置文件,进行初始化工作 将 Spring的 ApplicationContext放到内存 将 Spring的上下文放到内存,方便程序调用 通过 Servlet将 Spring的上下文放到内存 public class SmeStarTer extends Http servlEt private static WebApplication Context context =null ∥上下文环境静态类 南执行初始化动作。 *aseejavax.servlethttpHttpservlet#<clinito public void init(javax. servlet Servlet Config config)throws javax. servlet Servlet Exception i 初始化动作 ontext= WebApplicationContextUtils get WebApplication Context(config. getServletContexto) Application Context set Context( context)
/WEB-INF/spring/*.xml org.springframework.web.context.ContextLoaderListener 上述代码的意义很简单,通过 ContextLoaderListener 调用 context-param 中所定义的 Spring 配置文件,进行初始化工作。 将 Spring 的 ApplicationContext 放到内存 将 Spring 的上下文放到内存,方便程序调用 通过 Servlet 将 Spring 的上下文放到内存 public class SMEStarter extends HttpServlet { private static WebApplicationContext context = null; // 上下文环境静态类 /** * 执行初始化动作。 * @see javax.servlet.http.HttpServlet# () */ public void init(javax.servlet.ServletConfig config) throws javax.servlet.ServletException { super.init(config); //初始化动作 ontext = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext()); ApplicationContext.setContext(context); } /* * (非 Javadoc) * @see javax.servlet.Servlet#destroy()
public void destroyO i 取得上下文环境静态类 reture上下文环境静态类 public static WebApplication Context get Application ContextOi return context. ApplicationContext. java代码 public class Application Context f private static Log log=Log Factory get Log( Log Constants. COMMON LOG); ∥ Spring Framework的应用上下文对象 orivate static org. springframework context Application Context context=null 取得 Spring Framework的应用上下文对象。 areturn WebApplication Context Spring Framework的应用上下文对象 public static org. springframework, context Application Context get ApplicationContextOi return context. *设置 Spring Framework的应用上下文对象 * param context Spring Framework的应用上下文对象
*/ public void destroy() { super.destroy(); } /** * 取得上下文环境静态类。 * @return 上下文环境静态类 */ public static WebApplicationContext getApplicationContext() { return context; } } ApplicationContext.java 代码 public class ApplicationContext { private static Log log = LogFactory.getLog(LogConstants.COMMON_LOG); // Spring Framework 的应用上下文对象 private static org.springframework.context.ApplicationContext context = null; /** * 取得 Spring Framework 的应用上下文对象。 * @return WebApplicationContext Spring Framework 的应用上下文对象 */ public static org.springframework.context.ApplicationContext getApplicationContext() { return context; } /** * 设置 Spring Framework 的应用上下文对象。 * @param context Spring Framework 的应用上下文对象
public static void set Context(org. springframework context Application Context context) Application Context context=context *取得在上下文配置文件中定义的类的实例。p> 当name为nuI或者长度为0的字符串时,抛出 IllegalArgumentException异常 param name在上下文配置文件中定义的类的名称 name为nul或者name对应的对象不存在时, 抛出java. lang. IllegalAccessException异常,并记录 error日志 areturn Object类的实例 if(name=null name length(==0)i throw new Illegal Argument Exception("必须指定要创建的对象的name"), Object ret=null context. get Bean( name) 1 catch(NoSuch Bean Definition Exception nsbde)i log errort("找不到指定的对象[name="+name+"]", nsbde) i catch( Beans Exception be)t log error("无法创建指定的对象[name="+name+"]",be), } return ret: 在 Struts中的 action中调用 Spring的事务管理 public Action Forward execute( final Action Mapping mapping, final Action Form form, final hTtp Servletrequest request final Http servlet Response response)throws Exception i
*/ public static void setContext(org.springframework.context.ApplicationContext context) { ApplicationContext.context = context; } /** * 取得在上下文配置文件中定义的类的实例。 * 当name为 null 或者长度为 0 的字符串时,抛出IllegalArgumentException异常。 * @param name 在上下文配置文件中定义的类的名称。 * name 为 null 或者 name 对应的对象不存在时, * 抛出 java.lang.IllegalAccessException 异常,并记录 error 日志 * @return Object 类的实例 */ public static Object getBean(String name) { if (name == null || name.length() == 0) { throw new IllegalArgumentException("必须指定要创建的对象的 name"); } Object ret = null; try { ret = context.getBean(name); } catch (NoSuchBeanDefinitionException nsbde) { log.error("找不到指定的对象 [name=" + name + "]", nsbde); } catch (BeansException be) { log.error("无法创建指定的对象 [name=" + name + "]", be); } return ret; } } 在 Struts 中的 action 中调用 Spring 的事务管理 public ActionForward execute(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
∥ DataSoureeTransaction Manager是 Spring Framework提供的针对 Data Source的事务管理类 ∥见 Spring的配置文件 final Data SourceTransaction Manager transaction Manager =( DataSource TransactionManager)Application Context. get Bean("transactionManager"); final String Wrapper forward =new String Wrapper final Exception Wrapper exception=new Exception Wrapper ∥ Transaction Template是 Spring Framework对事务操作的封装类,调用其 executed方法即可完成事务的操作 ∥ scute方法的参数有 Transaction Callback和 Transaction Callback Resul两种,本实例中采用后者。 ∥调用时需要实现 Transaction callback Without Result类的 don Transaction Without Result( ransaction Status) ∥方法,在该方法中调用事务操作的实际代码。当需要 rollback时,调用 Transaction Status set RollbackonIy0方法即可 TransactionTemplate tx Template= new Transaction Template( transaction Manager); txTemplate. execute(new Transaction Callback Without Resulto) ∥实现抽象方法,该方法中完成事务的具体操作 public void don Transaction WithoutResult(org. springframework transaction Transaction Status tStatus)i 注意,必须還过 transactionManager同一实例获取 DataSource,这样才能保证是同一事务 saction Manager. get DataSource 所有的操作都在该方法内执行 DataSource必须传到后面的子方法中,这样才能保证是同一事务 updateOperator I(bean, c I catch(Exception e)i /出现错误事务回滚 ); ∥进行事务操作( commit、 rollback等的过程中发生异常 log error("执行 Action时发生事务操作错误",txe)
// DataSourceTransactionManager 是 Spring Framework 提供的针对 DataSource 的事务管理类 //见 Spring 的配置文件 final DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ApplicationContext.getBean("transactionManager"); final StringWrapper forward = new StringWrapper(); final ExceptionWrapper exception = new ExceptionWrapper(); // TransactionTemplate 是 Spring Framework 对事务操作的封装类,调用其 execute()方法即可完成事务的操作。 // execute()方法的参数有 TransactionCallback 和 TransactionCallbackWithoutResult 两种,本实例中采用后者。 // 调用时需要实现 TransactionCallbackWithoutResult 类的 doInTransactionWithoutResult(TransactionStatus) // 方法,在该方法中调用事务操作的实际代码。当需要 rollback 时,调用 TransactionStatus.setRollbackOnly()方法即可。 TransactionTemplate txTemplate = new TransactionTemplate(transactionManager); try { txTemplate.execute(new TransactionCallbackWithoutResult() { // 实现抽象方法,该方法中完成事务的具体操作 public void doInTransactionWithoutResult(org.springframework.transaction.TransactionStatus tStatus) { //注意,必须通过 transactionManager 同一实例获取 DataSource,这样才能保证是同一事务 DataSource ds = transactionManager.getDataSource(); //所有的操作都在该方法内执行 Try{ //DataSource 必须传到后面的子方法中,这样才能保证是同一事务 updateOperator1(bean,ds) operator2(bean,ds) }catch(Exception e) { //出现错误事务回滚 tStatus.setRollbackOnly(); } } } ); } catch (TransactionException txe) { // 进行事务操作(commit、rollback 等)的过程中发生异常 log.error("执行 Action 时发生事务操作错误", txe);
f catch(Throwable t)i 所有的异常都必须包装,不能直接抛出 log erron("执行 Action时发生未知错误,t) 数据库层操作的相关代码 数据库层操作所用到的 Data Source必须通过 action层传入 public void add(final Bean bean, Data Source ds)i JdbcTemplate jt= new JdbcTemplate( ds) String Buffer sql= new String Buffer("INSERT INTO ") sql append(table Name) sql append("(c ow_ id, c perm, c en id, c ow type, c func)"); sql append("VALUES(, 7, 2,2, 7)") jt update(sql toString(, new PreparedStatement SetterOi public void set Values( PreparedStatement ps)throws SQLException 4 ps. setLong(l, bean. getOwnerido) ps setInt(2, bean getPermissions(); ps. setLong(3, bean. get Entityido); ps. setlnt(4, bean. getOwner Type) ps setInt(5, bean. getFuno)
} catch (Throwable t) { // 所有的异常都必须包装,不能直接抛出 log.error("执行 Action 时发生未知错误", t); } 数据库层操作的相关代码 数据库层操作所用到的 DataSource 必须通过 action 层传入。 public void add(final Bean bean,DataSource ds) { JdbcTemplate jt = new JdbcTemplate(ds); StringBuffer sql = new StringBuffer("INSERT INTO "); sql.append(tableName); sql.append("(c_ow_id,c_perm,c_en_id,c_ow_type,c_func)"); sql.append(" VALUES(?,?,?,?,?)"); jt.update(sql.toString(), new PreparedStatementSetter() { public void setValues(PreparedStatement ps) throws SQLException { ps.setLong(1, bean.getOwnerid()); ps.setInt(2, bean.getPermissions()); ps.setLong(3, bean.getEntityid()); ps.setInt(4, bean.getOwnerType()); ps.setInt(5, bean.getFun()); } }); }