SpringMVC Databinding(数据绑定)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC Databinding(数据绑定)相关的知识,希望对你有一定的参考价值。
参考技术A该文是基于Spring 4.2.3.RELEASE版本展开的
在使用SpringMVC时,从页面传来的字面值要转换为相应格式的属性值,对于String,Integer等最基本的类型,Spring可以自动转换,但是对于像Date这种较为复杂的类型转换,就没有那么容易了。
在Controller中定义如下方法接收页面请求:
如果在页面访问, http://localhost:8080/test?date=2015-02-04 20:40:38 会报400错误,后台会抛异常:Failed to convert value of type \'java.lang.String\' to required type \'java.util.Date\'; 这是因为Spring没有默认实现String字面值到Date的转化。
对于上述通过url或者由表单传过来的数据,后台若想成功接收,方法有如下几种:
1.在Controller中自定义initBinder
说明:这种方法每次只能处理一个参数,若要处理多个参数,则要写多个,并不灵活
2.自定义Converter或Formatter
自定义DateConverter类
在xml中引入上述Converter
annotation-driven中引用
说明:这种方法是全局的设置,对所有的**@RequestParam 或 @ModelAttribute**的Date类型的绑定都有效
3.使用注解@DateTimeFormat
引入joda包
使用注解修饰相应参数
定义如下类:
Controller:
直接post请求,后台会报birthday字段转换错误,对于这种类型的参数绑定,一般有如下两种处理方法:
1.自定义DateDeserializer
使用@JsonDeserialize(using = DateDeserializer.class)注释相应字段或参数
2.覆盖objectMapper的dateFormat
以上两种方法解决了request body中数据的绑定问题
一起Talk Android吧(第三百八十五回:数据绑定-DataBinding总结)
文章目录
各位看官们,大家好,上一回中咱们说的是数据绑定-DataBinding的例子,这一回中咱们继承介绍该例子。闲话休提,言归正转,让我们一起Talk Android吧!
数据绑定使用方法
7.单向数据绑
单向数据绑定表示数据模型中的数据发生变化时与该数据绑定的UI控件自动更新控件中显示的数据。
这个功能需要数据模型类继承BaseObservable
类,并且在数据模型类的公有属性上使用@Bindable
注解,如果属性是私有权限,那么把注解写到属性的getter方法上;最后是在属性的setter方法中使用notifyChange()
方法或者notifyPropertyChanged(BR.strValue)
方法通知视图:与视图绑定的数据发生了变化,请修改视图中显示的数据;
这两个方法中不带参数的方法用来通知视图中与数据绑定的所有控件,带参数的方法用来通知视图中与参数匹配的控件,这个参数使用了一个断BR的类,它是系统自动生成的,它的成员包含数据绑定类的属性和视图中的数据变量,我们在示例代码中使用BR.strValue当作参数,它是数据绑定类的属性,绑定了视图中的TextView控件,当它的数据发生变化后,视图中TextView显示的内容会自动更新,这就是数据绑定的魅力所在。关于BR类的示例如下,大家可以参考:
//这个类是系统编译生成的,不需要手动去修改
public class BR
public static final int _all = 0;
public static final int strValue = 1;
public static final int testdata = 2;
8.双向数据绑定
双向数据绑定表示视图中的UI控件发生变化时自动通知与当前控件绑定的数据,并且更新数据,反之亦然。
双向数据绑定是在单向数据绑定的基础上实现的,在视图中UI控件绑定数据的地方添加等号就可以:android:text="@=testdata.strValue",
大家可以参考步骤4中的代码,我们给EditText控件实现了双向数据绑定功能,当数据模型中的数据更新时EditText会自动更新显示的内容,当EditText控件更新时(用户在EditText中输入数据)数据模型中的数据会自动更新。
9.绑定事件
在官方文档中叫绑定表达式,就是给视图中的UI控件绑定一个事件监听器,常用的是onClick
,比如我们在步骤4中的代码里给Buttton绑定了事件
android:onClick="@()->testdata.buttonClicked()"
当该Button被点击时会自动调用数据模型类中的buttonClicked()方法,该方法的实现如下:
public void buttonClicked()
strValue += strValue;
setStrValue(strValue);
我们主动调用了属性的setter方法,这样启动单向数据绑定功能通知与属性绑定的UI控件更新控件中的数据。
演示结果
下面的动画是本程序的演示,程序界面一共三个控件(也可以从xml布局文件中看到):
- 用来显示数据的TextView
- 用来接收数据的EditText
- 用来绑定事件的Button.
我们创建数据模型对象时初始化方法中的数值是"hello",这个值用来初始化类中的属性,因为类中的属性单向绑定到TextView控件,所以TextView显示"hello",当按下Button时,修改属性的值,属性值发生变化后自动通知TextView更新数据,这个在动画中可以看到,进而验证了单向数据绑定功能正常。
EditText使用了双向数据绑定功能,它的初始值是数据模型类的属性值"hello",按下Button后属性值发生变化,受双向绑定功能的影响,它显示的数据也自动进行更新,当我们在控件上输入"good"后导致控件发生了更新,受双向绑定功能的影响,数据模型中的数据会自动更新,更新后的值通过TextView显示出来。
使用总结
- 数据绑定可以在Activity中使用,也可以在Fragment中使用;
- 在绑定过程中还支持各种运算和运算符,大家可以参考官方文档的介绍;
- 数据绑定具有视图绑定的功能,在此功能上还可以自动更新数据和UI控件,而且还可以给控件绑定事件监听器;
数据绑定主要包含三个要素:Activity,xml布局(视图),数据模型类.
数据封装在数据模型中,视图中的控件和数据模型中的数据做了绑定,Activity只需要把视图和数据模型类关联起来就可以,这就典型的MVVM模型,数据绑定在其中担当VM角色。
使用数据绑定主要有两个优势:
- 控件和数据可以自动更新
- view和model可以分开降低了程序的耦合
关于数据绑定的用法还比较多,我们在这里只介绍了一些常用的功能,感兴趣的看官可以去看官方文档。此外,我觉得在Compose推出后数据绑定功能已经无用武之地,因为没有View用来绑定数据。
看官们,关于Android中数据绑定-DataBinding的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
以上是关于SpringMVC Databinding(数据绑定)的主要内容,如果未能解决你的问题,请参考以下文章
RecyclerView Item Click Listener with DataBinding
DataBinding快速入门(还在用findViewById?)