Jak rozumiem, wystąpienia klasy działania Struts2 mogą (w przeciwieństwie do Struts1) być stanowe, ponieważ każdy GET lub POST dla akcji tworzy nową instancję klasy działania.Pomóż mi lepiej zrozumieć Struts2, sprawdzanie poprawności i działania stanowe
Widzę również, że istnieje norma idiom (wzorzec?) W celu zapewnienia form wejściowych (?): Ten sam .jsp służy jako widoku komponentu dwóch różnych działań, takich jak to:
<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>
pierwsza akcja wyświetla tylko formularz, bez sprawdzania poprawności danych wejściowych lub przetwarzania. Postać w słupkach .jsp na działanie sekund:
<s:form action="validateAndProcessForm" method="post">
i tej drugiej akcji sprawdza poprawność zamieszczonych Pola/parametry, wracając „wejście”, jeśli wejścia formie są niepełne lub nieprawidłowe, a właściwie nazywając akcję klasa execute
jeśli dane wejściowe są kompletne i poprawne, przetwarzając formularz i zwracając (np.) formProcessed.jsp
, który wyświetla coś w rodzaju "dziękuję za wejście!".
Więc mamy tego rodzaju „płotu” idiom:
defaultAction- -> realAction-
| | | |
-> input.jsp- <--- -> success.jsp
Odbywa się to tak, że wyświetlany jest pierwszy raz input.jsp
, walidacje nie są nazywane (a więc błędy walidacji nie są widoczne), ale po kliknięciu przycisku przesyłania na tym jsp, "prawdziwa" czynność sprawdzi poprawność danych wejściowych, prawdopodobnie przekazując błędne dane zwrotne wywołujące błędne dane wejściowe, które będą wyświetlane przez input.jsp
.
Co prowadzi nas z powrotem do działań stanowych, nie pojedynczych; ponieważ akcja ma charakter stanowy, a zatem nie jest udostępniana w GET lub POST, a każda instancja jest tworzona tylko dla tego GET lub POST, akcja nie ma możliwości sprawdzenia, czy dana sesja wielokrotnie "zdobyła" tę samą stronę. Więc poruszanie showForm.action
będzie nigdy validate i czuło będzie zawsze sprawdzania poprawności (i pokazują błędy, jeśli parametry są nieważne), nawet jeśli które się po raz pierwszy dana sesja ma „GETted” tego adresu URL.
Z tego powodu potrzebujemy "słupka ogrodzeniowego": pierwsza operacja tylko po to, aby wyświetlić formularz, a druga do przechwycenia danych wejściowych.
Czy moje zrozumienie jest prawidłowe? Czy istnieje mniej rozwlekły sposób, aby to zrobić, aby nie sprawdzać poprawności danych wejściowych w początkowym GET, ale aby zweryfikować na POST, bez konieczności wykonywania dwóch działań dla każdego formularza?
Nie należy używać oddzielnych akcji do przeglądania formularza w stosunku do przetwarzania formularza. –