Struts2里的动态方法调用和namespace问题

在学strus2的过程中发现了很多问题,一个书上的例子能把人整半天。我发现不同版本的stuts2太不一样了,调试过程中出现了很多的小问题。比如用!的方式进行动态调用Action中的方法,必须在struts.xml中配置<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>。当你使用通配符*_的方式的时候,又得把这个属性设置为false。

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 
	<package name="default" extends="struts-default" namespace="/">
		<action name="login" class="com.tracy.action.LoginAction">
			<result type="redirectAction">
				<param name="namespace">/user</param>
				<param name="actionName">userLogin</param>
			</result>
			<result name="error" type="redirectAction">error</result>
		</action>
		<action name="error">
			<result>/error.jsp</result>
		</action>
	</package>
	<package name="user" extends="struts-default" namespace="/user">
		<action name="userLogin" class="com.tracy.action.UserAction">
			<result>/hello.jsp</result>
		</action>
	</package>
 	-->



	<package name="default" extends="struts-default" namespace="/">      
<!-- 发现一个问题,如果这个包不添加 namespace="/"的话那么redirectAction的时候
访问不到user/userLogin,但是能访问到本包下的error -->
		<action name="login_*" class="com.tracy.action.LoginAction"
			method="{1}">
			<result type="redirectAction">
				<param name="namespace">/user</param>
				<param name="actionName">userLogin</param>
			</result>
			<result name="error" type="redirectAction">error</result>
		</action>
		<action name="error" class="com.tracy.action.UserAction">
			<result>/error.jsp</result>
		</action>
	</package>

	<package name="user" extends="struts-default" namespace="/user">
		<action name="userLogin" class="com.tracy.action.UserAction">
			<result>/hello.jsp</result>
		</action>
	</package>




	<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
</struts>    
发现一个问题,如果default这个包不添加 namespace="/"的话那么redirectAction的时候访问不到user/userLogin,但是能访问到本包下的error。
LoginAction.java
package com.tracy.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	
	@Override
	public String execute() throws Exception {
//		System.out.println("执行LoginAction的execute()方法!");
		return Action.SUCCESS;
	}

	public String redirect() throws Exception {
		System.out.println("执行LoginAction的error()方法!");
		return Action.ERROR;
	}
}

userLogin.java

package com.tracy.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	
	@Override
	public String execute() throws Exception {
//		System.out.println("执行LoginAction的execute()方法!");
		return Action.SUCCESS;
	}

	public String redirect() throws Exception {
		System.out.println("执行LoginAction的error()方法!");
		return Action.ERROR;
	}
}

就像上面说的,如果不加namespace="/" 访问情况是这样的

可是我明明已经在LoginAction里的execute方法里返回SUCCESS了,为啥没有?
我也不是很清楚这个到底什么原因,我估摸着着应该是不加namespace="/"的话,它或许是从默认的命名空间去找LoginAction,然后没有,所以会这样,但是如果找不着Action,
不应该是这个提示啊。。。
我的想法是,把LoginAction放到default包下再试试,具体还没尝试。等以后有时间再试试。
我觉得这个框架确实也是够混乱的,至少对我这种初学者来说


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值