Struts2 - проверка данных, validate

Ни одно WEB-приложение не способно обойтись без проверки данных, введенных пользователем. Оператор может непроизвольно внести ошибку, а программа должна помогать избегать ошибок, связанных с ошибками ввода. В Struts2 присутствует мощная система для проверки данных, введенных пользователем. Проверка данных выполняется на уровне действий (Action-класс).

Как выполняется проверка данных в Struts2 ?
Фреймворк в начале обработки запроса пользователя просматривает список всех подключенных перехватчиков (интерцепторов). Если интерцептор проверки присутствует, то он вызывается первым. Для разработчиков необходимо только создать Action-класс, наследующий ActionSupport, и переопределить метод validate, в котором описать всю логику проверки. Метод validate определен в интерфейсе com.opensymphony.xwork2.Validateable, который наследуется классом ActionSupport. Реализованные механизмы класса ActionSupport позволяют отобразить результаты проверки пользователю.

Рассмотрим простой пример регистрации пользователя с переопределением метода validate класса ActionSupport. Для этого создадим Action-класс Registration.java, который будет наследовать все свойства ActionSupport.

Java класс регистрации пользователя - Action

Листинг класса действия Registration.java
      
  package examples.validation;
 
  import com.opensymphony.xwork2.Action;
  import com.opensymphony.xwork2.ActionSupport;
 
  public class Registration extends ActionSupport {
   private String name;
   private String login;
   private String password;
   private String confirm;
 
   public String execute() throws Exception {
    return Action.SUCCESS;
   }
 
   public String getName {
    return name;
   }
 
   public void setName (String name) {
    this.name = name;
   }
 
   // методы get и set для login, password, confirm
   . . .
 
   private boolean isEmptyString ( String value ) {
    return value == null || "".equals ( value.trim () );
   }
 
   public void validate () {
    if ( isEmptyString ( name )) {
     addFieldError ( "name", "Не указано имя" );
    }
    if ( isEmptyString ( login )) {
     addFieldError ( "login", "Не указан логин" );
    }
    if ( isEmptyString ( password )) {
     addFieldError ( "password", "Не указан пароль" );
    }
    if ( isEmptyString ( confirm )) {
     addFieldError ( "confirm", "Не указано подтверждение пароля" );
    }
    if ( !isEmptyString ( password ) && !isEmptyString ( confirm )) {
     if(!password.equals(confirm)) {
        addActionError ( "Не совпадают пароль и его подтверждение" );
    }
   }
  }

Метод validate переопределен. Основная функция метода validate в данном действии заключается в проверке введенных оператором данных. Здесь следует обратить внимание на два метода в ActionSupport, которые позволяют сообщать об ошибках. Это метод addActionError, который сообщает об ошибке при выполнении действия, и addFieldError, сообщающий об ошибке при заполнении определенного поля. Таким образом, если не заполнено имя пользователя, то логично вызвать addFieldError, а если, например, пароль и его подтверждение не совпадают, то логичнее выдать сообщение об ошибке действия, так как нельзя понять, в каком именно поле мог ошибиться оператор.

JSP-страница регистрации пользователя

Представим страницу Registration.jsp, в которой оператор будет вводить данные и вызывать Action-класс Registration.

Листинг JSP-страницы Registration.jsp
 
  <?xml version="1.0" encoding="utf-8" ?>
 
  <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
  <%@ taglib prefix="s" uri="/struts-tags" %>
 
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html>
   <head>
    <title>Регистрация</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   </head>
   <body>
    <h1>Регистрация пользователя</h1>
    <s:form action="Registration" method="post">
    <s:actionerror/>
     <s:textfield label="Ваше Имя" name="name"></s:textfield>
     <s:textfield label="Логин" name="login"></s:textfield>
     <s:password label="Пароль" name="password"/>
     <s:password label="Подтверждение" name="confirm"/>
     <s:submit value="Отправить"></s:submit>
    </s:form>
   </body>
  </html>
 

На данной странице оператором <s:actionerror/> отмечено местоположение представления сообщения об ошибке, если пароль и его подтверждение не будут совпадать.

JSP-страница успешной регистрации пользователя

Создадим страницу успешной регистрации Success.jsp, чтобы обрадовать оператора.

Листинг JSP-страницы Success.jsp
 
  <?xml version="1.0" encoding="utf-8" ?>
 
  <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
  <%@ taglib prefix="s" uri="/struts-tags" %>
 
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
  <html>
   <head>
    <title>Регистрация завершена</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   </head>
   <body>
    <h3>Пользователь <s:property value="name"/> успешно зарегистрирован.</h3>
   </body>
  </html>
 

На странице Success.jsp интерес представляет оператор <s:property value="name"/>, который позволяет прочитать значение name после выполнения Action-класса Registration.

Файл конфигурации struts.xml

Теперь необходимо добавить действие регистрации пользователя в файл конфигурации struts.xml.

Листинг файла конфигурации struts.xml
 
   <package name="Default" namespace="/" extends="struts-default">
    <action name="Registration" class="examples.validation.Registration">
     <result name="input">/Registration.jsp</result>
     <result>/Success.jsp</result>
    </action>
   </package>

Теперь модуль регистрации можно тестировать, для этого необходимо вызвать Action-класс /Registration.action, и попытаться ввести данные. Вы должны увидеть сообщения об ошибках от Struts2, если одно или несколько полей будут незаполнены, или пароль не будет совпадать с подтверждением. При корректно введенных данных Вы увидите на странице Success.jsp сообщение, что пользователь name успешно зарегистрирован.


Rambler's Top100 Рейтинг@Mail.ru