`
yunzhu
  • 浏览: 1146139 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
B2b19957-cda7-3a9e-83a0-418743feb0ca
监控应用服务器
浏览量:110027
2e8be8be-e51f-346c-bcdd-12623c9aa820
Web前端开发
浏览量:119813
Bfa5df64-a623-34b9-85b8-ef3ce2aed758
经典异常的解决
浏览量:204676
社区版块
存档分类
最新评论

SpringMVC和FreeMarker整合中使用注解方式的后台数据校验

阅读更多

前提概要

本文主题:

在Spring MVC和FreeMarker整合的项目中,采用JSR-303验证框架,通过注解的方式进行数据验证

 

基础框架:

MVC:Spring MVC 3

视图:FreeMarker

验证:Hibernate-validator实现

 

需要JAR包:

0、Spring MVC和FreeMarker所需jar包

1、org.hibernate.validator-4.1.0.GA.jar

2、javax.validation-1.0.0.GA.jar

 

 

配置文件和Java代码的修改

 

在Spring MVC配置文件中添加配置

添加以下mvc的注解驱动配置,一切变成“自动化”

<mvc:annotation-driven />

 

在JavaBean中添加数据校验的注解

其中@Length、@Email就是Hibernate-validator中的数据校验注解,还可以用javax.validation中的注解,比如@NotNull

public class SystemUser {
	@Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
	private String userName;

	@Email(message = "比如输入正确的邮箱")
	private String email;
}

 

在Controller方法中指定需要进行校验

首先,要在需要进行校验的Bean前面加上@Valid注解,告诉SpringMVC框架这个Bean需要进行校验;

同时,还要在需要校验的Bean前面加上@ModelAttribute注解,从而将Bean暴露给视图,并且指定名字,这有两个作用,第一是显示校验错误需要使用这个名字,第二个是返回原来的页面以后,前面输入的所有值还要显示出来;

其次,每个需要校验的Bean后面紧跟一个BindingResult,SpringMVC框架会将校验结果保存在它里面,通过hasErrors方法可以判断是否有校验错误;

最后,当返回到原页面以后,SpringMVC框架还会将所有校验错误信息保存在上下文中,供页面上取得校验错误,Spring提供了一套JSP自定义标签。

@RequestMapping(value = "/create.html", method = RequestMethod.POST)
public String doCreateUser(
		@Valid @ModelAttribute("userDetail") SystemUser user,
		BindingResult bindingResult,
		HttpServletRequest request) {
	// 如果有校验错误,返回添加用户的页面
	if (bindingResult.hasErrors()) {
		return "/user/create";
	}
	
	this.userService.createUser(user);
	return "/user/list.html";
}

 

进行自定义校验

如果需要添加自定义校验,比如验证用户名是否已经被使用了,那么简单的注解自然无能为力,需要自己编码实现,如果校验失败,可以手动将自定义校验错误添加到BindingResult中。

@RequestMapping(value = "/user/create.html", method = RequestMethod.POST)
public String doCreateUser(
		@Valid @ModelAttribute("userDetail") SystemUser user,
		BindingResult bindingResult,
		HttpServletRequest request) {
	// 如果有数据校验错误,返回添加用户的页面
	if (bindingResult.hasErrors()) {
		return "/user/create";
	}

	boolean isUserNameExist = this.userService.checkUserByUserName(user.getUserName());
	// 如果用户名已存在,返回添加用户的页面
	if (isUserNameExist) {
		// 向BindingResult添加用户已存在的校验错误
		bindingResult.rejectValue("userName", "该用户名已存在", "该用户名已存在");
		return "/user/create";
	}
	
	this.userService.createUser(user);
	return "/user/list.html";
}

 

 

在JSP页面上显示校验错误信息

返回页面以后,SpringMVC框架将所有校验错误信息都放在了上下文中,可以自己去取出来,但是那样非常麻烦,不过没关系,Spring提供了一套自定义标签,可以方便的显示校验错误信息。

 

页面头部需要导入Spring的自定义标签库

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

 

 

需要一次性显示全部校验错误

(commandName的值就是@ModelAttribute注解中指定的值)

<form:form commandName="userDetail">
    <form:errors path="*" cssStyle="color:red"></form:errors>
</form:form>

 

 

需要在对应输入框的后面显示单个校验错误

(通过path指定显示那个具体的校验错误,userDetail正是@ModelAttribute注解中指定的值,而点号后面则是指定显示Bean中哪个属性的校验错误)

<input type="text" name="userName" value="${userDetail.userName}" >
<form:errors path="userDetail.userName" cssStyle="color:red"></form:errors>

<input type="text" name="email" value="${userDetail.email}">
<form:errors path="userDetail.email" cssStyle="color:red"></form:errors>

 

 

在FreeMarker视图上面显示校验错误

如果视图使用的是FreeMarker,Spring同样提供了一套“自定义标签库”,在FreeMarker中叫做自定义宏,使我们可以方便的显示出校验错误信息。

 

所有首先,需要导入Spring专门为FreeMarker提供的宏指令文件

<#import "spring.ftl" as spring />

 

然后就可以在每个输入框后面显示单个校验错误了

(bind后面的值与JSP中显示校验错误时的path是一致的)

<input type="text" name="userName" value="${(userDetail.userName)!}" />
<#if userDetail??>
	<@spring.bind "userDetail.userName" />
	<@spring.showErrors "<br>"/>
</#if>

<input type="text" name="email" value="${(userDetail.email)!}" />
<#if userDetail??>
	<@spring.bind "userDetail.email" />
	<@spring.showErrors "<br>"/>
</#if>

 

如何在FreeMarker模版文件中显示单个的校验错误信息?

<@spring.bind "userDetail.email" /> :是绑定到具体哪一个字段的校验结果,

<@spring.showErrors "<br>"/>         :则显示校验错误信息

 

在整合SpringMVC和FreeMarker搭建基础框架的过程中,基本顺风顺水,如今各种脚手架到处都是,拿几个过来参照即可。唯一花了点精力研究的就是——如何在FreeMarker模版文件中显示单个的校验错误信息。针对这个问题,在网上找了不少时间,都没有找到合适的方法,最后还是在国外的技术论坛上看到这个方法。这才是写下这篇博客的动力所在,希望对您有所帮助。

 

 

写在后面的话

如今Web系统都有前台JS校验,比如使用jQuery的validate框架就非常方便,所以上述在页面上显示校验错误信息的工作其实不是必须的。有了前台JS校验就能保证正常用户体验没有问题了,但是不能防止非正常用户绕过JS校验的恶意请求,所以后台校验还是要做的。我们只需要在Controller方法里面判断有校验错误的时候直接返回到一个错误页面就行了,那样就能保证所有请求数据都会经过校验,不管是经过了前台JS校验合格的数据,还是有人通过工具绕过JS校验的恶意数据,都难逃法眼。

2
0
分享到:
评论
13 楼 DR-YangLong 2015-08-31  
最近做个演示项目,用到了,不过这样的验证绑定还是不行,体验太差,现在都是AJAX异步后端验证+JS前台验证,提高交互体验。不过JSR的校验可以使用在RPC中,省去很多共同的工作。
12 楼 DR-YangLong 2015-08-31  
最近做个演示项目,用到了,不过这样的验证绑定还是不行,体验太差,现在都是AJAX异步后端验证+JS前台验证,提高交互体验。不过JSR的校验可以使用在RPC中,省去很多共同的工作。
11 楼 javaPrimary 2015-07-02  
不能收藏,只好maker一下
10 楼 yunzhu 2015-03-16  
xvhua4317 写道
太棒了,简单直接

谢谢
9 楼 xvhua4317 2015-03-13  
太棒了,简单直接
8 楼 yunzhu 2014-08-17  
SmileToYou 写道
感谢了

不客气
7 楼 SmileToYou 2014-08-17  
感谢了
6 楼 yunzhu 2014-08-17  
LinApex 写道
yunzhu 写道
LinApex 写道
完全没意思,绑定的太死了.

在实际项目中后来也没有在页面上面显示服务端校验错误消息,只是在Controller方法里面进行了校验然后返回到错误页面。不过JSR-303还是很有用的,让校验形成标准


我的意思是说,后台返回错误消息,还需要在前端写各种标签,各种麻烦,我改进了功能,将错误信息封装成json返回给前端,前端再提示错误信息。 这样体验更好一些,任何人也绕不过验证.

嗯,这种体验是比较好,具体怎么实现的,可以讨教一下吗
5 楼 yunzhu 2014-08-17  
SmileToYou 写道
能把jsr303需要的jar给我一份吗?我下载的就只有hibernate-validation.jar

附件添加了一个javax.validation-1.0.0.GA.jar
4 楼 SmileToYou 2014-08-16  
能把jsr303需要的jar给我一份吗?我下载的就只有hibernate-validation.jar
3 楼 LinApex 2014-07-05  
yunzhu 写道
LinApex 写道
完全没意思,绑定的太死了.

在实际项目中后来也没有在页面上面显示服务端校验错误消息,只是在Controller方法里面进行了校验然后返回到错误页面。不过JSR-303还是很有用的,让校验形成标准


我的意思是说,后台返回错误消息,还需要在前端写各种标签,各种麻烦,我改进了功能,将错误信息封装成json返回给前端,前端再提示错误信息。 这样体验更好一些,任何人也绕不过验证.
2 楼 yunzhu 2014-07-05  
LinApex 写道
完全没意思,绑定的太死了.

在实际项目中后来也没有在页面上面显示服务端校验错误消息,只是在Controller方法里面进行了校验然后返回到错误页面。不过JSR-303还是很有用的,让校验形成标准
1 楼 LinApex 2014-07-05  
完全没意思,绑定的太死了.

相关推荐

    springMVC&myBatis;整合jar包

    Spring MVC和MyBatis是Java开发中常用的两个框架,它们...这种整合方式使得Web应用的架构更加模块化,便于维护和扩展。在实际开发中,还需要考虑异常处理、安全控制、性能优化等多个方面,以构建高效、稳定的应用系统。

    SpringMVC完整使用教程

    你可以直接在方法签名中使用参数,如 `String name` 来获取请求参数;或者使用 `@RequestParam` 注解指定参数名。对于复杂的数据结构,可以使用 POJO 类绑定请求参数值,SpringMVC 会自动将请求参数填充到对象中。...

    myibatis+spring+springmvc框架整合

    6. 创建视图:根据需求,使用如JSP、Thymeleaf或FreeMarker等模板引擎创建视图,展示数据。 7. 测试:启动服务器,通过浏览器或单元测试验证应用是否正常运行,所有功能是否符合预期。 "webbuilder"可能是本次整合...

    springmvc增删改,分页,导入数据等功能

    SpringMVC可以结合JSR-303/JSR-349 Bean Validation,通过在模型对象上添加验证注解,如@NotBlank、@Size等,进行前端和后端的数据校验。 6. **模板引擎**:SpringMVC支持多种视图技术,如JSP、FreeMarker、...

    maven+spring+springMvc+mybaits+freemarker

    MyBatis允许开发者编写动态SQL,提供了映射XML或注解方式将Java对象与数据库表进行映射,实现了数据访问的便利性。 **FreeMarker** 是一个模板引擎,常用于Web开发中的视图层。它与Spring MVC配合使用,根据数据...

    SSM(spring+springMVC+mybaits)整合框架

    它支持多种视图技术,如JSP、FreeMarker等,并且有强大的数据绑定和校验功能。 **MyBatis** 是一个持久层框架,它允许开发者使用SQL语句直接操作数据库,结合XML或注解方式定义SQL、存储过程及高级映射。MyBatis...

    springMVC4.1+easyUI(单项目)

    在本项目中,EasyUI用于构建后台管理系统的界面,配合jQuery 1.8实现动态交互和数据展示。 11. **EasyUI三级菜单**: EasyUI的菜单组件支持多级展开,可以创建层次分明的导航结构。在后台管理系统中,这种三级菜单...

    springMvc中文 pdf下载

    3. **数据校验**:使用 JSR 303/JSR 349 规范的 Bean Validation 进行数据验证。 4. **本地化与国际化**:通过消息源(MessageSource)支持多语言环境。 5. **RESTful 支持**:利用 HTTP 方法和 @RequestMapping ...

    狂神说springmvc笔记.zip

    在"狂神说springmvc笔记.zip"中,读者可以通过深入学习这些知识点,掌握SpringMVC的使用技巧和最佳实践,提升自己的Java Web开发能力。笔记可能包括代码示例、配置解析、实战演练等内容,帮助开发者快速上手并精通...

    SpringMVC完整demo.zip

    下面我们将详细探讨SpringMVC在实现JSON响应、文件上传和数据提交等方面的应用。 1. **返回JSON**: 在现代Web应用中,JSON是一种广泛使用的数据交换格式,尤其在前后端分离的开发模式下。SpringMVC通过`@...

    springMVC 注册登录源码

    创建一个实体类并添加校验注解,然后在控制器中使用`Validator`进行验证。 ```java public class User { @NotBlank(message = "用户名不能为空") private String username; @NotBlank(message = "密码不能为空")...

    SpringMvc所需所有jar

    Spring Boot的应用中,通常使用@Configuration和@EnableWebMvc注解来启用MVC功能。 11. **RESTful API**:SpringMvc也支持创建RESTful服务,通过@RequestMapping的HTTP方法参数,可以方便地处理GET、POST、PUT、...

    springMVC.pdf

    数据校验确保了数据的一致性和完整性,SpringMVC通过声明式校验,如JSR-303标准,以及编程式校验来保证数据的安全性和健壮性。 拦截器用于拦截特定请求,以便进行功能扩展,如权限检查、日志记录等。 异常处理提供...

    自己动手写SpringMVC框架项目源代码

    使用Hibernate Validator或者JSR-303/JSR-349提供的注解进行数据校验,可以确保输入数据的有效性。 9. 国际化与本地化 SpringMVC提供对多语言支持,通过ResourceBundle和LocaleResolver实现国际化和本地化。 10....

    springmvc maven工程

    总结,"springmvc maven工程"是基于Maven构建的SpringMVC项目,利用了Maven的依赖管理和构建功能,结合SpringMVC的灵活性,提供了一种高效开发Java Web应用的方式。通过理解并掌握SpringMVC和Maven的核心概念与实践...

    管理系统系列--Guns基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springmvc + sh.zip

    【描述】中的“致力于做更简洁的后台管理系统,完美整合springmvc + sh”进一步强调了Guns系统的设计理念,即简洁性。这里的“sh”可能指的是Shell脚本,通常用于自动化服务器管理和部署任务。整合Spring MVC和Shell...

    SpringMVC4零配置

    SpringMVC4支持创建RESTful API,通过`@PathVariable`、`@RequestParam`等注解处理URL中的动态部分和请求参数。这样可以实现资源导向的API设计,符合HTTP协议的最佳实践。 8. **异常处理** 可以通过`@...

    springMVC整合

    在 "SSM1" 压缩包中,可能包含了 Spring MVC 整合的示例代码,包括了上述组件的配置和使用。通过学习和分析这些文件,你可以深入理解 Spring MVC 的工作原理和最佳实践。在实际开发中,这些知识将帮助你构建高效、可...

    尚硅谷SpringMVC视频

    - 使用@ModelAttribute注解将请求参数绑定到方法参数,实现数据校验和转换。 - ModelMap或Model接口用于在Controller和View之间传递数据。 4. **视图解析(View Resolution)** - 视图解析器如...

    传智播客_Springmvc+Mybatis由浅入深全套视频代码

    Mybatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。学习Mybatis,你需要关注以下关键点: 1. XML配置文件/注解:定义Mapper...

Global site tag (gtag.js) - Google Analytics