Результат Struts2 INPUT: как он работает? Как обрабатываются ошибки преобразования / проверки?

Основной вопрос

Рабочий stream должен быть таким: если строка вводится не как число, сначала она должна проходить через перехватчик исключений, а при прохождении через пара-перехватчик при преобразовании в тип int он не сможет сделать это с помощью Integer.parseInt и произойдет исключение; не должно ли это исключение (то есть NumberFormatException ) NumberFormatException в Value Stack? Почему он не показывает NumberFormatException и показывает результат, хотя результат не должен печататься?

Боковой вопрос

Всякий раз, когда я добавляю алфавит в форме, он менялся на ноль …? Почему так ?

index.jsp

       

divide.java

 package actions; public class divide { int number1,number2,result; public String execute() throws Exception { result=number1/number2; return "success"; } public int getNumber1() { return number1; } public void setNumber1(int number1) { this.number1 = number1; } public int getNumber2() { return number2; } public void setNumber2(int number2) { this.number2 = number2; } public int getResult() { return result; } } 

result.jsp

   the result of division is    

обработчик jsp

   following exception occured during the processing    

struts.xml

       /result.jsp /handler.jsp    

Главный вопрос:

Рабочий stream должен быть таким, если строка вводится не как число, сначала она должна проходить через перехватчик исключений, а при прохождении через пара-перехватчик при преобразовании в тип int он не сможет сделать это с помощью Integer. parseInt и возникло бы исключение, исключение, которое является исключением в числовом формате, должно быть перенесено в стек значений, поэтому почему он не показывает numberformatexception и показывает результат, хотя результат не должен быть напечатан вместо этого?

концепция

Struts 2 обрабатывает как ошибки преобразования, так и ошибки проверки автоматически: он не вызывает исключение, поскольку они не блокируют ошибки , но входные ошибки , следовательно, лучший способ для продолжения заключается в том, чтобы уведомить пользователя о том, что введенный вход был неправильным, попросив его для нового, действительного ввода. Для этого возвращается результат INPUT, в то время как исключение игнорируется.

Детальный stream

  1. Parameters Interceptor пытается установить параметры. Если RuntimeException (например, NumberFormatException ) поймано, а devModetrue , в Action Errors добавляется сообщение об ошибке, иначе исключение просто проглатывается. Из исходного кода:

     for (Map.Entry entry : acceptableParameters.entrySet()) { String name = entry.getKey(); Object value = entry.getValue(); try { newStack.setParameter(name, value); } catch (RuntimeException e) { if (devMode) { String developerNotification = LocalizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ "Unexpected Exception caught setting '" + name + "' on '" + action.getClass() + ": " + e.getMessage() }); LOG.error(developerNotification); if (action instanceof ValidationAware) { ((ValidationAware) action).addActionMessage(developerNotification); } } } } 
  2. Conversion Errors Interceptor проверяет, произошла ли какая-либо ошибка конверсии: для каждого найденного она добавляет Field Error ; он также сохраняет исходные значения, так что любые последующие запросы для этого значения возвращают исходное значение, а не значение в действии . Из документации:

    Этот перехватчик добавляет любую ошибку, обнаруженную в карте конверсии ActionContext, как полевую ошибку (при условии, что действие реализует ValidationAware). Кроме того, любое поле, содержащее ошибку проверки, имеет свое исходное значение, сохраненное таким образом, что любые последующие запросы для этого значения возвращают исходное значение, а не значение в действии. Это важно, потому что, если значение «abc» отправлено и не может быть преобразовано в int, мы хотим снова отобразить исходную строку («abc»), а не значение int (вероятно, 0, что будет очень мало смысла для пользователя).

  3. Validation Interceptor выполняет всю запрашиваемую проверку (определенную в XML, annotations или с помощью методов validate() или validateXXX() для Action), добавляя одно или несколько сообщений об ошибках в Field Errors для каждого поля, не передающего один или несколько критериев проверки ,

  4. Workflow Interceptor проверяет, есть ли Field Errors (оба происходят из ошибок преобразования или ошибок проверки). Если ошибок не обнаружено, он продолжает цепочку следующего перехватчика. Если обнаружена одна или несколько ошибок, она возвращает результат INPUT.

Чтобы этот механизм работал, вам необходимо определить эти четыре перехватчика в правильном порядке в вашем штатном стеке, если вы не используете стек перехватчиков по умолчанию (вам не нужно ничего делать иначе). Из struts-default.xml :

   ^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*    input,back,cancel,browse   input,back,cancel,browse   

Боковой вопрос:

Всякий раз, когда я добавляю алфавит в форме, он менялся на ноль …? Почему так?

Первоначальный ответ: структура не смогла установить String в поле int при отправке запроса на сервер, а при получении значения на результирующей странице он вызывает Getter этой переменной; поскольку вы определили int а не Integer , а int не может быть null, он вернет значение по умолчанию для int : 0 .

Но я не помню, что Conversion Interceptor претендует (точка чтения № 2), чтобы сохранить исходные значения, чтобы обеспечить их в последующих будущих запросах вместо значений Action (это будет null или 0). Это также упоминается в обработке ошибок преобразования типов :

Обработка ошибок преобразования типов обеспечивает простой способ различать проблему проверки ввода и проблему преобразования типа ввода.

Любая ошибка, возникающая при преобразовании типов, может быть сообщена или не указана. Например, сообщение о том, что вход «abc» не может быть преобразован в число, может быть важным. С другой стороны, сообщение о том, что пустая строка «” не может быть преобразовано в число, может быть неважно, особенно в веб-среде, где трудно отличить пользователя от ввода значения или ввода пустого значения.

Вместо этого я хорошо помнил поведение, описанное в вашем вопросе. Итак, этот случай уже обработан … почему он тогда не работает? Виновником в моем случае (и, вероятно, вашим) был атрибут value :

Это даст вам 0 при публикации abc :

  

потому что возникает другая ошибка преобразования.

Эти два случая вместо этого работают так, как описано выше, что дает вам abc при отправке abc :

   

Выводы

  • Убедитесь, что стек перехватчика настроен правильно, и
  • внимательно проверьте свой код (который, скорее всего, не тот, который выложили здесь), чтобы узнать, что вы делаете с вашим атрибутом value .

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

  • Проверка даты в C #
  • Плагин jQuery Validation в веб-формах ASP.NET
  • Проверка файла XML на локальный DTD-файл с помощью Java
  • jQuery отключает проверку правил в одном поле
  • Как использовать Scanner для принятия только действительного int в качестве входного
  • Как заставить валидацию зависеть от нажатой кнопки?
  • как я могу проверить ввод пользователя как двойной в C ++?
  • Правильная проверка с помощью MVVM
  • ASP.NET MVC Отключить проверку на стороне клиента на уровне поля
  • Валидация против дизъюнкции
  • Никаких ограничений грамматики (DTD или XML-схемы), обнаруженных для документа
  • Давайте будем гением компьютера.