Question

Par défaut, je veux que mon application struts2 de transmettre à une action:

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

Je cherche l'application d'appeler SessionManager.input (), mais il appelle SessionManager.execute ().

Était-ce utile?

La solution

Vous ne voulez pas généralement d'un public entrée () méthode . Le scénario le plus typique de base et d'une action est:

  • L'action vise à « faire quelque chose » (une chose), et cette action a besoin d'une intervention de l'utilisateur.
  • L'action ne que quelque chose dans la méthode execute ()
  • Si l'action a fait avec succès que quelque chose, il returs SUCCES . Cela déclenche un résultat Page d'information JSP.
  • Si l'action n'a pas obtenu l'entrée d'utilisateur (parce qu'il n'y avait pas, ou parce qu'elle était insuffisante ou mal) retourne ENTRÉE . Cela déclenche une « forme d'entrée » JSP afin que l'utilisateur peut remplir les données et (re) essayer l'action.

Maintenant, ce scénario de base peut être codé de plusieurs façons, notamment:

1) deux applications différentes, une pour la forme d'entrée, d'autres pour l'exécution

<!-- 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) Juste une cartographie

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

Les deux sont très similaires (surtout si vous êtes en train de faire la validation programmatique). Dans les deux cas, nous avons seulement une méthode « entretoises » dans l'action ( exécuter ), ce qui est une bonne pratique que notre action ne « fait une chose ». Mais dans le second cas, nous devons traiter le cas où aucune donnée est post, et à ne pas émettre un message d'erreur pour ce cas.

Exemple: Dans le cas 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());
    }

}

Dans le cas 2 vous modifiez légèrement:

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

Autres conseils

Lorsque vous appelez une action de jsp, la méthode par défaut est execute (). Si vous voulez appeler une autre méthode, vous pouvez spec par la méthode d'attribut = « ».

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

La méthode d'attribut est commun sur d'autres balises.

Si vous utilisez une balise <s:a..., alors vous ne serez pas en mesure d'appeler la méthode prévue en dehors de la méthode par défaut d'exécution (). Au lieu de la balise <s:a..., vous devez définir l'action à l'aide d'une balise <s:url... avec un identifiant et d'appeler la même chose en utilisant balise d'ancrage HTML normale-à-dire., <a href=${<<id>>} mais vous pouvez avoir besoin de spécifier la méthode dans votre struts.xml ou tout autre fichier de configuration XML, que vous avez inclus dans votre fichier struts.xml avec l'attribut de méthode dans votre clause <action... method="...".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top