Статьи

Руководство по валидации Hibernate Struts 2

Структура 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 ).

Вы можете скачать и попробовать этот пример здесь.


Источник:
Скачать (15 КБ)

Source + Lib:
Скачать
(9,8 МБ)