码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC的数据转换&&数据格式化&&数据校验

时间:2019-11-14 10:11:33      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:adc   intern   support   ber   path   注册   ons   over   数据格式   

1 SpringMVC的数据绑定流程

  • SpringMVC将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象。
  • DataBinder调用装配在SpringMVC上下文中ConversionService组件进行数据类型转换、数据格式化工作。将Servlet中的请求信息填充到入参对象中。
  • 调用Validator组件对已经绑定了请求信息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象。
  • SpringMVC抽取BindingResult中的入参对象和校验错误对象,将它们赋给处理方法的响应入参。

 

  • SpringMVC通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是DataBinder,运行机制如下:

技术图片

 

 

2 数据转换

  • SpringMVC上下文中内建了很多转换器,可以完成大多数Java类型的转换工作。

2.1 自定义类型转换器

  • ConversionService是Spring类型转换体系的核心接口。
  • 可以利用ConversionServiceFactoryBean在Spring的IOC容器中定义一个ConversionService。Spring将自动识别出IOC容器中的ConversionService,并在Bean属性配置及SpringMVC处理方法入参绑定等场合使用它进行数据的转换。
  • 可以通过ConversionServiceFactoryBean的converters属性注册自定义的类型转换器。

 

  • 示例:
  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<a href="${pageContext.request.contextPath}/test?user=adc,123456,1">增加数据</a>

</body>
</html>
  • User.java
package com.sunxiaping.springmvc.domain;

import java.io.Serializable;

public class User implements Serializable {
    private String username;
    private String password;
    private Integer age;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
  • UserConverter.java
package com.sunxiaping.springmvc.converters;

import com.sunxiaping.springmvc.domain.User;
import org.springframework.core.convert.converter.Converter;

public class UserConverter implements Converter<String, User> {
    @Override
    public User convert(String s) {
        if (null == s || s.length() == 0) {
            return null;
        }
        String[] split = s.split(",");

        User user = new User();
        user.setUsername(split[0]);
        user.setPassword(split[1]);
        user.setAge(Integer.parseInt(split[2]));

        return user;
    }
}
  • UserController.java
package com.sunxiaping.springmvc.controller;

import com.sunxiaping.springmvc.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {

    @RequestMapping(value = "/test")
    public String test(User user){

        System.out.println(user);

        return "success";
    }


}
  • SpringMVC.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd ">

    <!-- 配置自动扫描的包 -->
    <context:component-scan base-package="com.sunxiaping.springmvc"></context:component-scan>

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>



    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.sunxiaping.springmvc.converters.UserConverter"></bean>
            </set>
        </property>
    </bean>

    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>


</beans>
  • success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
成功啦 <br/>

</body>
</html>

2.2 关于<mvc:annotation-drivern>

  • <mvc:annotation-drivern>会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver三个Bean。
  • 还将提供以下的支持:
    • 支持使用ConversionService实例对表单参数进行转换。
    • 支持使用@NumberFormat注解和@DateTimeFormat注解完成数据格式化。
    • 支持使用@Valid注解对JavaBean实例进行JSR303验证。
    • 支持使用@RequestBody和@Res婆娘色Body注解。 

2.3 @InitBinder注解

  • 由@InitBinder标识的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,用于完成由表单字段到JavaBean属性的绑定。
  • @InitBinder方法不能由返回值,它必须声明为void。
  • @InitBinder方法的参数通过是WebDataBinder。

 

  • 示例:
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
    webDataBinder.setDisallowedFields("roleIds");
}

 

3 数据格式化

 

SpringMVC的数据转换&&数据格式化&&数据校验

标签:adc   intern   support   ber   path   注册   ons   over   数据格式   

原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/11854569.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!