【问题标题】:struts2 action not calling properlystruts2 动作没有正确调用
【发布时间】:2009-11-22 03:14:29
【问题描述】:

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

【问题讨论】:

    标签: struts2 struts2-namespace


    【解决方案1】:

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

    • Action 旨在“做某事”(一件事),此操作需要一些用户输入。
    • Action 比方法 execute()
    • 如果操作成功地完成了某件事,它会返回 SUCCESS。这会触发一个结果信息 JSP 页面。
    • 如果操作没有获得用户输入(因为没有任何输入,或者因为输入不足或错误),它会返回 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”方法(execute),这是一种很好的做法,因为我们的动作只“做一件事”。 但是在第二种情况下,我们需要处理没有数据发布的情况,并且不要针对这种情况发出错误消息。

    示例:情况 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
        }
    }
    

    【讨论】:

    • 需要注意的是,代码与框架提供的大部分验证机制重复。
    【解决方案2】:

    当你从jsp调用一个动作时,默认的方法是execute()。如果要调用其他方法,可以通过属性method=""来指定。

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

    属性方法在其他标签上是通用的。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        相关资源
        最近更新 更多