Структура Hibernator Validator следует принципу СУХОЙ (не повторять себя). Используя Hibernator Validator, вы должны указать ограничения, используя аннотации в доменном объекте. После того, как вы укажете ограничения, вы можете использовать его на любом слое приложения, не дублируя его.
Hibernate Validator поставляется с базовыми встроенными ограничениями, такими как @Length (min =, max =), @Max (value =), @Min (value =), @NotNull, @NotEmpty и так далее. Вы также можете легко создавать свои собственные ограничения.
В этом примере вы увидите, как интегрировать Struts 2 с Hibernator Validator, используя Full Hibernate Plugin 1.4 GA .
Вам нужно иметь все файлы lib, которые мы использовали в предыдущем примере ( интеграция с Struts 2 Hibernate ).
Доменный объект User с ограничениями проверки показан ниже.
package com.vaannila.domain; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.validator.Length; import org.hibernate.validator.NotEmpty; @Entity @Table(name = "USER") public class User implements Serializable { private static final long serialVersionUID = 6295524232169619097L; private Long id; private String name; private String password; private String gender; private String country; private String aboutYou; private Boolean mailingList; @Id @GeneratedValue @Column(name = "USER_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @NotEmpty @Length(max=50) @Column(name = "USER_NAME", nullable = false, length = 50) public String getName() { return name; } public void setName(String name) { this.name = name; } @Length(min=6, max=10) @Column(name = "USER_PASSWORD", nullable = false, length = 10) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @NotEmpty(message="Please select a gender") @Column(name = "USER_GENDER") public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @NotEmpty(message="Please select a country") @Column(name = "USER_COUNTRY") public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } @NotEmpty @Length(max=100) @Column(name = "USER_ABOUT_YOU", length = 100) public String getAboutYou() { return aboutYou; } public void setAboutYou(String aboutYou) { this.aboutYou = aboutYou; } @Column(name = "USER_MAILING_LIST") public Boolean getMailingList() { return mailingList; } public void setMailingList(Boolean mailingList) { this.mailingList = mailingList; } }
Как вы можете видеть в дополнение к аннотациям JPA, у вас есть ограничения Hibernator Validator.
В @NotEmpty ограничений проверяет , является ли строка не нуль или не пусто.
@Length (мин = 6, макс = 10) проверяет , является ли ограничений является длина в диапазоне мин макс.
Сообщения проверки автоматически генерируются плагином. Вы также можете переопределить сообщение по умолчанию, используя атрибут сообщения ограничения. Для пола и страны мы указываем индивидуальное сообщение.
@NotEmpty(message="Please select a gender") @Column(name = "USER_GENDER") public String getGender() { return gender; } @NotEmpty(message="Please select a country") @Column(name = "USER_COUNTRY") public String getCountry() { return country; }
В классе UserAction необходимо указать аннотацию @Valid для объекта домена, который необходимо проверить.
package com.vaannila.web; import java.util.ArrayList; import java.util.List; import org.hibernate.validator.Valid; import com.opensymphony.xwork2.ActionSupport; import com.vaannila.dao.UserDAO; import com.vaannila.dao.UserDAOImpl; import com.vaannila.domain.User; public class UserAction extends ActionSupport { private static final long serialVersionUID = -6659925652584240539L; @Valid private User user; private List<User> userList = new ArrayList<User>(); private UserDAO userDAO = new UserDAOImpl(); public String add() { userDAO.saveUser(user); return SUCCESS; } public String list() { userList = userDAO.listUser(); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } }
Поскольку мы используем плагин Hibernate, вам необходимо расширить форму пакета hibernate-default package. Пакет hibernate-default имеет следующие три стека перехватчиков.
- basicStackHibernate : Struts2 basickStack + сеанс Hibernate и возможность транзакций.
- defaultStackHibernate : Struts2 defaultStack (без проверок) + проверка Hibernate, возможность сеансов и транзакций.
- defaultStackHibernateStrutsValidation : Struts2 defaultStack (с проверкой) + basicStackHibernate.
Файл конфигурации стоек показан ниже.
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="hibernate-default"> <action name="addUser" method="add" class="com.vaannila.web.UserAction"> <result name="input">/register.jsp</result> <result name="success" type="redirect">listUser</result> </action> <action name="listUser" method="list" class="com.vaannila.web.UserAction"> <interceptor-ref name="basicStackHibernate" /> <result name="success">/register.jsp</result> </action> </package> </struts>
По умолчанию будет использоваться стек перехватчиков defaultStackHibernate . В AddUser действии мы используем этот стек inteceptor , так как мы должны возможность проверки и во время listUser действия акции мы используем basicStackHibernate , потому что нам не нужен Capability валидации на этот раз.
На странице register.jsp вместо использования атрибута name для указания значения свойства мы используем атрибут key . Это необходимо для генерирования сообщений проверки по умолчанию.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib uri="/struts-tags" prefix="s"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Registration Page</title> <s:head /> <style type="text/css"> @import url(style.css); </style> </head> <body> <s:actionerror/> <s:form action="addUser"> <s:hidden name="user.id" /> <s:textfield key="user.name" /> <s:password key="user.password" /> <s:select key="user.gender" list="{'Male','Female'}" headerKey="" headerValue="Select" label="Gender" /> <s:select key="user.country" list="{'India','USA','UK'}" headerKey="" headerValue="Select" label="Country" /> <s:textarea key="user.aboutYou" /> <s:checkbox key="user.mailingList" label="Would you like to join our mailing list?" /> <s:submit /> </s:form> <s:if test="userList.size() > 0"> <div class="content"> <table class="userTable" cellpadding="5px"> <tr class="even"> <th>Name</th> <th>Gender</th> <th>Country</th> <th>About You</th> <th>Mailing List</th> </tr> <s:iterator value="userList" status="userStatus"> <tr class="<s:if test="#userStatus.odd == true ">odd</s:if><s:else>even</s:else>"> <td><s:property value="name" /></td> <td><s:property value="gender" /></td> <td><s:property value="country" /></td> <td><s:property value="aboutYou" /></td> <td><s:property value="mailingList" /></td> </tr> </s:iterator> </table> </div> </s:if> </body> </html>
Значения ключей должны быть указаны в файле UserAction.properties, и этот файл должен быть сохранен рядом с файлом UserAction.java .
user.name=User Name user.password=Password user.aboutYou=About You user.mailingList=Mailing List
Сообщения проверки по умолчанию будут генерироваться с использованием меток полей в качестве префикса.
При выполнении примера и отправке формы без ввода значений вы увидите следующие сообщения проверки.
Сообщение проверки для полей « Имя пользователя», «Пароль» и « О вас» имеет метку поля перед сообщением об ошибке проверки по умолчанию. Это потому, что мы указали значения ключа в файле UserAction.properties . Если вы хотите, чтобы отображалось только сообщение проверки, не указывайте запись для этого поля в файле свойств. Здесь поля пола и страны имеют только настроенные сообщения об ошибках, а не метки полей.
Все остальное остается таким же, как и в предыдущем примере ( интеграция с Hibernate Struts 2 ).
Вы можете скачать и попробовать этот пример здесь.