我们知道struts的restult type 有很多,但主要就是四种

dispatch,rediret,chain,drdirectaction

要让数据从一个action传到另一个action,就只能使用后两种,即chain与redirectaction(后来发现rediret也可以,网上说使用redirect的时候得加上扩展名例如,login.acion等等,可我发现,不加也OK)。

可能是因为,我的过滤器是这么写的

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

这俩的区别如下:



先说chain,如果resulttype为chain,如果第一个action(我们暂且称为actionFraom)里面有有个成员变量叫name,而且第二个action(称为actionTo)里面也有个变量叫name,那么第二个action里面的值会复制第一个action。

public class ClassFrom {
    private String  name;
    private String transFormLocation;
    public String execute(){
        setTransFormLocation("classTo");
        System.out.println("i am classfrom");
        System.out.println(name+" name");
        return "success";
    }
    //省略getset
}

public class ClassTo {
    private String name;
    private String other;

    public String execute(){
        System.out.println("I am  classto");
        System.out.println(name+" name to");
        System.out.println(other+" other to");
        return "success";
    }
    //省略getset方法
}

如果,actionTo里面有个变量叫other,我想让它也复制actionFrom里name的值,下面这种写法是不行的

    <package name="sdf" namespace="/modules" extends="struts-default">

         <action name="classFrom" class="com.bufoon.action.ActionFrom" >
             <result name="success" type="chain">
                <param  name="actionName">classTox</param>
                <param   name="other">${name}</param>
             </result>
        </action>

        <action name="classTox" class="com.bufoon.action.ActionTo" >
            <result>../result.jsp</result>
        </action>

    </package> 

上面的情况下,actionto里面的other的值为null

但是actionfrom与actionto里同名的变量name的值是统一的(如果非要在actionto里用other获得值,让它自己找actionto里的name要)

如果使用redirectAction,那么情况刚刚相反,

actionTo里面的other获得了actionFrom里name的值

但是actionTo里面的name却为null



结论

1 基本都用chain吧 能满足你传值的需要(前提是两个action的变量是一致的)

2 如果用redirectaction 就得手动在xml里写param

更多资料见

http://blog.csdn.net/yujielu2012/article/details/8188383

以上为基础知识

****************************





今天在做项目的时候,发现一个搞不明白的问题。

首先,项目采用的是ssh,事务我采用的是xml的声明式事务管理。

ClassFrom与ClassTo的execute方法就等于是在一个事务里的。

struts的配置文件如下:

<package name="sdf" namespace="/modules/file_gxb/createFile" extends="struts-default">

         <action name="classFrom" class="cdm.module.file.gxb.action.ClassFrom" >
            <result type="chain">classTox</result>
        </action>

        <action name="classTox" class="cdm.module.file.gxb.action.ClassTo" >
            <result>../../../result.jsp</result>
        </action>
</package>

结果报了下面的错误

java.lang.ClassCastException: cdm.module.file.gxb.action.ClassFrom cannot be cast to cdm.module.file.gxb.action.ClassTo



    cdm.module.file.gxb.action.ClassTo$$FastClassByCGLIB$$43d16e6a.invoke()

    net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)

    org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)

    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)

    org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)

    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)

    org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)

    cdm.module.file.gxb.action.ClassTo$$EnhancerByCGLIB$$90aba811.execute()

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

刚开始,我还以为是自己对struts的传值理解的不清楚,就找了些资料,写了本篇博客的前半部分。

可是前面,action不管值能不能传递,最起码不会说ClassCastException呀。



最后仔细分析了错误,发现有aop的问题。

最后把chain改成了redirectAction 就一切OK了。

但是,此时两个action就不在一个事务里了

目前我没有更好的办法

问题就在aop里。

但是这里面更深层次的东西,估计得看源码才能解决了。

结论:

出了bug不要急,仔细看看异常的输出栈

Struts Chain ClassCastException Aop的更多相关文章

  1. org.apache.struts.chain.commands.InvalidPathException: No action config found for the specified url.

    No action config found for the specified url url路径下找不到action,原因是stuts-config.xml文件配置错误. demo的项目文件如下: ...

  2. 尚学堂马士兵struts2 课堂笔记(四)

    27 结果类型 主要就四种种 dispatch和rediret chain和drdirectaction <package name="resultTypes" namesp ...

  3. struts框架学习过程中的问题

    1,错误: java.lang.NullPointerException: Module 'null' not found.错误原因,struts运行需要的.jar文件拷贝不足,应该把它们加入到cla ...

  4. 【struts 报错】 No action config found for the specified url

    1 type Exception report message org.apache.struts.chain.commands.InvalidPathException: No action con ...

  5. 使用Hibernate+MySql+native SQL的BUG,以及解决办法

      本来是mssql+hibernate+native SQL 应用的很和谐 但是到了把mssql换成mysql,就出了错(同样的数据结构和数据). 查询方法是: String sql = " ...

  6. S2SH+mysql-软件开发实际部署问题-8个小时后提示MYSQL数据库无法连接

    type Exception report message description The server encountered an internal error () that prevented ...

  7. Struts1的核心对象

    1.ActionServlet.ActionMapping.ActionForm.ActionForward 2.config = "/WEB-INF/struts-config.xml&q ...

  8. Spring day03笔记

    spring day02回顾 AOP :切面编程 切面:切入点 和 通知 结合 spring aop 编程 <aop:config> 方法1: <aop:pointcut expre ...

  9. struts2的result的type属性

    一共有两个属性name和type name这里就不介绍了 type    返回结果的类型,值可以从default-struts.properties中看到看到 常用的值:dispatcher (默认) ...

随机推荐

  1. spring cloud 入门系列三:使用Eureka 搭建高可用服务注册中心

    在上一篇中分享了如何使用Eureka 进行服务治理,里面搭建的服务注册中心是单体的, 但是在实际的应用中,分布式系统为了防止单体服务宕机带来严重后果,一般都会采用服务器集群的形式,服务注册中心也是一样 ...

  2. Template基础

    模板系统的介绍 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  3. 关于云Linux部署tomcat服务器(Maven的多模块war包)

    博主的运行环境: 电脑系统: Linux mint 18 JDK版本: java version "1.8.0_171" Maven版本:  Apache Maven 3.5.3 ...

  4. 搭建ejabberd集群

    搭建ejabberd集群(金庆的专栏 2016.8)以2台机器搭建一个ejabberd集群.2台机器都是外网一块网卡,内网另一块网卡.新建一个域名,添加2台机器的外网IP.分别用源码安装ejabber ...

  5. Android必知必会-发布开源 Android 项目注意事项

    如果移动端访问不佳,请使用 –> Github版 1. 合理配置 .gitignore 文件 配置 .gitignore 可以排除一些非必要文件和保护保密信息,下面是在项目根目录下 .gitig ...

  6. 全文检索Lucene (1)

    Lucene是apache开源的一个全文检索框架,很是出名.今天先来分享一个类似于HelloWorld级别的使用. 工作流程 依赖 我们要想使用Lucene,那就得先引用人家的jar包了.下面列举一下 ...

  7. XMPP(三)-安卓即时通讯客户端

    由于时间原因,所以更新比较慢 ,还请大家谅解,此次是对上篇文章中的安卓客户端初级版本进行的一次更新优化,在这次更新后,就有那么一点样子了,可以拿的出手了,呵呵,还在关注的同学也可以及时下载更新.此次主 ...

  8. JBOSS EAP 6 系列五 Managed domains 管理域最主要的功能是“统一部署,统一配置”

    摘要 本文首先介绍Managed Domain的概念,管理域最主要的功能是"统一部署,统一配置".接下来通过一个实例在"统一配置"部分实现一个双机配置起来的域, ...

  9. 《高性能MySQL》读书笔记(上)

    <High Performance MySQL>真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧.常见问题全都有所提及.数据库的各种概念技巧平时都有接触,像索引.分区.Shardi ...

  10. Github客户端以及Git shell的使用

    昨天介绍了怎么使用Git Shell来commit我们的代码,但是这都是简单的操作,我们还没有使用到Github是怎么进行版本控制的呢.所以,今天就来介绍一下,怎么来做版本控制吧. 必备材料 首先要确 ...