数据绑定+转换+验证流程

数据从参数绑定到实体类的具体流程
MWU2@UU~{B3PRE1GILUE]4B.png

进入invokeHanldeMethod()方法后的执行流程
5}[Y}6FVVUV}6UYQBB6IWS9.png
进入到了一个resolveArgument方法中进行参数合实体类的绑定
Y32Y[X(N@3WEMETQL~8MFOR.png
resolveArgument方法中会通过WebDataBinder生成一个数据绑定器对象(binder)通过this.bindRequestParameters()方法将请求参数绑定到实体类上,这就是为什么SpringMVC可以直接使用实体类接收数据的原理。
9%XSH@[V]QAE4AV_]MG4M$V.png
这个数据绑定器里面还包含着数据验证器:validators负责数据校验工作数据转换器ConversionService组件:负责数据类型的转换以及格式化功能

自定义数据转换器

1.配置SpringMVC.xml文件

    <mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- 让SpringMVC使用我们自己配置的转换器 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.lyh.component.MyConverterTest"></bean>
            </set>
        </property>
    </bean

2.编写数据转换器

package com.lyh.component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
import com.lyh.bean.User;
import com.lyh.dao.UserDao;
public class MyConverterTest implements Converter<String, User> {
    @Autowired
    UserDao userDao;
    @Override
    public User convert(String source) {
        User user=new User();
        if (source.contains("@")) {
            String[] split = source.split("@");
            user.setUsername(split[0]);
            user.setEmail(split[1]);
            userDao.save(user);
        }
        return user;
    }
}

3.重新启动
转换器生效
46A~%ZR3V[5@2)4HD9([Y[N.png

DZYW8`R_H2@CILP[9)LGPYE.png
转换器种类很多
VD@)66DPCVIKN21Q}44COGI.png
不同的转换器会有不同的转换功能
J%MZ0P}4TMW((%_4T$FOFID.png

数据验证

Spring MVC中数据验证可以直接使用JSR303完成,只需要在实体类属性上添加注解然后在入参时添加@Vaild注解即可进行数据验证,用BindeingResult可以将错误信息取出,然后放到Model域中发送给前段界面。

@Email
public String emaile;
@RequestMapping("/addUser")
public String addUser(@Vaile User user,BindingResult result)
{
    Boolean result=result.hasErrors();
    List<FieldError> errors = result.getFieldErrors();
    if(result)
    {
    model.addAttribute("errorVaild",errors.getDefaultMessage());
    }
    else
    {
    userDao.saveUser(user);
    return "success";
    }
}
${errorVaild} <!--取出错误信息-->
<form>
用户名:
<input type="text" name="username">
密码:
<input type="password" name="password">
个人邮件:
<input type="text" name="email">
</form>

JSR303细节看易学教程:https://www.e-learn.cn/topic/...


Rise
4 声望1 粉丝