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

StackOverflow https://stackoverflow.com/questions/1777714

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Вы не хотите, как правило, публичного ввод () способ.Самым основным и типичным сценарием Действия является:

  • Действие предназначено для того, чтобы "сделать что-то" (одну вещь), и это действие требует некоторого пользовательского ввода.
  • Действие выполняет больше, чем что-либо в методе выполнить()
  • Если действие успешно выполнило это что-то, оно возвращает УСПЕХ.Это запускает результирующую информативную страницу JSP.
  • Если Действие не получило пользовательский ввод (потому что его не было, или потому что он был недостаточным или неправильным), оно возвращает ВХОДНЫЕ ДАННЫЕ.Это запускает 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
    }
}

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top