Помогите мне лучше понять Struts2, проверку и действия с состоянием - PullRequest
5 голосов
/ 13 января 2011

Насколько я понимаю, экземпляры класса действия Struts2 могут (в отличие от Struts1) иметь состояние, поскольку каждый GET или POST для действия создает новый экземпляр класса вспомогательного действия.

Я также вижу, что естьСтандартная (?) идиома (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 отправляет действие second :

<s:form action="validateAndProcessForm" method="post">

, и это второе действие проверяет опубликованные поля / параметры, возвращая «input», если входные данные формы являются неполными или недействительнымиили, фактически, вызывая execute класса действия, если входные данные полны и действительны, таким образом обрабатывая форму и возвращая ( например ) formProcessed.jsp, который отображает что-то вроде "спасибо за ваш ввод!"1015 *

Таким образом, у нас есть такая идиома «пикетный забор»:

defaultAction-           -> realAction-
             |           |     |       |
             -> input.jsp-  <---       -> success.jsp

Это делается для того, чтобы при первом отображении input.jsp проверки не вызывались (и поэтому ошибки проверкине отображаются), но после нажатия кнопки «Отправить» на этом jsp «реальное» действие проверит ввод, возможно, вернув ошибки, вызывающие неверный ввод, который отобразит input.jsp.

Что возвращает нас к действиям с состоянием, не одноразовым;поскольку действие является состоянием и, следовательно, не используется совместно GET или POST, а каждый экземпляр создается только для этого GET или POST, действие не может определить, был ли конкретный сеанс «ПОЛУЧЕНО» на одной и той же странице несколько раз.Таким образом, GETting showForm.action будет никогда проверять, а GETing validateAndProcessForm будет всегда проверять (и показывать ошибки, если параметры недействительны), , даже если этот GETэто первый раз, когда конкретный сеанс «ПОЛУЧИЛ» этот URL.

Вот почему нам нужен «столб забора»: первое действие просто для отображения формы, второе для захвата ввода.

Правильно ли мое понимание?Есть ли менее подробный способ сделать это, чтобы не проверять ввод на начальном GET, но проверять на POST, без необходимости иметь два действия для каждой формы?

Ответы [ 3 ]

9 голосов
/ 14 января 2011

Есть другой способ выполнить то, что вы хотите, без забора. По умолчанию перехватчик проверки не запускается для метода ввода. Поэтому вы можете обновить свой struts.xml следующим образом:

<action name="*MyForm" method="{1}" class="realAction">
  <result name="input">inputForm.jsp</result>
  <result name="success">formProcessed.jsp</result>
</action>

При такой настройке пустое действие вообще не требуется. Когда вы впервые переходите на форму, вы переходите по URL-адресу «inputMyForm», и ваше действие формы просто указывает на «MyForm». {1} в блоке метода просто означает, что каркас будет вызывать любой метод, соответствующий * из имени действия. Если * match пустое, по умолчанию используется метод execute. Таким образом, вы получаете следующие виды действий:

  • inputMyForm будет идти к методу input () вашего класса действий
  • MyForm перейдет к методу execute () вашего класса действий
  • executeMyForm будет идти к методу execute () вашего класса действий
  • customMethodNameMyForm будет идти к методу customMethodName () вашего класса действий

Поскольку перехватчик валидатора исключает любые действия, связанные с методом ввода, вы можете настроить любую валидацию, которую хотите для этого действия, и она будет искать ее только при отправке формы. Поскольку каждый раз, когда вы отправляете форму, она отправляется в метод execute, проверка будет выполняться каждый раз, когда вы отправляете форму.

Кроме того, если вы расширяете класс ActionSupport, этот класс уже определяет метод input (), поэтому вам даже не нужно будет изменять класс действий для этого.

0 голосов
/ 14 января 2011

Ваш вопрос имеет смысл.Ваш шаблон верен, хотя:

  • , как указал Кватернион, "многословия" мало или нет.Ваша первая «showForm» - это фиктивная «отображение действий», ее классу «ничего не делать» не нужно определенное определение класса (достаточно ActionSupport по умолчанию).

  • возможны и другиеузоры;некоторые люди могут предпочесть идиому, на которую вы указываете (и у нее длинная история - я помню, что несколько столетий назад я делал несколько страниц CGI для pelr): используйте один URL (и, следовательно, одно отображение действия) для двух «шагов»«(показать исходную форму и обработать форму), угадав внутри метода действия (или в валидаторе) текущий шаг, возможно, проверив наличие некоторого параметра (возможно, скрытого поля) или, возможно, различая POST / GET.В Struts2 я предпочитаю другой способ, в общем.

Кстати, называть действия Struts2 «с состоянием» правильно, только если вы понимаете (вы, очевидно, делаете), что это «состояние»не выживает среди запросов.

0 голосов
/ 13 января 2011

Можно сделать что-то по-другому, но допустим, вы позволяете struts2 обрабатывать все запросы. Все, что обрабатывает struts2, является «действием».

Не беспокойтесь о GET или POST, это просто два разных метода отправки данных в действие, если есть параметры (независимо от того, получены они или установлены), то struts2 попытается поместить эти данные в класс действий ( при условии, что есть один). Если существует метод проверки (или файл XML проверки правильности с именем), проверка будет запущена после установки свойств класса. Затем вызывается метод execute () для класса (при условии, что класс есть). После этого обычно создается jsp, который имеет в своем распоряжении все общедоступные данные в методе действия.

Выполните действие "showForm" ... вы можете уменьшить xml до:

<action name="showForm">
  <result>inputForm.jsp</result>
</action>

Вы видите, что вам не нужно определять класс. Кроме того, результатом по умолчанию является успех, поэтому нам не нужно упоминать об этом.

Так что, думая о hmtl, мы думаем в терминах страниц. Размышляя в стойках, мы думаем с точки зрения действий, они должны быть настолько сложными, насколько это необходимо. То есть, если вам нужно показать форму, вам нужно действие показа формы, если вам нужна страница отображения, которая использует данные формы, тогда вам нужно действие «displayPage», которое что-то делает с данными формы.

Так что думайте, что каждое действие начинается с URL> -----------> и заканчивается датой возврата (обычно это рендеринг jsp). Тире - это дополнительные части, которые вы можете определить, но если вы этого не сделаете, они будут разумно по умолчанию для вас. Чтобы увидеть, какие функции предоставляются вам, вам нужно заглянуть в struts2-core-x.x.x.x.jar и просмотреть содержимое struts-default.xml, в котором определен defaultStack. Каждый перехватчик, в свою очередь, называется, зная, что они предлагают (и другие перехватчики предлагают), чтобы вы знали, что вы получаете из коробки (я бы не стал изучать их слишком глубоко, просто знаю, что они есть, так что вы будете знать, например что если вам нужно загрузить файл, тот простой факт, что перехватчик fileUpload находится в стеке по умолчанию, должен быть достаточным признаком того, что должны быть встроены возможности загрузки файлов.

То есть, нет никакого «ложного действия» в форме ввода. Это реальное действие, простое. После того, как вы узнаете, как определять пакеты, действия, действия по умолчанию для пакета и, возможно, глобально, и узнаете, как определить перехватчик, вам следует взглянуть на плагин соглашений. Это делает жизнь намного проще!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...