struts2动作没有正确调用

时间:2009-11-22 03:14:30

标签: struts2 struts2-namespace

默认情况下,我希望我的struts2应用程序转发到某个操作:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />

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


        <action name="Login_*" method="{1}" class="myApp.SessionManager">
            <result name="input">/myApp/Login.jsp</result>
            <result type="redirectAction">Menu</result>     
        </action>

    </package>

    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <action name="index">
            <result type="redirectAction">
                <param name="actionName">Login_input.action</param>
                <param name="namespace">/myApp</param>
            </result>
        </action>
    </package>


</struts>

我正在寻找调用SessionManager.input()的应用程序,而是调用SessionManager.execute()。

3 个答案:

答案 0 :(得分:1)

您通常不需要公共 input()方法。 Action最基本和最典型的场景是:

  • Action旨在“做某事”(一件事),这个动作需要一些用户输入。
  • Action比方法 execute()
  • 中的东西要多
  • 如果Action成功完成某件事,那就会重新启动 SUCCESS 。这会触发结果信息丰富的JSP页面。
  • 如果Action未获得用户输入(因为没有任何输入,或者因为它不足或错误),则返回 INPUT 。这会触发“输入表单”JSP,以便用户可以填充数据并(重新)尝试操作。

现在,这个基本场景可以用几种方式编码,其中包括:

1)两个不同的映射,一个用于输入表单,另一个用于执行

<!-- default action class: execute does nothing, returns SUCCES -->
<action name="ActionXXXShowForm"> 
                <result>/myApp/XXXForm.jsp</result>
</action>

<action name="ActionXXX" class="myApp.XXXAction"> 
                <result name="input">/myApp/XXXForm.jsp</result>
                <result>/myApp/XXXDone.jsp</result>
</action>

2)只需一个映射

<action name="ActionXXX"  class="myApp.XXXAction"> 
                <result name="input">/myApp/XXXForm.jsp</result>
                <result>/myApp/XXXDone.jsp</result>
</action>

两者非常相似(特别是如果您正在进行程序化验证)。 在这两种情况下,我们在操作中只有一个“struts”方法(执行),这是一种很好的做法,因为我们的操作只做“做一件事”。 但在第二种情况下,我们需要处理没有数据发布的情况,并且不会针对该情况发出错误消息。

示例:案例1:

public class XXXAction extends ActionSupport {
    ...    
    public String execute() throws Exception {
        if(! inputOk()) return INPUT;
         // .. do your stuff
        return SUCCESS;
    }

    private boolean inputOk() {
       // ... check your inputs - sort of programatic validation
       if( surname == null ) addActionError("no surname");
       // .... more checks
       return ! hasActionErrors());
    }

}

在案例2中,您稍微修改它:

public class XXXAction extends ActionSupport {
    ....    
    public String execute() throws Exception {
        if( emptyInput() ) return INPUT;  // no error messages in this case
        if(! inputOk()) return INPUT;
         // .. do your stuff
        return SUCCESS;
    }

    private boolean inputOk() {
       // same as before
    }

    private boolean emptyInput() {
       // detect no input was sent. do not emit errors herer
    }
}

答案 1 :(得分:0)

当您从jsp调用操作时,默认方法是execute()。如果要调用其他方法,可以使用属性method =“”。

进行规范
<s:url action="SessionManager" method="input"/>

属性方法在其他标签上很常见。

答案 2 :(得分:0)

如果您使用<s:a...标记,那么除了默认的execute()方法之外,您将无法调用预期的方法。您需要使用带有id的<s:a...标记来定义操作,而不是<s:url...标记,并使用普通的html锚标记调用相同的内容,即。 <a href=${<<id>>}但您可能需要在struts.xml或任何其他xml配置文件中指定方法,该文件已包含在struts.xml文件中,并带有<action... method="..."子句中的method属性。