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.
相关推荐
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。
把代码放到Word中,通过开发工具——Visual Basic——插入模块,粘贴在里在,把在硅基流动中申请的API放到VBA代码中。在Word中,选择一个问题,运行这个DeepSeekV3的宏就可以实现在线问答
【毕业设计】java-springboot+vue机动车号牌管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip