在学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.javapackage 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包下再试试,具体还没尝试。等以后有时间再试试。
我觉得这个框架确实也是够混乱的,至少对我这种初学者来说