azione Struts2 non chiamare correttamente
-
21-09-2019 - |
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 ().
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="..."
.