先贴上代码public class TestAction extends ActionSupport{
private String name;
public String execute() throws Exception{
return SUCCESS;
}//省略get,set
public class TestAction2 extends ActionSupport{
private String name;
public String execute() throws Exception{
System.out.println("testaction2:" + name);
return SUCCESS;
}//省略很简单的2个Action,没什么好多说的struts.xml<struts>
    <constant name="struts.devMode" value="true" />
<package name="test" extends="struts-default">
<action name="test1" class="struts.action.TestAction">
<result name="success" type="redirectAction">test2?name=${name}</result>
</action>

<action name="test2" class="struts.action.TestAction2">
<result>/index.jsp</result>
</action>
</package>
</struts>
问题来了。当Action的返回结果是chain的时候没问题<action name="test1" class="struts.action.TestAction">
<result name="success" type="chain">test2</result>
</action>但是用redirectAction时参数无法传递,就算像这样传递test2?name=${name},仍然无法传递过去,并且浏览器中的地址很明显的可以看到只有test2,后面的参数是没有的。然后单步跟踪调试,发现如下一段代码String extension = mapping.getExtension();//extension用来存放扩展名
        if (extension == null) {
            extension = getDefaultExtension();
            // Look for the current extension, if available
            ActionContext context = ActionContext.getContext();
            if (context != null) {
                ActionMapping orig = (ActionMapping) context.get(ServletActionContext.ACTION_MAPPING);
                if (orig != null) {
                    extension = orig.getExtension(); //这里执行以后extension变成了Null
                }
            }
        }        if (extension != null) {            if (extension.length() == 0 || (extension.length() > 0 && uri.indexOf('.' + extension) == -1)) {
                if (extension.length() > 0) {
                    uri.append(".").append(extension);
                }
                if (params.length() > 0) {
                    uri.append(params);  //这里就是将请求参数添加到url中,但是很明显这一步的前提是扩展名不为null
                }
            }
        }接着我猜想是不是要在一开始的请求地址中的test1后面加上.action,我试了一下果然就没问题了。虽然知道了是什么问题,但是却不是很理解
ActionMapping orig = (ActionMapping) context.get(ServletActionContext.ACTION_MAPPING);
这里取得的ActionMapping难道扩展名不是默认用.action的吗?
为什么会出现扩展名为null呢?

解决方案 »

  1.   

    发了贴才发现这句话// Look for the current extension, if available会不会是这个问题呢,因为我的第一个请求地址test1后面并没有.action,所以才会得到extension为null
      

  2.   

    主要在于chain 是用来处理内部action链的 
    而RedirectAction是重定向到一个Action 并且请求参数全部丢失,action处理结果也全部丢失。 
      

  3.   

    你没看清我的问题,我知道会全部丢失,所以在重定向的时候我附加了请求参数<result name="success" type="redirectAction">test2?name=${name}</result>问题是重定向的url不包括后面的查询字符串,这是问题所在而如果我最初的url地址不是test1?name=111,改为test1.action?name=111,那就没问题,可以将参数传过去
      

  4.   

    是不是再不传参数时 后面默认为你当前名称空间 而加参数后你没写你的名称空间 即.action所以它把你的参数(?name=111)作为名称空间了 导致没找到 而使你的请求地址test1.action?name=111不可用
      

  5.   

    type类型为redirectAction时,不应该这样用。文档上的用法是这样的
    <result name="success" type="redirectAction">
       <param name="namespace">....</param> 
       <param name="actionName">....</param>
       <param name="method">.....</param>
    </result>
    至于楼主的用法,我试过,确实传参传不过去。如果改成redirect,就可以传过去。