English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное руководство по проверке ввода данных Struts2

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 (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. При подтверждении факта нарушения, сайт немедленно удалит涉嫌侵权的内容.

Рекомендуем к просмотру