Struts 2 Проверка и Повторное заполнение полей ввода - PullRequest
0 голосов
/ 06 октября 2010

Если у меня есть следующая конфигурация 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 вводит входные данные в действие, и имена параметров запроса, которые соответствуют проверке, будут validated. В случае неудачи проверки он вернется на страницу ввода (как ответ POST) с доступными только параметрами запроса. Поэтому мне приходит в голову только то, что поле ввода заполняется этими параметрами запроса но, например, если я сделаю следующий тест, скажем, я имитирую это следующим образом:

http://domain/myApp/input.action?firstName=alfredo Поле ввода firstName не будет заполнено.

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

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

Спасибо.

1 Ответ

6 голосов
/ 07 октября 2010

Я думаю, вы неправильно понимаете некоторые понятия и термины 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>

Вы можете(вам следует!) убедитесь, что ввод url http://.../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, будет использоваться фиктивная по умолчанию (и "успех "будет возвращен).Вид действия «ничего не делать».

На самом деле, здесь было бы достаточно простой 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.

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