Структура 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 ).
Вы можете скачать и попробовать этот пример здесь.
