1.绑定的机制
我们都知道,表单中请求参数都是基于
key=value
的。
SpringMVC
绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
例如:
<
a
href
=
"account/findAccount?accountId=10"
>
查询账户
</
a
>
中请求参数是:
accountId=10
/**
*
查询账户
*
@return
*/
@RequestMapping
(
"/findAccount"
)
public
String findAccount(Integer
accountId
) {
System.
out
.println(
"
查询了账户。。。。
"
+
accountId
);
return
"success"
;
}
2.支持的数据类型:
基本类型参数:
包括基本类型和
String
类型
POJO
类型参数:
包括实体类,以及关联的实体类
数组和集合类型参数:
包括
List
结构和
Map
结构的集合(包括数组)
SpringMVC
绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
如果是基本类型或者
String
类型:
要求我们的参数名称必须和控制器中方法的形参名称保持一致。
(
严格区分大小写
)
如果是
POJO
类型,或者它的关联对象:
要求表单中参数名称和
POJO
类的属性名称保持一致。并且控制器方法的参数类型是
POJO
类型。
如果是集合类型
,
有两种方式:
第一种:
要求集合类型的请求参数必须在
POJO
中。在表单中请求参数名称要和
POJO
中集合属性名称相同。
给
List
集合中的元素赋值,使用下标。
给
Map
集合中的元素赋值,使用键值对。
第二种:
接收的请求参数是
json
格式数据。需要借助一个注解实现。
使用示例
1
基本类型和
String
类型作为参数
jsp
代码:
<!--
基本类型示例
-->
<
a
href
=
"account/findAccount?accountId=10&accountName=zhangsan"
>
查询账户
</
a
>
控制器代码:
/**
*
查询账户
*
@return
*/
@RequestMapping
(
"/findAccount"
)
public
String findAccount(Integer
accountId
,String
accountName
) {
System.
out
.println(
"
查询了账户。。。。
"
+
accountId
+
","
+
accountName
);
return
"success"
;
}
2 POJO
类型作为参数
实体类代码:
/**
*
账户信息
*
@author
黑马程序员
*
@Company
http://www.ithiema.com
*
@Version
1.0
*/
public class
Account
implements
Serializable {
private
Integer
id
;
private
String
name
;
private
Float
money
;
private
Address
address
;
//getters and setters
}
/**
*
地址的实体类
*
@author
黑马程序员
*
@Company
http://www.ithiema.com
*
@Version
1.0
*/
public class
Address
implements
Serializable {
private
String
provinceName
;
private
String
cityName
;
//getters and setters
}
jsp
代码:
<!-- pojo
类型演示
-->
<
form
action
=
"account/saveAccount"
method
=
"post"
>
账户名称:
<
input
type
=
"text"
name
=
"name"
><
br
/>
账户金额:
<
input
type
=
"text"
name
=
"money"
><
br
/>
账户省份:
<
input
type
=
"text"
name
=
"address.provinceName"
><
br
/>
账户城市:
<
input
type
=
"text"
name
=
"address.cityName"
><
br
/>
<
input
type
=
"submit"
value
=
"
保存
"
>
</
form
>
控制器代码:
/**
*
保存账户
*
@param
account
*
@return
*/
@RequestMapping
(
"/saveAccount"
)
public
String saveAccount(Account
account
) {
System.
out
.println(
"
保存了账户。。。。
"
+
account
);
return
"success"
;
}
3 POJO
类中包含集合类型参数
实体类代码:
/**
*
用户实体类
*
@author
黑马程序员
*
@Company
http://www.ithiema.com
*
@Version
1.0
*/
public class
User
implements
Serializable {
private
String
username
;
private
String
password
;
private
Integer
age
;
private
List<Account>
accounts
;
private
Map<String,Account>
accountMap
;
//getters and setters
@Override
public
String toString() {
return
"User [username="
+
username
+
", password="
+
password
+
", age="
+
age
+
",\n accounts="
+
accounts
+
",\n accountMap="
+
accountMap
+
"]"
;
}
}
jsp
代码:
<!-- POJO
类包含集合类型演示
-->
<
form
action
=
"account/updateAccount"
method
=
"post"
>
用户名称:
<
input
type
=
"text"
name
=
"username"
><
br
/>
用户密码:
<
input
type
=
"password"
name
=
"password"
><
br
/>
用户年龄:
<
input
type
=
"text"
name
=
"age"
><
br
/>
账户
1
名称:
<
input
type
=
"text"
name
=
"accounts[0].name"
><
br
/>
账户
1
金额:
<
input
type
=
"text"
name
=
"accounts[0].money"
><
br
/>
账户
2
名称:
<
input
type
=
"text"
name
=
"accounts[1].name"
><
br
/>
账户
2
金额:
<
input
type
=
"text"
name
=
"accounts[1].money"
><
br
/>
账户
3
名称:
<
input
type
=
"text"
name
=
"accountMap['one'].name"
><
br
/>
账户
3
金额:
<
input
type
=
"text"
name
=
"accountMap['one'].money"
><
br
/>
账户
4
名称:
<
input
type
=
"text"
name
=
"accountMap['two'].name"
><
br
/>
账户
4
金额:
<
input
type
=
"text"
name
=
"accountMap['two'].money"
><
br
/>
<
input
type
=
"submit"
value
=
"
保存
"
>
</
form
>
控制器代码:
/**
*
更新账户
*
@return
*/
@RequestMapping
(
"/updateAccount"
)
public
String updateAccount(User
user
) {
System.
out
.println(
"
更新了账户。。。。
"
+
user
);
return
"success"
;
}
4
请求参数乱码问题
post
请求方式:
在
web.xml
中配置一个过滤器
<!--
配置
springMVC
编码过滤器
-->
<
filter
>
<
filter-name
>
CharacterEncodingFilter
</
filter-name
>
<
filter-class
>
org.springframework.web.filter.CharacterEncodingFilter
</
filter-class
>
<!--
设置过滤器中的属性值
-->
<
init-param
>
<
param-name
>
encoding
</
param-name
>
<
param-value
>
UTF-8
</
param-value
>
</
init-param
>
<!--
启动过滤器
-->
<
init-param
>
<
param-name
>
forceEncoding
</
param-name
>
<
param-value
>
true
</
param-value
>
</
init-param
>
</
filter
>
<!--
过滤所有请求
-->
<
filter-mapping
>
<
filter-name
>
CharacterEncodingFilter
</
filter-name
>
<
url-pattern
>
/*
</
url-pattern
>
</
filter-mapping
>
在
springmvc
的配置文件中可以配置,静态资源不过滤:
<!-- location
表示路径,
mapping
表示文件,
**
表示该目录下的文件以及子目录的文件
-->
<mvc:resources
location
=
"/css/"
mapping
=
"/css/**"
/>
<mvc:resources
location
=
"/images/"
mapping
=
"/images/**"
/>
<mvc:resources
location
=
"/scripts/"
mapping
=
"/javascript/**"
/>