SpringMVC框架整理(二)

数据绑定流程(数据转换,数据格式化,数据校验)1. Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Ser...
摘要由CSDN通过智能技术生成

数据绑定流程(数据转换,数据格式化,数据校验)

1. Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象

2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中

3. 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象

4. Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参

 

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

     

 

 

 

使用binderFactory创建一个绑定器,WebDataBinder

WebDataBinder binder = binderFactory.createBinder(request, attribute, name);

        if (binder.getTarget() != null) {

            //绑定数据

            bindRequestParameters(binder, request);

            //校验数据

            validateIfApplicable(binder, parameter);

            //错误信息

            if (binder.getBindingResult().hasErrors()) {

                if (isBindExceptionRequired(binder, parameter)) {

                    throw new BindException(binder.getBindingResult());

                }

            }

        }

 

数据绑定流程中的组件介绍:

①数据类型转换组件(了解它可以自定义类型转换器)

 

ConversionService 是 Spring 类型转换体系的核心接口。

可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService.

Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring  MVC 处理方法入参绑定等场合使用它进行数据的转换

可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器

 

②验证组件(在服务器端对用户信息的合法性进行验证)

 

③错误消息保存组件(用于保存数据校验后的错误信息,然后在页面就可以进行获取)

 

 

组件详细介绍:

ConversionService

     conversionService在工作的时候,里面装配了很多的xxxConvertor,用于数据在不同类型之间的转换。

 

其中的一个数据类型转换器 

final class StringToCharacterConverter implements Converter<String, Character> {

 

    @Override

    public Character convert(String source) {

        if (source.length() == 0) {

            return null;

        }

        if (source.length() > 1) {

            throw new IllegalArgumentException(

                    "Can only convert a [String] with length of 1 to a [Character]; string value '" + source + "'  has length of " + source.length());

        }

        return source.charAt(0);

    }

 

}

 

自定义类型转换器

 

数据绑定核心思想:

     1、WebDataBinder用来将请求过来的数据和指定的对象进行绑定

     2、WebDataBinder里面注册了

               1)有负责数据转换/格式化工作的ConversionService组件。

                         这个组件在工作的时候使用他里面各种转换器和格式化器进行工作

               2)还注解了一堆验证组件Validators

               3)还将数据绑定的结果(失败信息)放在BindingResult

 

    在熟知了数据绑定的流程我们可以自定义类型转换器并让其工作:

 

需求:

使用表单提交value="1-tom-email-男-dd",提交后框架可以帮助我们自动包装成对象。框架默认并没有符合我们需求的类型转换器,我们需要自定义一个

 

表单

<form action="${pageContext.request.contextPath }/save" method="post">

    <input type="text" name="emp" value="1-tom-email-男-dd">

    <input type="submit" value="提交">

</form>

 

①编写一个自定义类型转换器实现Converter<S,T>

需要实现public interface Converter<S, T>接口

     自定义类型转换器

package com.atguigu.convert;

import org.springframework.core.convert.converter.Converter;

import com.atguigu.entities.Employee;

 

/**

 * 创建自定义的类型转换器,将我们的字符串转换成对象

 * @author LENOVO

 *

 */

public class EmployeeConvert implements Converter<String, Employee> {

 

    @Override

    public Employee convert(String src) {

        System.out.println(src);

        if(src!=null&&!"".equals(src)) {

            //将其利用split根据分割线拆分成数组

            String[] split = src.split("-");

            Employee employee = new Employee(Integer.parseInt(split[0]), split[1], split[2], 0, null);

            return employee;

        };

        return null;

    }

}

②在ConversionService组件的创建工厂中注册自定义转换器        

    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">

        <property name="converters">

            <set>

                <!--在ConversionService组件中创建工厂中注册自定义的转换器-->

                <bean class="com.atguigu.convert.EmployeeConvert"></bean>

            </set>

        </property>

    </bean>

③告诉SpringMVC用这个工厂创建ConversionService 组件

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

 

数据格式化:

     在SpringMVC框架中格式化器和类型转换器都在ConversionService 组件中,我们在数据类型转换的时候,还可以根据指定的格式进行格式化并转换

但是我们自定义的类型转换器,不具有格式化功能。

 

原因:

ConversionServiceFactoryBean造出的ConversionService组件是DefaultConversionService,不具有格式化功能

而默认配置的ConversionService组件是DefaultFormattingConversionService

 

配置既可以实现类型转换(含自定义类型转换)和数据格式功能

     <!--配置一个既有格式化功能又能数据类型转换的创建工厂  -->

     <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

        <property name="converters">

            <set>

                <bean class="com.atguigu.convert.EmployeeConvert"></bean>

            </set>

        </property>

    </bean>

     <!--告诉SpringMVC用这个工厂创建ConversionService组件-->

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

 

提供给测试所有的handle

    /**

     * 自定义类型转化器的测试

     * @param employee

     * @return

     */

    @RequestMapping(value="/save",method=RequestMethod.POST)

    public String save(@RequestParam("emp") Employee employee) {

        System.out.println(employee);

        return "input";

    }

 

 

annotation-driven细节

 

既没有配置 <mvc:default-servlet-handler/> 也没有配置 <mvc:annotation-driven/>

使用默认的适配器帮我们执行方法

 

现象:可以处理正常的请求,但是不能访问静态资源

 

配置 <mvc:default-servlet-handler/>没有配置 <mvc:annotation-driven/>

 

我们发现AnnotationMethodHandlerAdapter没有,所以不能正常干活了。所以请求无法处理

现象:静态资源能访问,动态请求又不行了

 

配置<mvc:default-servlet-handler/>也配置<mvc:annotation-driven/>

 

现象:静态资源可以访问,动态请求也可以处理

 

<!--若配置直接映射,会把初始干活的干掉,

但是配置上<mvc:annotation-driven/>,高级干活的RequestMappingHandlerAdapter不会被干掉

-->

<mvc:view-controller path="/abc" view-name="input"/>

配置直接映射出现的情况:没有帮我们处理请求的适配器了。

 

 

综上:

     <mvc:annotation-driven/>(单独配置它,无法访问静态资源)

      <mvc:default-servlet-handler/>(把这个配上就有可以访问静态资源了)

       因此当我们使用SpringMVC框架做表现层开发时这两个配置是标配

 

数据校验

          JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 . JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证。

 

常用的校验注解:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值