Насколько я понимаю, экземпляры класса действий Struts2 могут (в отличие от Struts1) иметь состояние, потому что каждый GET или POST для действия создает новый экземпляр класса действия поддержки.
I также обратите внимание, что существует стандартная (?) идиома (Pattern?) для предоставления форм ввода: тот же .jsp используется в качестве компонента View для двух разных действий, например:
<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>
Первое действие просто отображает форму без проверки ввод или его обработка. Форма в .jsp отправляет сообщение второму действию:
<s:form action="validateAndProcessForm" method="post">
, и это второе действие проверяет опубликованные поля / параметры, возвращая «ввод», если входные данные формы являются неполными или недействительными, или фактически вызывая действие учебный класс' s выполнить
, если введенные данные полны и действительны, таким образом обрабатывая форму и возвращая ( например ) formProcessed.jsp
, который отображает что-то вроде «спасибо за ваш ввод» ! ".
Итак, у нас есть такая идиома" штакетника ":
defaultAction- -> realAction-
| | | |
-> input.jsp- <--- -> success.jsp
Это сделано для того, чтобы при первом отображении input.jsp
проверки не вызывались (и поэтому проверка ошибки не показаны), но после того, как будет нажата кнопка отправки на этом jsp, «реальное» действие проверит ввод, возможно, вернув обратно ошибки, вызывающие недопустимый ввод, который отобразит input.jsp
.
Это возвращает нас к действиям с сохранением состояния, не являющимся одноэлементными; поскольку действие имеет состояние и, следовательно, не разделяется между GET или POST, и каждый экземпляр создается только для этого GET или POST, действие не имеет возможности узнать, была ли в конкретном сеансе «ПОЛУЧЕНА» одна и та же страница несколько раз. Таким образом, GETting showForm.action
никогда не будет проверять, а GETing validateAndProcessForm
будет всегда проверять (и показывать ошибки, если параметры недопустимы), даже если этот GET - это первый раз, когда конкретный сеанс "получил" этот URL.
Вот почему нам нужен "столб забора": первое действие просто для отображения формы, второе для захватите ввод.
Я правильно понимаю? Есть ли менее подробный способ сделать это, чтобы не проверять ввод на начальном GET, а проверять на POST, без необходимости иметь два действия для каждой формы?