Помогите мне лучше понять Struts2, проверку и действия с отслеживанием состояния

Насколько я понимаю, экземпляры класса действий 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, без необходимости иметь два действия для каждой формы?

5
задан tpdi 13 January 2011 в 03:14
поделиться