The Hibernator Validator framework follows the DRY (Don't Repeat Yourself) principle. Using Hibernator Validator you need to specify the constraints using annotations in the domain object. Once you specify the constraints you can use it in any layer of your application without duplicating it.
Hibernate Validator comes with basic buit-in constraints like @Length(min=, max=), @Max(value=), @Min(value=), @NotNull, @NotEmpty and so on. You can also build your own constraints easily.
In this example you will see how to integrate Struts 2 with Hibernator Validator using the Full Hibernate Plugin 1.4 GA.
You need to have all the lib files that we used in the previous example ( Struts 2 Hibernate Integration ).
The domain object User, with the validation constraints is shown below.
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; } }
As you can see in addition to the JPA annotations you have the Hibernator Validator constraints.
The @NotEmpty constraint checks if the String is not null or not empty.
The @Length(min=6, max=10) constraint checks whether the lenght is within the min max range.
The validation messages are auto generated by the plug-in. You can also override the default message using the message attribute of the constraint. For gender and country properties we specify a customized message.
@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; }
In the UserAction class you need to specify the @Valid annotation for the domain object that needs to be validated.
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; } }
Since we use the Hibernate Plugin you need to extend the package form hibernate-default package. The hibernate-default package has the following three interceptor stacks.
- basicStackHibernate: Struts2 basickStack + Hibernate session and transaction capability.
- defaultStackHibernate: Struts2 defaultStack (no validations) + Hibernate validation, session and transaction capability.
- defaultStackHibernateStrutsValidation: Struts2 defaultStack (with validation) + basicStackHibernate.
The struts configuration file is shown below.
<!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>
By default the defaultStackHibernate interceptor stack will be used. In the addUser action we use this inteceptor stack since we need validation capability and during the listUser action action we use basicStackHibernate because we don't need validation capability this time.
In the register.jsp page instead of using the name attribute to specify the property value we use the key attribute. This is need for the default validation messages to be generated.
01.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
02.
pageEncoding="ISO-8859-1"%>
03.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
04.
<%@taglib uri="/struts-tags" prefix="s"%>
05.
<
html
>
06.
<
head
>
07.
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=ISO-8859-1"
>
08.
<
title
>Registration Page</
title
>
09.
<
s:head
/>
10.
<
style
type
=
"text/css"
>
11.
@import url(style.css);
12.
</
style
>
13.
</
head
>
14.
<
body
>
15.
<
s:actionerror
/>
16.
<
s:form
action
=
"addUser"
>
17.
<
s:hidden
name
=
"user.id"
/>
18.
<
s:textfield
key
=
"user.name"
/>
19.
<
s:password
key
=
"user.password"
/>
20.
<
s:select
key
=
"user.gender"
list
=
"{'Male','Female'}"
headerKey
=
""
21.
headerValue
=
"Select"
label
=
"Gender"
/>
22.
<
s:select
key
=
"user.country"
list
=
"{'India','USA','UK'}"
headerKey
=
""
23.
headerValue
=
"Select"
label
=
"Country"
/>
24.
<
s:textarea
key
=
"user.aboutYou"
/>
25.
<
s:checkbox
key
=
"user.mailingList"
26.
label
=
"Would you like to join our mailing list?"
/>
27.
<
s:submit
/>
28.
</
s:form
>
29.
30.
31.
<
s:if
test="userList.size() > 0">
32.
<
div
class
=
"content"
>
33.
<
table
class
=
"userTable"
cellpadding
=
"5px"
>
34.
<
tr
class
=
"even"
>
35.
<
th
>Name</
th
>
36.
<
th
>Gender</
th
>
37.
<
th
>Country</
th
>
38.
<
th
>About You</
th
>
39.
<
th
>Mailing List</
th
>
40.
</
tr
>
41.
<
s:iterator
value
=
"userList"
status
=
"userStatus"
>
42.
<
tr
43.
class
=
"<s:if test="
#userStatus.odd == true ">odd</
s:if
><
s:else
>even</
s:else
>">
44.
<
td
><
s:property
value
=
"name"
/></
td
>
45.
<
td
><
s:property
value
=
"gender"
/></
td
>
46.
<
td
><
s:property
value
=
"country"
/></
td
>
47.
<
td
><
s:property
value
=
"aboutYou"
/></
td
>
48.
<
td
><
s:property
value
=
"mailingList"
/></
td
>
49.
</
tr
>
50.
</
s:iterator
>
51.
</
table
>
52.
</
div
>
53.
</
s:if
>
54.
</
body
>
55.
</
html
>
The key values should be specified in the UserAction.properties file and this file should be saved next to the UserAction.java file.
1.
user.name=User Name
2.
user.password=Password
3.
user.aboutYou=About You
4.
user.mailingList=Mailing List
The default validation messages will be generated using the field labels as prefix.
When you execute the example and submit the form without entering any values you will see the following validation messages.
The validation messge for the fields User Name, Password and About You has the field label before the default validation error message. This is because we specified the key values in theUserAction.properties file. If you only want the validation message to be displayed then don't specify an entry for that field in the properties file. Here the gender and the country fields have only the customized error messages and not the field labels.
Everything else remains the same as the previous example ( Struts 2 Hibernate Integration ).
You can download and try this example here.
相关推荐
Struts2中Validation数据验证框架教程 struts2中validation框架_前台验证 struts2中validation框架_后台验证
从http://wiki.javascud.org/display/ww2cndoc/Valida<br>tion 网站上收集的一些关于有关Struts2验证框架的资料,并将其做成电子书以方便查看,另外向朋友们推荐一个很好的学习Struts2的博客...相信对正在学习Struts2的...
Struts2提供了一些基于XWork Validation Framework的内建验证程序,它们大大简化了输入验证工作。 使用这些验证程序不需要编程,程序员只需要在一个XML文件里对验证程序应该如何工作做出声明就行了。需要声明的内容...
NULL 博文链接:https://takeme.iteye.com/blog/1663251
NULL 博文链接:https://gqsunrise.iteye.com/blog/2367006
NULL 博文链接:https://lxh2002.iteye.com/blog/718662
文档列举了引用 Hibernate Validation各注解的用法,完成对实体约束验证的配置。
Hibernate对Bean Validation规范的实现文档
Struts Validation框架浅尝,Struts Validation框架浅尝Struts Validation框架浅尝
Bean Validation 规范对 Java Bean 的验证流程如下:在实际使用中调用 Validator.validate(JavaBeanInstance) 方法后,Bean Validation 会查找在 JavaBeanInstance上所有的约束声明,对每一个约束调用对应的约束验证...
Struts2 form Validation
Struts2中的validation_多国语言版 国际化+struts2数据校验.zip
resin 支持spring mvc 5.0以上版本 支持Hibernate validation 下载使用即可版本为 resin-4.0.61
struts2中两种validation.xml的配置方式
Struts1.2中的validation验证框架的实现步骤
Struts validation 验证框架配置,简单易懂,一看就会
与springmvc4完美兼容的validation jar包集合,让程序员更加轻松的进行编程
比较详细的struts2 validation资料
列举了多种格式验证方法。如日期、字符、数字等