先贴上代码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呢?
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呢?
解决方案 »
- tomcat7编译后项目不在webapps下?
- 拍拍网,那个抢购物品的具体流程是什么样的呢???
- 今天高兴啊!再顺便问一丙个问题,送100分再加100分
- javamail的问题:不能用163的邮箱发送,大家帮我啊
- JBuilder菜菜鸟提问,100分相送~~~~~~~~~~~~
- 请问那里有sql server jdbc driver?
- 数据源以及线程的问题
- jbuilder 中每一个工程中所用的包名默认为工程名,但是这个包只有一级,如果才能做成如com.sun.xx.yy的形式
- JBuilder8的郁闷问题!!那位知道?
- 请教大侠;RMI问题
- Oracle的外键约束设置
- 用什么方法查找IP数据库
而RedirectAction是重定向到一个Action 并且请求参数全部丢失,action处理结果也全部丢失。
<result name="success" type="redirectAction">
<param name="namespace">....</param>
<param name="actionName">....</param>
<param name="method">.....</param>
</result>
至于楼主的用法,我试过,确实传参传不过去。如果改成redirect,就可以传过去。