原文地址 http://tzwzero-163-com.iteye.com/blog/1696490
SpringMVC从3.1开始引入了hibernate的校验,感觉也是一个很好用的东西,不需要配置文件,通过annotation就可以,这样做的好处是:你可以控制错误的输出方式,相比webx;
例如:实体类
- package com.mybank.domain;
- import javax.validation.constraints.Size;
- import org.hibernate.validator.constraints.Email;
- import org.hibernate.validator.constraints.NotEmpty;
- public class UserInfo {
- private long id;
- @Size(max=25,message="用户昵称太长了")
- private String userNick;
- @NotEmpty(message="邮箱不能为空")
- @Email(message="请填写正确格式")
- private String userEmail;
- @NotEmpty(message="密码不能为空哦")
- @Size(min = 1, max = 25,message="密码请控制在1~25个字符之间")
- private String userPassword;
- private int status;
- public int getStatus() {
- return status;
- }
- public void setStatus(int status) {
- this.status = status;
- }
- public String getUserPassword() {
- return userPassword;
- }
- public void setUserPassword(String userPassword) {
- this.userPassword = userPassword;
- }
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getUserNick() {
- return userNick;
- }
- public void setUserNick(String userNick) {
- this.userNick = userNick;
- }
- public String getUserEmail() {
- return userEmail;
- }
- public void setUserEmail(String userEmail) {
- this.userEmail = userEmail;
- }
- }
处理的类:
- @RequestMapping("/register")
- public @ResponseBody
- Map<String, Object> register(@Valid UserInfo userInfo, BindingResult result) {
- Map<String, Object> model = new HashMap<String, Object>();
- String code = "0";
- String message = "";
- if (result.hasErrors()) {
- for (FieldError fieldError : result.getFieldErrors()) {
- model.put(fieldError.getField(), fieldError.getDefaultMessage());
- }
- return model;
- }
- String sql = "INSERT INTO user_info (user_email, user_nick,user_password,gmt_create,gmt_modified,status) VALUES (?,?,?,?,?,?)";
- String querySql = "select * from user_info where user_email=?";
- UserInfo ownerInfo = null;
- try {
- ownerInfo = jdbcTemplate.queryForObject(querySql,
- new Object[] { userInfo.getUserEmail() },
- new BeanPropertyRowMapper<UserInfo>(UserInfo.class));
- } catch (EmptyResultDataAccessException e) {
- message = "您已经注册过了";
- }
- if (ownerInfo == null
- || ownerInfo.getStatus() != Constants.NORMAL_STATUS) {
- int i = jdbcTemplate.update(sql, userInfo.getUserEmail(),
- userInfo.getUserNick(), userInfo.getUserPassword(),
- new Date(), new Date(), Constants.NORMAL_STATUS);
- if (i > 0) {
- code = "200";
- message = "注册成功";
- } else {
- message = "注册失败";
- }
- } else {
- message = "您已经注册过了";
- }
- model.put("code", code);
- model.put("message", message);
- return model;
- }
这样,校验信息就可以顺利的转成json返回给前端,而大部分使用的校验框架基本都是在请求进入action前就处理,这样的好处是及时返回,坏处是返回格式不易控制。校验需要使用的jar包
- hibernate-validator-4.1.0.Final.jar
- javax.validation-1.0.0.GA.jar
- slf4j-api-1.6.1.jar
- commons-logging-1.1.1.jar
如果你需要返回json类型还需要如下jar包
- jackson-core-asl-1.9.10.jar
- jackson-mapper-asl-1.9.10.jar
由于只是自己玩,所以懒得加入一堆jar,所以dao还是使用了Spring的JDBCTemplate,再者我是个很懒得人,所以不太喜欢自己从ResultSet里边一一对应的取值复制,所以百度终得其解,不过也有些限制做法如下:
- userInfo = jdbcTemplate.queryForObject(
- sql,
- new Object[] { userInfo.getUserEmail(),
- userInfo.getUserPassword() },
- new BeanPropertyRowMapper<UserInfo>(UserInfo.class));
在查询的时候传入的RowMapper使用:BeanPropertyRowMapper,由Spring完成这一步,不过前提是属性使用驼峰(完全按照数据库字段定义属性也可以,不过估计没人愿意这么干)具体的如果出错了,参加源码应该也可以很好的理解的。
哇咔咔,这个BeanPropertyRowMapper实在是省事啊。
对了其实我的SpringMVC的配置文件也相对比较简单如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
- <!-- 启用spring mvc 注解 -->
- <context:annotation-config />
- <mvc:annotation-driven />
- <mvc:default-servlet-handler />
- <!-- 设置使用注解的类所在的jar包 -->
- <context:component-scan base-package="com.mybank.action"></context:component-scan>
- <!-- 完成请求和注解POJO的映射 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
- /> -->
- <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="" />
- <property name="suffix" value=".jsp" />
- </bean>
- </beans>
其中context:component-scan这个可以配置空值
- <context:annotation-config />
- <mvc:annotation-driven />
- <mvc:default-servlet-handler />
这三个可以让你省去一大堆配置
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="" />
- <property name="suffix" value=".jsp" />
- </bean>
这个貌似必须配置,否则你的应用就找不到处理完成后的响应视图了