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

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

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

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

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

Листинг класса действия 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> </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> </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 успешно зарегистрирован.