Frage

Auf Standard möchte ich meine struts2 App auf eine Aktion zu übermitteln:

<?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>

Ich bin auf der Suche für die Anwendung SessionManager.input () aufzurufen, sondern es ruft SessionManager.execute ().

War es hilfreich?

Lösung

Sie wollen nicht die Regel eine öffentliche input () Methode. Das grundlegendste und typisches Szenario für eine Aktion ist:

  • Die Aktion sollte „etwas tun“ (eins), und diese Aktion braucht einige Benutzereingabe.
  • Die Aktion tut, als etwas in der Methode execute ()
  • Wenn die Aktion erfolgreich, dass etwas getan hat, returs es ERFOLG . Dies löst eine Folge informative JSP-Seite.
  • Wenn die Aktion nicht die Benutzereingaben erhalten (weil es keine war, oder weil sie unzureichend oder falsch waren) es gibt INPUT . Dies löst eine „Eingabemaske“ JSP, so dass der Benutzer die Daten füllen kann und (Wieder-) versuchen, die Aktion.

Nun, das Basisszenario kann auf verschiedene Weisen codiert werden, unter anderem:

1) Zwei verschiedene Abbildungen, eine für das Eingabeformular, andere für die Ausführung

<!-- 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) Nur eine Zuordnung

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

Beide sind sehr ähnlich (vor allem, wenn Ihre programmatische Validierung tun). In beiden Fällen haben wir nur ein „Streben“ -Methode in der Aktion ( Ausführen ), die gute Praxis ist, wie unser Handeln nur „ist eine Sache“. Aber im zweiten Fall müssen wir mit dem Fall befassen, in denen keine Daten senden sind, und nicht emit eine Fehlermeldung für diesen Fall.

Beispiel: Im Fall 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());
    }

}

Im Fall 2 Sie es leicht ändern:

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
    }
}

Andere Tipps

Wenn Sie eine Aktion von jsp nennen, ist die Standardmethode () auszuführen. Wenn Sie eine andere Methode aufrufen möchten, können Sie durch das Attribut Methode spec = „“.

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

Das Attribut Methode ist üblich, auf andere Tags.

Wenn Sie eine <s:a...-Tag verwenden, dann werden Sie nicht in der Lage sein, neben der beabsichtigten Methode aufrufen aus der Standard-Methode execute (). Statt <s:a... Tag, müssen Sie die Aktion mit einem <s:url...-Tag mit einer ID und rufen Sie das gleiche mit normalen HTML-Anker-Tag, dh definieren., <a href=${<<id>>} Sie können jedoch die Methode in Ihrem struts.xml oder jede andere XML-Konfigurationsdatei, die Sie aufgenommen haben in Ihrer struts.xml Datei mit dem Attribut method in Ihrer <action... method="..." Klausel.

angeben müssen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top