Struts 2 Validation и Input поля повторного заполнения

Если у меня есть следующий конфигурационный файл struts.xml:

<action name="input">
   <result>/jsp/input.jsp</result>
</action>

<action name="result">
    <result>/jsp/result.jsp</result>
    <result name="input">/jsp/input.jsp</result>
</action>

И простая форма только с одним полем:

<s:form action="result">
    <s:textfield name="firstName" label="First Name"/>
    <s:submit/>
</s:form>

Если проверка не пройдена, допустим, что каждый раз, когда я отправляю действие (результат), проверяется, что длина firstName длиннее 3. В случае неудачи он возвращается на страницу ввода, в данном случае input.jsp, но с полем firstName, уже заполненным ( с неверным значением, которое я только что отправил. Как Struts 2 делает это? Интересно, потому что, как я понимаю, когда я отправляю, по умолчанию метод POST вводит входные данные в действие, и те имена параметров запроса, которые соответствуют валидации, будут проверены. если проверка не пройдена, она вернется на страницу ввода (в ответ на запрос POST) с доступными только параметрами запроса, поэтому мне приходит в голову только то, что поле ввода заполняется параметрами запроса, но, например, если я сделаю следующий тест. Допустим, я буду имитировать это следующим:

HTTP: //domain/myApp/input.action ПгвЬЫат = Альфредо Поле ввода firstName не будет заполнено.

Но когда результат приходит из проверки, он будет заполнен. Интересно, если Struts 2, чтобы получить те значения, которые должны быть в параметрах запроса, нажмите объект параметра запроса (#parameters) и таким образом он будет заполнен.

Может ли кто-нибудь объяснить мне это? Как Struts 2 достигает этого заселения?

Спасибо.

Ответы на вопрос(1)

Решение Вопроса

что вы неправильно понимаете некоторые понятия и термины Struts2. Почему вы называете свои действия «входом» и «результатом»? Это плохая практика и вводит в заблуждение, особенно потому, что «input» - это название стандартного Struts2 «result».

Действия должны называться в соответствии сдействие они выполняют.

Основной шаблон прост. URL (HTTP-запрос, GET или POST) соответствует пользователю (браузеру, клиенту), запрашивающему сервер (webapp, с Struts2 сверху)выполнить какое-то действие, Действие может дать несколькоРезультатыкаждый результат будет возвращать некоторую информацию (представление) (обычно HTML, сгенерированный через страницу JSP) пользователю.

Простой пример Предположим, я хочу добавить 2 числа и отобразить результат. (Я перерабатываю свой ответ отВот.

URL:http://...../addnumbers.action

Здесь имя действия «addnumbers» - этот запрос будет выполнять сложение (не обманывайте себя и не думайте, что он покажет также форму ввода - он будетне, а пока - просто выполняет сложение, как следует из его названия)

Типичная реализация. В struts.xml вы указываетеотображение:

   <action name="addnumbers" class="example.AddNumbersAction">
     <result name="success">/AddNumbersResult.jsp</result> <!-- 'success' can be omitted here -->
   </action>

Ваше действие Java:

   public class AddNumbersAction extends ActionSupport { 
       private int x;
       private int x;
       private int z;
       public String execute() {
           z = x + y; 
           return SUCCESS;
       }
       // getters and setters ommited
   }

И вашAddNumbersResult.jsp :

<div>
Result of addition:
<s:property value="x"> + <s:property value="y"> = <s:property value="z">
</div>

Вы можете (вы должны!) Проверить, что набрав URLhttp://.../mywebapp/addnumbers.action?x=10&y=20 работает как положено.

В сценах Struts2 (с конфигурацией по умолчанию, стеком перехватчиков по умолчанию) создается экземплярAddNumbersAction и вызывая с помощью отражения сеттеры, соответствующие параметрам http (прилагая все усилия для преобразования типов - от строки к целому числу здесь). Затем вызывается метод действия по умолчанию («execute»), результатом является «success», иAddNumbersResult.jsp используется для генерации html-страницы; на этом этапе объект Action находится в «стеке значений» (своего рода области видимости), так что теги вызывают его получатели.

Как только вы это выясните, остаются две проблемы: как отобразить предыдущую html-страницу, чтобы пользователь мог вводить числа («форма ввода»), и как обращаться с неверными или неполными аргументами. Эти вопросы связаны между собой.

Есть несколько (несколько) подходов. Одна возможность: добавить другое отображение действий:

   <action name="addnumbersForm"> <!-- no action specified - will use ActionSupport -->
     <result>/AddNumbersInputForm.jsp</result>
   </action>

И ваш/AddNumbersInputForm.jsp:

<div>
Please type two integer numbers to be added<p>
<s:actionerrors />       <!-- see below -->
<s:form action="addnumbers">
  <s:textfield name="x" label="X value" />
  <s:textfield name="y" label="Y value" />
  <s:submit />
</s:form>
</div>

Так как мы не указываем класс Action, будет использоваться фиктивная по умолчанию (и будет возвращен «success»). Вид действия "ничего не делать".

На самом деле, простой html-страницы здесь было бы достаточно, но с помощью тегов struts2 мы достигаем «связывания» элементов ввода с полями действия, и поэтому мы можем справляться с ошибками и повторными попытками. По (простому) соглашению, действие Struts2 будет возвращать «ввод» (вместо «успех»), когда аргументы недостаточны или недействительны (идея состоит в том, что действие говорит: «Вы дали мне указание выполнить это действие X, но я не был Успешно, мне нужно, чтобы вы дали мне должноевходПожалуйста, возможно, вы хотите повторить попытку? "). Итак, в нашем случае мы получаем полное отображение struts.xml для сценария:

   <action name="addnumbersForm"> 
      <result>/AddNumbersInputForm.jsp</result>
   </action>

   <action name="addnumbers" class="example.AddNumbersAction">
     <result name="input">/AddNumbersInputForm.jsp</result>
     <result name="success">/AddNumbersResult.jsp</result>
   </action>

И в нашем AddNumbersInputForm.jsp мы можем добавить тег, чтобы показать ошибки проверки (генерируемые внутренним Struts2 или нашим кодом).

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

Существуют и другие способы, но существенным моментом является разграничение: «вариант использования» здесь только один (добавьте два числа), а действий (концептуально) два: первый просто предоставляет пользователю форму ввода, второй на самом деле делает сложение. Эта концепция должна быть отражена в названии действий / URL.

 Alfredo Osorio09 окт. 2010 г., 01:36
Спасибо, отличный ответ. Я сделал пример с вашим кодом, и он работал как ожидалось. Если установщик не может быть установлен, поле ввода заполняется из запроса, но если оно может быть установлено и не проходит проверку, поле ввода будет заполнено теми полями, которые установлены в действии. Однако я обнаружил, что есть исключение, если в качестве значения атрибута входного тега установлено, что входное значение (в случае повторного заполнения) не будет ни из параметра запроса, ни из полей действия. Это будет то значение, которое вы установили в этом теге.

Ваш ответ на вопрос