软件开发实训(720科技)――第五课:数据绑定和标签库

软件开发实训(720科技)――第五课:数据绑定和标签库

内容关键词:表单、标签、数据、绑定、渲染,集合,配置,转换
授课老师:张森鹏
一、知识笔记
数据绑定是将用户输入绑定到领域模型的一种特性。有了数据绑定,类型总是为String的HTTP请求参数,可用于填充不同类型的对象属性。
1.数据绑定概览
基于HTTP的特性,所有HTTP请求参数的类型均为字符串。
有了数据绑定,就不再需要ProductForm类,也不需要解析Product对象的price属性。
@RequestMapping(value='product_save')
public String saveProduct(Product product, Model model)
数据绑定的另一个好处是:当输入验证失败时,它会重新生成一个HTML表单。手工编写HTML代码时,必须记着用户之前输入的值,重新填充输入字段。有了Spring的数据绑定和表单标签库后,它们就会替你完成这些工作。
2. 基本类型
推荐使用包装类型,注意@RequestParam注解的使用,其属性可以设置参数别名、设置参数是否必须,以及默认值
@RequestMapping(value = '/baseType')
@ResponseBody //返回值放到Response的body区
public String baseType(@RequestParam('age') int age){
//使用int类型,如果给请求添加age值,则会报错
//使用Int eger包装类型不会报错,显示null
return 'age:'+age;
}
@RequestMapping(value = '/WrapType')
@ResponseBody
public String baseType(Integer age){
return 'age:'+age;
}
二、重要笔记
1.数组
//数组绑定/arrayType?name=tom&name=lucy
@RequestMapping('/arrayType')
@ResponseBody
public String array(String[] name){
StringBuilder sb=new StringBuilder();
for (String item :name){
sb.append(item).append(' ');
}
return sb.toString();
}
2. 对象
//todo 对象绑定/objectType?name=tom&age=10
//todo 复合对象
///objectType?name=tom&age=10&contactinfo.phone=10086&contactinfo.address=china
//todo 属性的多个对象/objectType?user.name=tom&age=10
@RequestMapping('/objectType')
@ResponseBody
public String object(User user, Admin admin){
return user.toString()+' '+admin.toString();
}
@InitBinder('user')
public void initUser(WebDataBinder binder){
binder.setFieldDefaultPrefix('user.');
}
@InitBinder('admin')
public void initAdmin(WebDataBinder binder){
binder.setFieldDefaultPrefix('admin.');
}
3. 集合类型
List
//todo 集合数据绑定
//todo 数据收集对象UserListForm,绑定的是里面的users对象
//todo/list?users[0].name=tom&users[1].name=lucy
// 请求索引要连续,不然会浪费很多空间(空对象)
@RequestMapping(value = '/list')
@ResponseBody
public String list(UserListForm userList){
return userList.toString();
}
Set
//todoset的绑定与list的不同,set要初始化size大小,源码里面会判断index与size关系
// set 主要判断重复,在初始化set对象大小之后,重写hashcode和equals方法,空对象1个,size为1
// /set?users[0].name=tom&users[1].name=lucy
@RequestMapping(value = '/set')
@ResponseBody
public String set(UserSetForm userSet){
return userSet.toString();
}
Map
//todo/map?users['x'].name=tom&users['y'].name=lucy
@RequestMapping(value = '/map')
@ResponseBody
public String map(UserMapForm userMap){
return userMap.toString();
}
4. Json数据
在maven配置文件中加入jackson-databind的jar包依赖支持对json的解析
//todo json绑定 Content-Type:application/json
// {
// 'name':'tom',
// 'age':10,
// 'contactInfo':{
// 'address':'shenzhen',
// 'phone':10086
// }
//}
@RequestMapping(value = '/json')
@ResponseBody
public String json(@RequestBody User user){
return user.toString();
}
5. XML
//todo xml绑定 需要加入spring-oxm的jar包以及对象添加xml的注解
//Content-Type:application/xml
//
//
// tom
// 10
//
@RequestMapping(value = '/xml')
@ResponseBody
public String xml(@RequestBody Admin admin){
return admin.toString();
}
对Admin类的修改:
package kay.model;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name='admin') //xml根节点
public class Admin{
private String name;
private String age;
@Override
public String toString() {
return 'Admin{' +
'name='' + name +'\''+
', age='' + age +'\''+
'}';
}
@XmlElement(name='name') //xml属性节点
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name='age') //xml属性节点
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
6. 数据格式转换
 Spring支持的数据格式转换的三种接口
以Date类型为例:
第一种方式,使用PropertyEditor的实现类,使用CustomDateEditor这个类进行类型绑定
此方式配置的格式转换只在当前controller类中对一个属性生效
//todo 日期转换 /dateType?date1=2017-07-05
@RequestMapping(value = '/dateType')
@ResponseBody
public String date1(@RequestParam('date1') Date date1){
return date1.toString();
}
//todo 局部有效,只在这个controller里面
@InitBinder('date1')
public void initDate1(WebDataBinder binder){
binder.registerCustomEditor(Date.class,new CustomDateEditor(newSimpleDateFormat(
'yyyy-MM-dd'),true));
}
第二种方式,实现Formatter接口,并在配置文件中配置bean对象
public class MyDateFormatter implements Formatter{
public Date parse(String s, Locale locale) throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat('yyyy-MM-dd');
return sdf.parse(s);
}
public String print(Date date, Locale locale) {
return null;
}
}
配置:
第三种,实现Converter接口,并在配置文件中配置bean
public class MyDateConverter implements Converter{
public Date convert(String s) {
SimpleDateFormat simpleDateFormat=newSimpleDateFormat('yyyy-MM-dd');
try {
return simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
配置和上一种方法类似
从Formatter接口和Converter接口的实现来看,Formatter只能从String类型转换,而Converter接口可以定义从任何类型转换成想要的类型。
7.表单标签库
表单标签库包含了可以用在JSP页面中渲染HTML元素的标签。为了使用这些标签,必须在JSP页面的开头处声明这个taglib指令。
<%@taglib prefix='form'uri='http://www.springframework.org/tags/form'%>
(1)表单标签
commandName属性或许是其中最重要的属性,因为它定义了模型属性的名称,其中包含了一个backingobject,其属性将用于填充所生成的表单。如果该属性存在,则必须在返回包含该表单的视图的请求处理方法中添加相应的模型属性。
BookAddForm.jsp
<form:form commandName='book'action='book_save' method='post'>
...
</form:form>
BookController类中的inputBook方法,是返回BookAddForm.jsp的请求处理方法。
@RequestMapping(value = '/book_input')
public String inputBook(Model model) {
...
model.addAttribute('book', new Book());
return'BookAddForm';
}
此处用book属性创建了一个Book对象,并添加到Model。如果没有Model属性,BookAndForm.jsp页面就会抛出异常,因为表单标签无法找到在其commandName属性中指定的formbacking object。
(2)input标签
input标签渲染<inputtype='text'/>元素。这个标签最重要的属性是path,它将这个输入字段绑定到formbacking object的一个属性。
input标签也可以绑定到嵌套对象的属性。
<form:inputpath='category.id'/>
(3)password标签
password标签渲染<inputtype='password'/>元素。password标签与input标签相似,只不过它有一个showPassword属性(表示应该显示或遮盖密码)。
(4)hidden标签
hidden标签渲染<inputtype='hidden'/>元素。
(5)textarea标签
textarea基本上就是一个支持多行输入的input元素。
(6)checkbox标签
checkbox标签渲染<inputtype='checkbox'/>元素。
(7)radiobutton标签
radiobutton标签渲染<inputtype='radio'/>元素。
Computing Now <form:radiobuttonpath='newsletter' value='ComputingNow'/><br/>
Modern Health <form:radiobutton path='newsletter'value='Modern Health'/>
(8)checkboxes标签
checkboxes标签渲染多个<inputtype='checkbox'/>元素。
<form:checkboxes path='category'items='${categoryList}'/>
(9)radiobuttons标签
radiobuttons标签渲染多个<inputtype='radio'/>元素。
<form:radiobuttons path='category'items='${categoryList}'/>
1
每次只能选择一个单选按钮。
(10)select标签
select标签渲染一个HTML的select元素。被渲染元素的选项可能来自赋予其items属性的一个Collection、Map、Array,或者来自一个嵌套的option或者options标签。
<form:select id='category'path='category.id' items='${categories}'
itemLabel='name' itemValu5e='id' />
(11)option标签
<form:select id='category' path='category.id'items='${categories}'
itemLabel='name' itemValue='id'>
<option value='0'>---Pleaseselect---</option>
</form:select>
(12)options标签
(13)errors标签
error标签渲染一个或者多个HTML的span元素,每个span元素中都包含一个字段错误。这个标签可以用于显示一个特定的字段错误,或者所有字段错误。
<form:errorspath='*'/>
<form:errors path='author'/>
三、学习参考
https://m.2cto.com/kf/201707/654979.html
https://blog.csdn.net/slowly_come_faster


猜你喜欢

转载自blog.csdn.net/xy123456789123/article/details/79976149