Come ho capito, le istanze della classe azione di Struts2 possono (diversamente da Struts1) essere stateful, perché ogni GET o POST di un'azione crea una nuova istanza della classe di azione di supporto.Aiutami a capire meglio Struts2, convalida e azioni stateful
vedo anche che c'è uno standard linguaggio (Pattern?) Per fornire moduli di input (?): Lo stesso .jsp viene utilizzato come componente Vista di due diverse azioni, in questo modo:
<action name="showForm" class="defaultActionThatDoesNothingExceptReturnSuccess">
<result name="success">inputForm.jsp</result>
</action>
<action name="validateAndProcessForm" class="realAction">
<result name="input">inputForm.jsp</result>
<result name="success">formProcessed.jsp</result>
</action>
Il la prima azione mostra solo il modulo, senza convalidare l'input o elaborarlo. La forma in posti di .jsp all'azione secondo:
<s:form action="validateAndProcessForm" method="post">
e che la seconda azione convalida i campi/parametri inviati, tornando "input" se gli ingressi del modulo sono incomplete o non validi, o addirittura chiamando l'azione classe execute
se gli input sono completi e validi, quindi elaborando il modulo e restituendo il (ad esempio) formProcessed.jsp
che visualizza qualcosa del tipo "grazie per il vostro contributo!".
Quindi abbiamo questa sorta di linguaggio "steccato":
defaultAction- -> realAction-
| | | |
-> input.jsp- <--- -> success.jsp
Questo è fatto in modo da visualizzare la prima volta input.jsp
, convalide non sono chiamati (e così errori di validazione non sono mostrati), ma dopo aver fatto clic sul pulsante di invio su quel jsp, l'azione "reale" convaliderà l'input, eventualmente restituendo errori che invocano l'input non valido che verrà visualizzato da input.jsp
.
Che ci riporta ad azioni stateful, non singleton; poiché l'azione è stateful e quindi non condivisa su GET o POST, e ogni istanza è istanziata solo per quel GET o POST, l'azione non ha modo di sapere se una determinata sessione ha "GETATO" la stessa pagina più volte. In modo da ottenere showForm.action
sarà mai convalidare e geting volontà (errori e mostrare se i parametri non sono validi) sempre Convalida, anche se che ottiene è la prima volta che una particolare sessione ha "GETted" tale URL.
Ecco perché è necessario il "fence post": la prima azione solo per visualizzare il modulo, il secondo per acquisire l'input.
La mia comprensione è corretta? C'è un modo meno verboso per farlo, per non convalidare l'input sul GET iniziale, ma per convalidarlo sul POST, senza dover avere due azioni per ogni modulo?
Non utilizzare azioni separate per visualizzare il modulo o elaborare il modulo. –