Domanda

Il valore predefinito voglio che il mio Struts2 app di trasmettere ad un'azione:

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

sto cercando all'applicazione di chiamare SessionManager.input (), ma invece chiama SessionManager.execute ().

È stato utile?

Soluzione

Se non si desidera in genere un di ingresso () metodo pubblico. Lo scenario più fondamentale e tipico di un'azione è:

  • L'azione ha lo scopo di "fare qualcosa" (una cosa), e questa azione ha bisogno di qualche input da parte dell'utente.
  • L'azione non che qualcosa nel metodo execute ()
  • Se l'azione ha successo che qualcosa, returs Successo . Questo innesca una pagina di risultati informativo JSP.
  • Se l'azione non ha ottenuto l'input dell'utente (perché non c'era alcuna, o perché era insufficiente o sbagliato) restituisce INPUT . Questo innesca un "modulo di input" JSP modo che l'utente può riempire i dati e (ri) provare l'azione.

Ora, questo scenario di base può essere codificato in diversi modi, tra i quali:

1) Due mappature differenti, uno per il modulo di input, altri per l'esecuzione

<!-- 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) A solo un mappatura

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

Entrambi sono molto simili (specialmente se il vostro stanno facendo convalida programmatica). In entrambi i casi, abbiamo solo un metodo di "puntoni" nell'azione ( execute ), che è buona pratica come la nostra azione solo "fa una cosa". Ma nel secondo caso, abbiamo bisogno di trattare il caso in cui i dati non è post, e non lo emette un messaggio di errore per questo caso.

Esempio: Nel caso 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());
    }

}

Nel caso 2 si modifica leggermente:

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

Altri suggerimenti

Quando si chiama un azioni da jsp, il metodo di default è execute (). Se si desidera chiamare un altro metodo, è possibile spec con il metodo di attributo = "".

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

Il metodo attributo è comune in altri tag.

Se si utilizza un tag <s:a..., allora non sarà in grado di chiamare il metodo previsto a parte l'impostazione predefinita execute () metodo. Invece di tag <s:a..., è necessario definire l'azione utilizzando un tag <s:url... con un ID e chiamare lo stesso con una normale html tag di ancoraggio per esempio., <a href=${<<id>>} ma potrebbe essere necessario specificare il metodo nella struts.xml o qualsiasi altro file di configurazione XML, che sono stati inclusi nel file struts.xml con l'attributo metodo nella clausola <action... method="...".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top