1、请求数据在到达处理方法前这段时间。

spring MVC还会做请求信息转换、数据转换、数据格式化、数据校验。

2、数据转换

1》ConversionService:

Spring类型转换体系的核心接口,在其中定义了一下4个方法:

可以在spring上下文中注册一个ConversionServiceFactoryBean,用以定义一个ConversionService。spring上下文将识别出这个ConversionService,并在spring mvc处理方法的参数绑定中使用它进行数据转换。

在ConversionServiceFactoryBean中可以内置很多的类型转换器,使用它们可以完成大多数Java类型的转换工作。其除了包括将spring对象转换为各种基础类型的对象外,还包括String、Number、Array、Collection、Map、Properties及Object之间的转换器。可以通过ConversionServiceFactoryBean的converters属性注册自定义的类型转换器。

<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.lfy.converter.StringToDateConverter"/>
</list>
</property>
</bean>

2》spring支持的转换器

spring在org.springframework.core.convert.concerter包中定义了3种类型的转换器接口,我们可以实现其中任意一种转换器接口,并将它作为自定义转换器注册到ConversionServiceFactoryBean当中。3种转换器接口:

举个例子:

假设某User类型的组成如下,User还作为处理方法的参数。前端页面传递的都是字符串类型。

public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    private String loginname;
private Date birthday;
...
}

这时候接收Date类型的数据绑定到User中就要经过处理了,开发自己的转换器StringToDateConverter.java。

import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter; // 实现Converter<S,T>接口
public class StringToDateConverter implements Converter<String, Date>{ // 日期类型模板:如yyyy-MM-dd
private String datePattern; public void setDatePattern(String datePattern) {
this.datePattern = datePattern;
} // Converter<S,T>接口的类型转换方法
@Override
public Date convert(String date) {
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(this.datePattern);
// 将日期字符串转换成Date类型返回
return dateFormat.parse(date);
} catch (Exception e) {
e.printStackTrace();
System.out.println("日期转换失败!");
return null;
}
}
}

在springmvc-config.xml中加入自定义的字符转换器。

    <!-- 装配自定义的类型转换器,
默认annotation-dricen会注册一个ConversionService,即FormattingConversionServiceFactoryBean
,以满足大多数类型转换的需求。现在要注册一个自定义的转换类,因此需要显式地使用一个ConversionService覆盖
默认的实现类,通过制定conversion-service指定。这样在任意处理器中都可以使用该转换器了。 -->
<mvc:annotation-driven conversion-service="conversionService"/> <!-- 自定义的类型转换器 -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.lfy.converter.StringToDateConverter"
p:datePattern="yyyy-MM-dd"/>
</list>
</property>
</bean>

UserController.java

package com.lfy.controller;

import com.lfy.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class UserController{ ...
@RequestMapping(value="/register")
public String register(
@ModelAttribute User user,
Model model) {
System.out.println(user);
model.addAttribute("user", user);
return "success";
}
}

运行结果:

3》使用@InitBinder添加自定义的编辑器转换数据

spring MVC在支持新的转换器框架的同时,也支持Java Bean的PropertyEditor。可以在控制器中使用@InitBinder添加自定义的编辑器。

在上面一个例子中将springmvc-config.xml中自定义的转换器删除。然后添加DateEditor.java

package com.lfy.converter;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class DateEditor extends PropertyEditorSupport { @Override
public void setAsText(String text) throws IllegalArgumentException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = dateFormat.parse(text);
setValue(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}

修改UserController.java

package com.lfy.controller;

import com.lfy.bean.User;
import com.lfy.converter.DateEditor; import java.util.Date; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class UserController{ @RequestMapping(value="/registerForm")
public String registerForm(){
return "registerForm";
} // 在控制器初始化时注册属性编辑器
@InitBinder
public void initBinder(WebDataBinder binder){
// 注册自定义编辑器
binder.registerCustomEditor(Date.class, new DateEditor());
} @RequestMapping(value="/register")
public String register(
@ModelAttribute User user,
Model model) {
System.out.println(user);
model.addAttribute("user", user);
return "success";
}
}

运行,结果和上面的例子一致。

4》使用WebBindingInitializer注册全局自定义编辑器转换数据

如果希望在全局范围内使用自定义的编辑器,则可以通过实现WebBindingInitializer接口并在该实现类中注册自定义编辑器完成。

增加DateBindingInitializer.java

package com.lfy.binding;

import java.util.Date;
import com.lfy.converter.DateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest; public class DateBindingInitializer implements WebBindingInitializer { @Override
public void initBinder(WebDataBinder binder, WebRequest webRequest) {
binder.registerCustomEditor(Date.class, new DateEditor());
} }

去除UserController.java中的@InitBinder注解,UserController.java

package com.lfy.controller;

import com.lfy.bean.User;
import com.lfy.converter.DateEditor; import java.util.Date; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class UserController{ @RequestMapping(value="/registerForm")
public String registerForm(){
return "registerForm";
} @RequestMapping(value="/register")
public String register(
@ModelAttribute User user,
Model model) {
System.out.println(user);
model.addAttribute("user", user);
return "success";
}
}

修改springmvc-config.xml,配置全局的自定义编辑器

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:default-servlet-handler/> <!-- 扫描controller -->
<context:component-scan base-package="com.lfy.controller"/>

<!-- 通过RequestMappingHandlerAdapter装配自定义编辑器 -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="webBindingInitializer">
               <bean  class="com.lfy.binding.DateBindingInitializer" />
            </property>
        </bean>

      <!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/content/" p:suffix=".jsp" />
</beans>

运行,结果与上一示例一致。

3、多种转换器的优先级(多种方式可以同时并存),优先查找顺序为:

4、数据格式化

5、数据校验

Spring MVC-学习笔记(4)数据绑定流程的更多相关文章

  1. 1.3(Spring MVC学习笔记)数据绑定

    一.数据绑定介绍 用户发送过来的数据,只有传递到服务器端的参数上才会起作用. 比如用户输入的用户名和密码要和后台方法中代表用户名和密码的变量关联起来, 从而才能使用用户传递的数据进行一些操作,这样数据 ...

  2. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  3. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  4. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  5. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  6. Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息

    Spring MVC 学习笔记9 -- 实现简单的用户管理(4.2)用户登录--显示局部异常信息 第二部分:显示局部异常信息,而不是500错误页 1. 写一个方法,把UserException传进来. ...

  7. Spring MVC 学习笔记8 —— 实现简单的用户管理(4)用户登录

    Spring MVC 学习笔记8 -- 实现简单的用户管理(4)用户登录 增删改查,login 1. login.jsp,写在外面,及跟WEB-INF同一级目录,如:ls Webcontent; &g ...

  8. Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目

    Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目 Spring Tool Suite 是一个带有全套的Spring相关支持功能的Eclipse插件包. ...

  9. Spring MVC 学习笔记1 - First Helloworld by Eclipse【& - java web 开发Tips集锦】

    Spring MVC 学习笔记1 - First Helloworld by Eclipse reference:http://www.gontu.org 1. 下载 Spring freamwork ...

  10. 1.1(Spring MVC学习笔记)初识SpringMVC及SpringMVC流程

    一.Spring MVC Spring MVC是Spring提供的一个实现了web MVC设计模式的轻量级Web框架. Spring优点:网上有,此处不复述. 二.第一个Spring MVC 2.1首 ...

随机推荐

  1. thinkPHP模型定义

    批量新增 ArrayAccess类的属性当做数组访问 插入语句 这段代码说明,User继承的Model类的isupdate属性默认是isupdate,而User::get(1)把这一字段属性更新为tr ...

  2. Gitlab+Jenkins+Docker实现net core持续集成

    前言 在项目中使用这一套自动集成的体系之后,一直想找个时间总结出来,用于自己记录也打算将自己的所得分享给园友们,不经常写文章,可能会有错误的地方,希望各位不吝指正,我会及时的改正并表示感谢,希望大家能 ...

  3. Python---webserver项目

    # HTTP项目实战 - 深入理解HTTP协议 - 模拟后台服务程序基本流程和大致框架 - 每一个步骤一个文件夹 - 图解http协议,图解tcp/ip协议 # v01-验证技术 - 验证socket ...

  4. web开发常见的几大安全问题

    一.SQL注入 SQL注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击.SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求 ...

  5. tf.concat( )和tf.stack( )

    相同点:都是组合重构数据. 不同点:concat()不改变维数,而stack改变了维数(待定!!!) tf.concat是连接两个矩阵的操作,请注意API版本更改问题,相应参数也发生改变,具体查看AP ...

  6. Linux设置程序开机自启动

    注意: 作者测试时,Linux版本为RedHat6,同时应用在CentOS6应该也可以(作者未实测,但有同事在CentOS6上使用可行),系统版本的不同,可能造成操作上的差异(CentOS7就与Cen ...

  7. 花式求LCA

    设树上有两点x.y,要求他们的lca(最近公共祖先) 1.倍增求LCA: 先预处理出树上每个点的向上2^k的祖先. 再看x.y:先把深度深的倍增跳到和深度浅的一样的深度,判断是否在同一点:是,该点即为 ...

  8. create-react-app 构建的项目使用释放配置文件 webpack 等等 运行 npm run eject 报错

    使用 git 提交一次记录即可正常 git add . git commit -m 'init' npm run eject

  9. spring 接口校验参数(自定义注解)

    1. 注解类 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.l ...

  10. splice()、slice()、split()函数的区分

    1.slice(数组) 用法:array.slice(start,end) 解释:该方法是对数组进行部分截取,并返回一个数组副本:参数start是截取的开始数组索引,end参数等于你要取的最后一个字符 ...