1 | Spring MVC入门学习(四) |
在SpringMVC框架中需要收集用户请求参数, 并将请求参数传递给应用的控制器组件. 此时存在一个问题, 即所有的请求参数类型只能是字符串数据类型, 但java是强类型语言, 所以Spring MVC框架必须将这些字符串请求参数转换成相应的数据类型.
SpringMVC框架不仅提供了强大的类型转换和格式化机制, 而且开发者还可以方便地开发自己的类型转换器和格式化转换器.
Converter
Spring MVC框架的Converter<S, T>是一个可以将一种数据类型转换成另一种数据类型的接口, 这里的S表示源类型, T表示目标类型. 开发者在实际应用中使用框架内置的类型转换器基本上就够了, 但有时需要编写具有特定功能的类型转换器.
- 标量转换器
- 集合、数组相关转换器
类型转换是在视图和控制器相互传递数据时发生的. Spring MVC 框架对于基本类型已经做好了基本类型转换.
例如下面的这个例子, spring mvc默认将基本类型进行 了转换
web.xml的配置不再赘述
springmvc-servlet.xml, 配置注解
index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<%--
Created by 年少、.
User: nianshao
Date: 19-11-9
Time: 下午2:05
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta charset="UTF-8">
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/index/buy">
商品名称: <input type="text" name="name"><br>
商品价格: <input type="text" name="price"><br>
商品数量: <input type="text" name="number"><br>
<input type="submit" value=提交""><br>
</form>
</body>
</html>BuyController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package cn.lacknb;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
"/index") (
public class BuyController {
"/buy") (
public String buy(String name, double price, int number){
System.out.println("商品名字:" + name);
System.out.println("商品价格:" + price);
System.out.println("商品数量:" + number);
return "/success.jsp";
}
}在使用内置类型转换器时, 请求参数输入值与接收参数类型要兼容, 否则会报400错误. 请求参数类型与接收参数类型不兼容问题需要学习输入校验后才可解决.
自定义类型转换器
例如有一个应用希望用户在页面表单中输入信息来创建商品信息, 当输入 “apple, 10.58 ,200”时,表示在程序中会自动创建一个new Goods(商品实体类), 并将apple值自动赋给goodsname属性…
例子
创建实体类 goodsModel
1 | package cn.lacknb.beans; |
创建控制类
1 | package cn.lacknb.controller; |
创建自定义类型转换器
1 | package cn.lacknb.converter; |
springmvc-servlet.xml
1 |
|
index.jsp
1 | <%-- |
showGoods.jsp
1 | <%-- |
Formatter
Spring NVC框架的Formatter
内置的格式化转换器
自定义格式化转换器
Formatter
1 | public T parse(String s, java.util.Locale locale); |
parse方法的功能是利用指定的Locale讲一个String类型转换成目标类型, print方法与之相反. 用户返回目标对象的字符串表示.
例子
创建实体类
GoodModelb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52package cn.lacknb.beans;
import java.util.Date;
public class GoodsModelb {
private String goodsname;
private double goodsprice;
private int goodsnumber;
private Date goodsdate;
public Date getGoodsdate() {
return goodsdate;
}
public void setGoodsdate(Date goodsdate) {
this.goodsdate = goodsdate;
}
public String getGoodsname() {
return goodsname;
}
public void setGoodsname(String goodsname) {
this.goodsname = goodsname;
}
public double getGoodsprice() {
return goodsprice;
}
public void setGoodsprice(double goodsprice) {
this.goodsprice = goodsprice;
}
public int getGoodsnumber() {
return goodsnumber;
}
public void setGoodsnumber(int goodsnumber) {
this.goodsnumber = goodsnumber;
}
public String toString() {
return "GoodsModel{" +
"goodsname='" + goodsname + '\'' +
", goodsprice=" + goodsprice +
", goodsnumber=" + goodsnumber +
'}';
}
}
创建控制类
FormatterController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package cn.lacknb.controller;
import cn.lacknb.beans.GoodsModelb;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
"/index") (
public class FormatterController {
"/buy") (
public String buy(GoodsModelb goodsModelb, Model model){
model.addAttribute("goods", goodsModelb);
return "/showGoods.jsp";
}
}
创建自定义格式化转换器类
GoodsFormatter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29package cn.lacknb.converter.formatter;
import org.springframework.format.Formatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class GoodsFormatter implements Formatter<Date> {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
public Date parse(String s, Locale locale) throws ParseException {
return dateFormat.parse(s); // Formatter只能对字符串进行转换
}
/*
* SimpleDateFormat 中有两个方法parse()个format()
* parse() 是将字符串转换成Date类型
* format() 是将date类型转成字符串类型
*
* */
public String print(Date date, Locale locale) {
return dateFormat.format(date);
}
}
注册格式化转换器
1 | <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> |
创建相关视图
index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<%--
Created by 年少、.
User: nianshao
Date: 19-11-9
Time: 下午4:19
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta charset="UTF-8">
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/index/buy" method="post">
商品名称: <input type="text" name="goodsname"/><br>
商品价格: <input type="text" name="goodsprice"/><br>
商品数量: <input type="text" name="goodsnumber"/><br>
商品日期: <input type="text" name="goodsdate"/>(yyyy-mm-dd)<br>
<input type="submit" value="提交"/><br>
</form>
</body>
</html>showGoods.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<%--
Created by 年少、.
User: nianshao
Date: 19-11-9
Time: 下午2:36
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta charset="UTF-8">
<head>
<title>Title</title>
</head>
<body>
商品名称为: ${goods.goodsname}<br>
商品价格为: ${goods.goodsprice}<br>
商品数量为: ${goods.goodsnumber}<br>
商品日期为: ${goods.goodsdate}
</body>
</html>
数据绑定和表单标签库
有了数据绑定之后就不再需要手动将Http请求中的String类型转换为模型需要的类型. 数据绑定的另一个好处就是当输入验证失败时会重新生成一个HTML表单, 无须重新填写输入字段.
数据绑定
在SpringMVC中框架中数据绑定有这样几层含义: 绑定请求参数输入值到领域模型、模型数据到视图的绑定(输入验证失败时)、模型数据到表单元素的绑定.
表单标签库
一定要导入jstl的jar包
首先必须在jsp页面开头处声明taglib命令
1 | <%@ taglib prefix="form" url="http://www.springframework.org/form" %> |
表单标签
………………………………………