Действие struts2 не вызывается должным образом

По умолчанию я хочу, чтобы мое приложение 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().


person Dlongnecker    schedule 22.11.2009    source источник


Ответы (3)


Обычно вам не нужен публичный метод input(). Самый простой и типичный сценарий действия:

  • Действие предназначено для того, чтобы «что-то сделать» (одну вещь), и для этого действия требуется некоторый ввод пользователя.
  • Действие делает что-то в методе 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" в действии (выполнить), что является хорошей практикой, поскольку наше действие "делает только одно". Но во втором случае нам нужно иметь дело со случаем, когда данные не публикуются, и не выводить сообщение об ошибке для этого случая.

Пример: В случае 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
    }
}
person leonbloy    schedule 30.03.2010
comment
С оговоркой, что, как показано, код дублирует большую часть механизмов проверки, предоставляемых платформой. - person Dave Newton; 28.11.2012

Когда вы вызываете действия из jsp, метод по умолчанию — execute(). Если вы хотите вызвать другой метод, вы можете указать атрибут method="".

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

Метод атрибута является общим для других тегов.

person Luis C.    schedule 08.12.2009

Если вы используете тег <s:a..., вы не сможете вызвать нужный метод, кроме метода execute() по умолчанию. Вместо тега <s:a... вам нужно определить действие с помощью тега <s:url... с идентификатором и вызвать его, используя обычный тег привязки html, т. е. <a href=${<<id>>}, но вам может потребоваться указать метод в файле struts.xml или любом другом файле конфигурации xml. , который вы включили в файл struts.xml с атрибутом метода в предложении <action... method="...".

person Mohan    schedule 29.12.2009