проверка struts, происходящая при загрузке страницы вместо отправки

#java #struts2

#java #struts2

Вопрос:

Пожалуйста, простите меня; я вроде как новичок в struts. У меня возникла проблема, из-за которой моя проверка происходит при загрузке страницы, а не при фактической отправке моей формы. Я весь день гуглил и просматривал форумы, и мне не повезло. Очевидно, что я делаю что-то неправильно, что должно быть очень легко исправить, но я еще не нашел, в чем моя проблема.

Вот фрагмент моего struts.xml:

 <action name="*Test" method="{1}" class="testClass">
            <interceptor-ref name="defaultStack"/>          
            <result name="init">jsp/index.jsp</result>
            <result name="input">jsp/index.jsp</result>
            <result name="submit">jsp/results.jsp</result>
</action>
  

Как вы можете видеть, у меня есть одно действие, которое я хочу отправить в results.jsp, если проверка прошла успешно. В противном случае я хочу, чтобы он снова отображал мой index.jsp. страницы перемещаются правильно, насколько я могу судить. Я могу перейти к app / initTest.action и отправить свою форму, и это приведет меня к странице результатов и покажет мне ожидаемые результаты. Моя проблема связана с проверкой.

Кажется, что проверка работает, просто в неподходящее время. У меня есть [Действие] -validation.xml создано в том же месте, что и мой класс, к которому привязано действие, и когда страница загружается изначально, я вижу сообщение об ошибке из этого XML-файла уже на странице.

Вот что у меня есть в моем validation.xml файл:

 <validators>
    <field name="TestBean.idNumber">
        <field-validator type="requiredstring">
            <message>Please select an item.</message>
        </field-validator>
    </field>
</validators>   
  

Любая помощь, которую вы можете предоставить, была бы высоко оценена!

Спасибо!


@nmc, я пытаюсь визуализировать возможность использования отдельного действия. Будет ли это что-то вроде этого? Если проверка завершится неудачей, будет ли она перенаправлена обратно на исходную страницу формы?

 <action name="*Test" method="{1}" class="testClass">         
        <result name="init">jsp/index.jsp</result>
        <result name="submit">initTestResults</result>
</action>
<action name="*TestResults" method="{1}" class="testClass2">
        <interceptor-ref name="defaultStack"/>          
        <result name="init">jsp/indexResults.jsp</result>
        <result name="input">jsp/indexResults.jsp</result>
</action>
  

Я пытаюсь выяснить, какой вариант лучше подходит для моей цели.

Спасибо за ваш вклад.

Комментарии:

1. Вы можете попробовать аннотировать свой метод action, который отображает форму с помощью @SkipValidation . Это работает для ручной проверки с использованием validate() метода. Я не уверен, работает ли это для проверки на основе XML.

Ответ №1:

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

Во-первых, вы могли бы исправить это, избавившись от метода init и просто используя input — так что ваш начальный URL-адрес будет inputTest вместо initTest . Перехватчик проверки по умолчанию не запускается при методе ввода. Вот как это обычно обрабатывается, и как я описываю все свои действия.

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

 <action name="*Test" method="{1}" class="testClass">    
        <interceptor-ref name="defaultStack">
            <param name="validation.excludeMethods">init,input</param>
        </interceptor-ref> 
        <result name="init">jsp/index.jsp</result>
        <result name="input">jsp/index.jsp</result>
        <result name="submit">jsp/results.jsp</result>
</action>
  

Использование этого xml просто сообщает перехватчику проверки, чтобы он не запускал методы init или input.

Всего пара разных решений, позволяющих использовать только один класс действий.

Комментарии:

1. 1 для метода ввода. На самом деле я использую пользовательский преобразователь действий, который делает ввод методом по умолчанию, а затем я просто использую execute для обработки формы.

2. вот интересный лакомый кусочек, похожий на этот… Я вижу, что вы действительно можете добавить @SkipValidation над методом init () в моем классе action, и, похоже, это действительно делает то же самое, что упомянуто выше. Именно так это делается в проекте, на который я ссылался в своей работе.

Ответ №2:

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

Если это не то поведение, которое вы хотите, переместите отображение / загрузку страницы в другое действие.

Комментарии:

1. Ах, это имеет смысл! Спасибо, что поддерживаете меня здесь 🙂

Ответ №3:

Аннотировать с

@Пропустить проверку

в методе вам не нужно проверять.