English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
I. Введение
1.1. Что такое проверка ввода? Почему нужна проверка ввода?
В предыдущей статье мы изучили преобразование данных типов, мы упомянули два метода обработки данных уровня представления, а также то, что данные ввода пользователя необходимо преобразовывать в типы, чтобы получить данные, которые мы хотим. Но как мы можем определить, что данные после преобразования типов соответствуют нашим ожиданиям? Это несколько запутанно. Вы можете так думать: возраст взрослого мужчины составляет 18 лет, и вы хотите получить данные 18. Но пользователь вводит 32, и после преобразования типов это правильно, но данные не соответствуют вашим ожиданиям. Что делать в этом случае? Поэтому проверка ввода здесь играет важную роль.
Связь между преобразованием типов и проверкой ввода такова: преобразование типов является условием для проверки ввода. Если преобразование типов ошибочно, то не имеет смысла проводить проверку ввода. Однако часто преобразование типов и проверка ввода выполняются одновременно.
Существует два типа проверки ввода:
1. Валидация на стороне клиента;
2. Валидация на стороне сервера. В этой статье мы будем обсуждать валидацию на стороне сервера (переопределение ValidateXxx и проверка xml-конфигурационного файла)
1.2. Переопределение процесса проверки ValidateXxx
1. Преобразователь типов отвечает за преобразование строковых параметров запроса и установку этих значений в свойства Action
2. В процессе выполнения преобразования типов может возникнуть исключение. Если возникнет исключение, информация об исключении автоматически сохраняется в ActionContext, и拦截ор conversionError отвечает за его封装 в fieldError
3. Вызов метода ValidateXxx() с помощью反射а, где Xxx - имя метода, соответствующего логике обработки запроса пользователя
4. Вызов метода Validate класса Action
5. Если при выполнении предыдущих шагов не возникло ошибки fieldError, будет вызван метод обработки запроса пользователя в классе Action. Если возникла ошибка fieldError, система перейдет к виду, указанному в логике ввода данных.
Второй раздел: Проверка ввода
2.1, В этой части ввода讲解ятся два способа:
1, Переписываем метод Validate или создаем пользовательский метод ValidateXxx (Xxx - это имя, которое вы определяете, и этот метод выполняется перед выполнением Validate)
2, Создаем xml для проверки
2.2, Переписываем метод Validate
В MVC-фреймворках всегда предоставляется стандартная часть проверки данных, Struts2 предоставляет метод Validate, переписывая метод Validate, мы можем выполнять проверку ввода, но есть два момента, которые необходимо знать: 1, Метод Validate выполняется до метода execute; 2, Метод Validate выполняет проверочные правила для всех Action, чтобы отличить определенный Action, мы можем использовать метод ValidateXxx. (Xxx - это имя, которое вы определяете, и этот метод выполняется перед выполнением Validate).
Внимание: следующий пример использует одновременное использование локального типа преобразования и проверки ввода.
Пример простого проверки регистрации:
Создаем класс User:
User
Создаем вид Register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Регистрация пользователя</title> </head> <body> <h2>Проверка с использованием метода validateXXX()</h2> <form action="register_test"> Пользователь:<input type="text" name="user"><br/> Пароль:<input type="password" name="user"><br/> Пароль:<input type="password" name="user"><br/> <input type="submit" value="Подтвердить"> </form> </body> </html>
Создаем класс RegisterAction, наследующий ActionSupport
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //Переписываем validate() и validateXXX для проверки /* * В файле struts.xml метод method настроен на test(), поэтому сначала вызывается метод ValidateTest(), * Затем вызывается метод validate * После этого вызывается метод test * */ public class RegisterAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } //2 @Override public void validate(){ System.out.println("Переписываем метод Validate"); if (null == user.getPassword() || "".equals(user.getPassword()) || null == user.getRepassword() || "".equals(user.getRepassword())) { this.addFieldError("repassword", "repassword should be same password"); return; } if (!user.getPassword().equals(user.getRepassword())) { //Если в FieldError есть данные, сервер автоматически перейдёт к логическому виду input this.addFieldError("repassword", "repassword should be same password"); } } //1 public void validateTest(){ System.out.println("Пользовательская проверка: ValidateTest"); } //3 public String test(){ System.out.println("test: метод"); return SUCCESS; } }
Внимание: здесь свойство User, поэтому в вашемjsp-странице имя параметра должно быть именем экземпляра user, и вам также нужно создать тип преобразователя, который вернёт заполненный данными класс
Создайте файл struts.xml и сохраните его в WEB-INF/classes/struts.xml
Внимание: здесь метод должен быть вашим методом ValudateXxx, который вы сами определили. В данном случае это test. Если использовать *, то Struts2 также требует настройки strict-method-invocation="false",据说 это связано с высокой версией, где безопасность была увеличена, и поэтому необходимо добавить её для использования *
Создание класса Usertypeconverter, наследующего от StrutsTypeConverter (создание типа преобразователя)
package com.validatexxx; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; //Класс для преобразования типов public class Usertypeconverter extends StrutsTypeConverter { @Override public Object convertFromString(Map arg0, String[] arg1, Class arg2) { System.out.println("Usertypeconverter: Преобразование типов!"); User user = new User(); user.setUsername(arg1[0]); user.setPassword(arg1[1]); user.setRepassword(arg1[2]); return user; } @Override public String convertToString(Map arg0, Object arg1) { User u = (User)arg1; return u.getUsername()+"!"; } }
Внимание: после создания этого преобразователя типов还需要 создать RegisterAction-conversion.properties, поместить его в одну папку.
Содержимое файла:
Слева указано имя свойства в RegisterAction, справа - конкретный путь к преобразователю типов.
Создание страницы успеха: success.jsp
success.jsp
Создание страницы с ошибкой: input.jsp
input.jsp
Эффект выполнения кода успешен:
Страница Register.jsp
Успешно перенаправленная страница: success.jsp
Результат тестирования в консоли:
Данные передаются в Usertypeconverter для преобразования типа, затем передаются в RegisterAction, выполняется метод ValidateTest(), Validate, test, затем возвращается SUCCESS, и выполняется вид result.
Проследим за порядком выполнения кода, который失败:
Страница Register.jsp
Страница input.jsp
Результат тестирования в консоли:
В методе Validate, автор кода: this.addFieldError(), о чем уже говорилось ранее, если добавляется ошибка, то сервер автоматически перенаправляет нас на страницу с ошибкой. Он возвращает input, а input уже настроен в struts.xml, и мы возвращаемся на страницу input.jsp.
2.3. Создание xml для ввода проверки
Создание интерфейса просмотра страницы: Test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>使用XML校验</title> </head> <body> <s:form action="empinfo" method="post"> <s:textfield name="name" label="Name" size="20" /> <s:textfield name="age" label="Age" size="20" /> <s:submit name="submit" label="Submit" align="center" /> </s:form> </body> </html>
新建Employee类继承ActionSupport
该类有使用重写Validate方法和Xml配置,我们可以选择其中一种进行验证就可以
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //使用validate()方法验证,这是服务端验证! public class Employee extends ActionSupport { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //第二步再执行该方法 public String execute(){ System.out.println("execute:"+this.age); return SUCCESS; } /* Использование серверной проверки: перезаписать validate метод(); //Шаг 1: сначала выполнить этот метод //Недостаток в перезаписи validate метода: каждый раз используется validate метод, что приводит к значительным потерям ресурсов. public void validate(){ System.out.println("validate"); if (name == null || name.trim().equals("")) { //Когда данные добавляются в этот метод, сервер возвращает input, после чего происходит переход на страницу input.jsp. addFieldError("name","Имя обязательно"); } if (age < 28 || age > 65) { addFieldError("age","Возраст должен быть в диапазоне от 28 до 65"); } } */ }
Конфигурация в Struts.xml:
Здесь success.jsp и input.jsp используют上面的.
Затем нам нужно создать файл Employee-validation.xml, расположенный в той же папке, что и Employee, внимание: -validation.xml является фиксированным.
Содержание:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <field name="name"> <field-validator type="required"> <message> Имя обязательно. </message> </field-validator> </field> <field name="age"> <field-validator type="int"> <param name="min">29</param> <param name="max">64</param> <message> Возраст должен быть в диапазоне от 28 до 65 </message> </field-validator> </field> </validators>
Важно: dtd ограничения файла должны быть, в противном случае вернется ошибка:
ОШИБКА DefaultDispatcherErrorHandler Ошибка occurred during processing request: [Connection timed out: connect - [unknown location], null]
Далее мы используемhttp://localhost:8080/LearStruts2/ValidateJSP/Test.jspпроизвести доступ.
Тест прошел успешно:
Интерфейс Test.jsp:
success.jsp
Пример теста с ошибкой:
Интерфейс input.jsp:
Объяснение примера правильное.
На самом деле, в Struts2 есть несколько встроенных валидаторов: валидатор обязательного заполнения, валидатор обязательного заполнения строки, валидатор целого числа, валидатор даты, валидатор выражения, валидатор длины символов, валидатор регулярного выражения и т.д. Если это необходимо, я расскажу об этом по порядку.
Ниже приведено подробное объяснение учебника Struts2 для ввода данных, которое я предоставляю вам, я надеюсь, что это поможет вам. Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий, и я постараюсь ответить вам как можно скорее. В этом отношении я также очень благодарен вам за поддержку сайта呐喊 учебника!
Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, веб-сайт не обладает правами собственности, не был обработан вручную, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. При подтверждении факта нарушения, сайт немедленно удалит涉嫌侵权的内容.