0

默认情况下,我希望我的 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()。

4

3 回答 3

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
    }
}
于 2010-03-30T16:21:45.890 回答
0

当您从 jsp 调用操作时,默认方法是 execute()。如果你想调用另一个方法,你可以通过属性method=""来指定。

<s:url action="SessionManager" method="input"/>

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

于 2009-12-08T14:53:47.003 回答
0

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

于 2009-12-29T09:23:04.340 回答