Проверка данных, validate

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

Для разработчиков необходимо только создать action-класс, наследующий ActionSupport, и переопределить метод validate, в котором описать всю логику проверки. Метод validate определен в интерфейсе com.opensymphony.xwork2.Validateable, который наследуется классом ActionSupport. Реализованные механизмы класса ActionSupport позволяют отобразить результаты проверки пользователю.

Struts2 пример с validate

Рассмотрим простое приложение Struts2 с использованием метода validate action-класса. На следующем скриншоте представлена структура проекта StrutsValidation в среде разработки Eclipse.

Проект включает action-класс EmployeeAction.java, файл конфигурации struts.xml, две JSP-страницы и дескриптор приложения web.xml. Листинг и описание web.xml приведен на странице Пример Struts2, где дополнительно рассмотрен вопрос кодировки передаваемых серверу сообщений.

Листинг класса EmployeeAction.java

package example;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class EmployeeAction extends ActionSupport
{
    private String name;
    private int age;
	   
    @Override
    public String execute()
    { 
        if ((getName().trim().length() > 0)) {
            return Action.SUCCESS;
        }
        return Action.INPUT;
    } 
    @Override
    public void validate()
    {
        if (isEmptyString(name))
            addFieldError("name","Необходимо ввести имя");
        if ((age < 24) || (age > 65))
            addFieldError("age","Возраст должен быть от 24 до 65");
        if (isEmptyString(name) && ((age < 24) || (age > 65))){
            addActionError ("Не заполнена форма" ); 
        } 
    }
    private boolean isEmptyString (String value) { 
        return value == null || "".equals (value.trim ()); 
    } 
    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;
    }
}

В унаследованном от ActionSupport action-классе EmployeeAction.java переопределены метод execute и validate. Основная функция метода validate связана с проверкой двух параметров - заполнение поля "Имя" и определение возраста в пределах от 24 до 65.

Следует обратить внимание на два метода ActionSupport, которые позволяют сообщать об ошибках. Это метод addActionError, который сообщает об ошибке при выполнении действия, и addFieldError, сообщающий об ошибке при заполнении определенного поля.

Методу addFieldError необходимо передать два параметра. Первым параметром является поле формы, над которым будет размещена ошибка. Вторым параметром является текст ошибки. Методу addActionError в качестве параметра передается только текст ошибки.

Таким образом, если не заполнено имя пользователя, или не правильно указан возраст, то логично вызвать addFieldError. А если, например, не заполнено несколько полей или имеются различия в связанных полях (пароль и подтверждение), то логичнее выдать сообщение об общей ошибке.

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

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
          "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="true" />
    
    <package name="default" extends="struts-default">
        <action name="employee" class="example.EmployeeAction" method="execute">
             <result name="input">/index.jsp</result>
             <result name="success">/welcome.jsp</result>
        </action>
   </package>
</struts>

В файле конфигурации определено действие "employee". В случае успешного завершения (result="success"), будет выполнен переход на страницу welcome.jsp.

JSP страница index.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>
      <s:form action="employee" method="post">
          <font style="color:red"><s:actionerror/></font>
          <s:textfield name="name" label="Имя" size="20" />
          <s:textfield name="age" label="Возраст" size="20" />
          <s:submit value="OK" align="center" />
      </s:form>  
  </body>  
</html>

На данной странице оператором <s:actionerror/> отмечено местоположение представления сообщения об ошибке, если форма не будет заполнена. Пользователь должен ввести "Имя" и возраст в пределах от 24 до 65.

JSP страница welcome.jsp

При успешном завершении action-класса "employee" пользователю будет открыта страница welcome.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>
    <title>Добро пожаловать</title>
  </head>
  <body>
    <h3>Приветствуем Вас, <s:property value="name" /> !</h3>
    <i>Исходный данные сохранены !</i>
  </body>
</html>

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

В случае, если пользователь не заполнит поля, то сервер обновит страницу index.jsp и выведет все сообщения.

Скачать пример

Исходные коды рассмотренного примера можно скачать здесь (5.20 Мб).

  Рейтинг@Mail.ru