`
colin4k
  • 浏览: 30041 次
文章分类
社区版块
存档分类
最新评论

有没有人在struts2的action这一层做事务控制?

阅读更多
上一篇我的struts2配置,间接实现零配置
然后因为业务需求,需要对action实现事务,结果发现,通过通配符配置的action,因为是通过struts2
的自动装配,没有在struts2和spring2的配置文件中声明,经测试,在其他配置在spring中的bean中
是无法使用struts2的action的,会报nullpointer错误,所以我现在怀疑,在spring2中做的声明式
事务,可能对action也没有作用

分享到:
评论
16 楼 dengyin2000 2007-11-16  
可以考虑open session in view  用struts2的intercepter
15 楼 qianjinfu 2007-11-16  
引用
action当然不应该封装业务逻辑,但是action是controller,比如在一个action里面可能会由几个Business Service的方法组成一个流程如果仅对service的方法实现事务控制,那如果流程中某一个service 的方法出现了问题,流程中之前调用的其他service怎么回滚呢。






设计不好,应该避免这种情况, 最好事务控制在service的方法上
14 楼 colin4k 2007-10-18  
ladofwind 写道
colin4k 写道
movingboy 写道
colin4k 写道
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。

这段流程是否可以移到一个单独的组件中,然后对该组件进行事务控制?

如果有很多这样的需求,是否每次都需要编写一个单独的组件?
action作为controller,本来就应该起到流程控制、转发等作用,这是它本职的工作,不应该交由业务层去
处理


这句话不太理解,我是这样认为的,为避免web层和business层的藕合,
action里面仅仅是获得request然后交由业务层去处理,然后
处理返回后forward到某一页面.

你这样的需求可以在web tier 和 business tier加一层
business delegation层.由它去调用真正的业务方法.
需要对业务方法进行事务控制也在这个delegation里做控制
比如:
       class BusinessDelegation{
             operation1(){
                 service1();
                 service2();
                 ......
             }
       }
     对operation1加事务控制就可以了.

不可否认你说的这样很理想,但是也正是因为理想,跟实际是有差距的。之前的项目,虽然也是对MVC或者说
DAO-BO-VIEW三层做了要求,实际项目做下来,因为时间等客观因素,导致最后有很多业务逻辑直接写在
Action里面。现在我们对项目的技术框架重新构建,虽然这次严格要求业务逻辑要从Action里面抽取出来
放在BO里面,但是如果按你说的这样再抽取一层,必然会增加大量的工作量,使得这次技术框架的调整风险
更大。
13 楼 ladofwind 2007-10-17  
colin4k 写道
movingboy 写道
colin4k 写道
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。

这段流程是否可以移到一个单独的组件中,然后对该组件进行事务控制?

如果有很多这样的需求,是否每次都需要编写一个单独的组件?
action作为controller,本来就应该起到流程控制、转发等作用,这是它本职的工作,不应该交由业务层去
处理


这句话不太理解,我是这样认为的,为避免web层和business层的藕合,
action里面仅仅是获得request然后交由业务层去处理,然后
处理返回后forward到某一页面.

你这样的需求可以在web tier 和 business tier加一层
business delegation层.由它去调用真正的业务方法.
需要对业务方法进行事务控制也在这个delegation里做控制
比如:
       class BusinessDelegation{
             operation1(){
                 service1();
                 service2();
                 ......
             }
       }
     对operation1加事务控制就可以了.
12 楼 ddandyy 2007-10-15  
事务处理和action无关
如果真的想这么弄  别用struts了
直接用jsp servlet 挂个spring不就完事了么
11 楼 daquan198163 2007-10-15  
colin4k 写道
movingboy 写道
colin4k 写道
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。

这段流程是否可以移到一个单独的组件中,然后对该组件进行事务控制?

如果有很多这样的需求,是否每次都需要编写一个单独的组件?
action作为controller,本来就应该起到流程控制、转发等作用,这是它本职的工作,不应该交由业务层去
处理

此流程非彼流程,不要仅从字面理解
mvc中controller要控制的是页面转发的流程
10 楼 colin4k 2007-10-15  
movingboy 写道
colin4k 写道
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。

这段流程是否可以移到一个单独的组件中,然后对该组件进行事务控制?

如果有很多这样的需求,是否每次都需要编写一个单独的组件?
action作为controller,本来就应该起到流程控制、转发等作用,这是它本职的工作,不应该交由业务层去
处理
9 楼 movingboy 2007-10-15  
colin4k 写道
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。

这段流程是否可以移到一个单独的组件中,然后对该组件进行事务控制?
8 楼 KKND 2007-10-14  
Action抛出的异常会马上被专门的处理类捕获掉,声明式的事务应该无法正确的回滚。
7 楼 colin4k 2007-10-13  
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个Business Service的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。
6 楼 rainlife 2007-10-13  
在action中进行事务控制有意义吗?action不应该封装业务逻辑。
5 楼 lujh99 2007-10-13  
使用spring可以将事务通过声明方式配置到action类的方法上,但是对于抛出的异常怎么处理,难道直接抛给客户?至少没有配置到service层上的那样灵活。
4 楼 colin4k 2007-10-13  
另外,本来想测试清楚spring2的声明式事务到底对struts2的自动装配的action是否有效,结果按着spring2的文档,基于aop方式配置多个pointcut,始终提示错误,不知道算不算是spring2的bug
3 楼 colin4k 2007-10-13  
恩,跟我现在的思路一样,自己仿着Struts2的MethodFilterInterceptor写了一个,加入事务控制。
Struts2的MethodFilterInterceptor只能匹配确定的方法名,不能识别通配符,所以自己写了一个。
2 楼 XMLDB 2007-10-13  
最好专门给action的事务配一个事务拦截器,楼主可以试试这个方法。
搜到一段代码:
/*
 * Created on 2006-5-20
 *
 */
package com.wolfsquare.core.webwork.interceptor;

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;
import com.wolfsquare.core.Application;

/**
 * 控制Action级的事务
 * 
 * @author wolfsquare
 * 
 */
public class ActionTransactionInterceptor implements Interceptor {
	private DefaultTransactionDefinition def = new DefaultTransactionDefinition();

	private PlatformTransactionManager transactionManager = null;

	public void destroy() {
	}

	public void init() {
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		// TODO 获取当前事务管理器,似乎Spring框架有更好的方式.
		transactionManager = (PlatformTransactionManager) Application
				.getInstance().getContainer()
				.getComponent("transactionManager");
	}

	public String intercept(ActionInvocation ai) throws Exception {
		String ret = null;
		TransactionStatus status = transactionManager.getTransaction(def);
		try {
			ret = ai.invoke();
			transactionManager.commit(status);
		} catch (Exception e) {
			transactionManager.rollback(status);
			throw e;
		}

		return ret;
	}

}
1 楼 XMLDB 2007-10-13  
引用
在其他配置在spring中的bean中
是无法使用struts2的action的
为什么bean要调action

相关推荐

    struts2一个真正的项目事例,对struts2不了解的人可以下载学习

    SSH(Struts2、Spring、Hibernate)是Java开发中常见的集成框架,其中Struts2负责控制流程,Spring管理依赖注入和事务处理,Hibernate则作为持久层框架,处理数据库交互。 标题中提到的"struts2一个真正的项目事例...

    搭建maven spring3 struts2 mybatis工程代码 demo源码及详细文档

    这个资源包含了一个基于Maven、Spring3、Struts2和MyBatis的Java Web项目的完整示例和详细搭建步骤,旨在帮助开发者在没有现成环境的情况下快速构建一个功能齐全的Web应用程序。以下是对这些技术栈的详细介绍: 1. ...

    struts spring 实现简单的邮件发送

    3. **Struts2整合**:在Struts2的配置文件(struts.xml)中,定义一个Action类,该类会调用邮件服务类发送邮件。当用户触发特定的请求时,Struts2的拦截器会根据配置找到对应的Action并执行其方法。 4. **视图层...

    SSH2(自己写的 用了顺手)

    至于文件"Struts2Demo",这可能是作者提供的一个Struts2的示例项目,可能包含了SSH2整合和分页功能的实现代码,供其他人学习或参考。通过分析这个Demo,可以深入了解SSH2整合的细节以及分页功能如何在实际项目中应用...

    Java高级工程师面试题SSH2

    2. **与Struts1的关系:** 虽然名字相似,但Struts2与Struts1之间并没有直接的继承关系,它们是两个相对独立的框架。 3. **核心组件:** Struts2的核心组件包括FilterDispatcher(用于拦截HTTP请求)、Action(业务...

    一个标准的SSH框架要用到的包(没有报冲突错误)

    SSH框架在Java开发中是一个非常重要的组合,它包括Spring、Struts和Hibernate这三个核心组件。这个压缩包提供了构建一个无冲突问题的SSH框架所需的全部依赖。让我们深入了解一下这些组件及其在Java Web应用中的作用...

    eclipse下整合搭建ssh通用项目

    1. Struts2:这是一个基于MVC设计模式的Java Web应用框架,用于处理用户请求,控制应用程序流程,并提供了强大的Action类和拦截器机制。 2. Spring:这是一个全面的Java企业级应用开发框架,它支持依赖注入、面向切...

    ssh(structs,spring,hibernate)框架中的上传下载

    将FileActionForm直接作为业务层的接口入参,相当于将Web层传播到业务层中去,即将业务层绑定在特定的Web层实现技术中,按照分层模型学院派的观点,这是一种反模块化的设计,但在"一般"的业务系统并无需提供多种UI...

    java工程师面试题

    - **Struts 1与Struts 2**:虽然名称相似,但它们之间没有继承关系,Struts 2实际上是WebWork框架的一个扩展,具备更多的功能和灵活性。 - **Spring与Struts**:Spring主要是一个依赖注入框架,而Struts专注于Web层...

    个人学习收集

    综上所述,这个压缩包提供的学习资料涵盖了Web开发中的三个重要组件:Struts2负责控制层,Hibernate处理数据持久化,Spring则作为一个综合性的框架,整合了多种功能。对于想要深入理解Java Web开发的人来说,这些...

    java mysql+ssh+jsp

    Struts2负责控制层,Spring提供依赖注入和事务管理,Hibernate则作为持久层框架,简化数据库操作。SSH框架组合在一起,可以高效地处理业务逻辑和数据交互。 在SSH框架中: 1. **Struts2**:是一个MVC框架,它负责...

    办公自动化管理系统

    在这个特定的项目中,开发者使用了S2SH(Struts2 + Spring + Hibernate)框架与MySQL数据库相结合的方式进行开发,这是一种常见的企业级应用开发组合。 **Struts2** 是一个基于MVC(Model-View-Controller)设计...

    JavaEE 入门详细教材(附图)

    - **IoC(Inversion of Control,控制反转)**:这是一种设计模式,旨在减少代码间的耦合度。在Spring中,对象的创建和管理由Spring容器负责,而不是在代码中直接new对象。这种方式使得代码更加模块化,易于测试和...

    SSH增删查改功能(人力资源管理系统)

    在人力资源管理系统中,Spring可以管理各种bean,包括数据访问对象(DAO)、服务层对象和控制器,实现事务管理和安全控制。 Struts作为 MVC 框架,主要负责处理HTTP请求并调度到相应的控制器,以及管理视图与模型的...

    ssh网上书店代码

    在这个网上书店中,Spring可能被用来管理数据库连接、事务控制以及Service层的bean,使得代码更加解耦和易于测试。 3. **Hibernate**:作为持久层框架,Hibernate简化了与数据库的交互,通过对象关系映射(ORM)...

    自己做的小型CRM模块SSH1

    【标题】"自己做的小型CRM模块SSH1"指的是一个基于SSH(Spring、Struts、Hibernate)框架开发的轻量级客户关系管理(CRM)模块。SSH是Java Web开发中的经典组合,Spring负责依赖注入和事务管理,Struts作为MVC框架...

    java三大框架

    Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的 Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    面试题集锦~需要面试的看看吧~

    完全二叉树是一种特殊的二叉树,它的每一个节点都有两个孩子节点,左孩子和右孩子,并且所有的叶子节点都在最后一层。在面试中,完全二叉树经常被用来考察候选人的数据结构知识和逻辑思维能力。 3. 什么是索引 答案...

    SSH+CRM人事资源管理(zking)

    2. **Struts框架**:Struts是MVC(模型-视图-控制器)设计模式的实现,主要处理Web层的逻辑。在这个项目中,Struts负责接收用户请求,解析参数,并将控制权传递给相应的业务逻辑组件,最后将结果数据渲染成视图返回...

Global site tag (gtag.js) - Google Analytics