SpringMVC封装表单数据
- 基础数据
- @RequestParam别名
- 对象数据
- VO对象
- Map
- 数组
- list
基础数据的封装
//表单
<form action="reg1.action" method="post">
<input type="text" name="name" value=""/>
<input type="text" name="id" value=""/>
<input type="submit" value="登录">
</form>
//测试类
@RequestMapping("/reg1.action")
public String reg1(User user) {
System.out.println(user);
return "result";
}
@RequestMapping("/reg2.action")
public String reg2(String name) {
System.out.println(name);
return "result";
}
@RequestMapping("/reg3.action")
public String reg3(@RequestParam(value="name")String username) {
System.out.println(username);
return "result";
}
//User类,省略get、set
public class User {
private String name;
}
- 上面的三个测试代码分别介绍了三种情况:
- 普通数据
- 别名数据
- 对象
- 注意事项:
- 我们封装的时候,传入的参数必须要和表单的“name”属性一致
- 如果封装的对象,对象的属性名必须和“name”属性一致,如果不一致,则为null
VO对象
//表单
<form action="reg4.action" method="post">
<input type="text" name="name" value=""/>
<input type="text" name="id" value=""/>
<input type="submit" value="登录">
</form>
//VO对象,省略get、set
public class UserVo {
private int id;
private User user;
}
//测试类
@RequestMapping("/reg4.action")
public String reg4(UserVo userVo,User user) {
System.out.println(user);
System.out.println(userVo);
userVo.setUser(user);
System.out.println(userVo);
return "result";
}
- 这里的VO对象封装,我们采用的是设置对象的方法
- 首先表单的ID属性会找到我们的VO对象,然后设置值
- 然后表单的name属性会找到我们的User对象,然后设置值
- 最后我们只需要吧user设置给VO就搞定
- 当然,我们也可以吧表单的那么属性改为“user.name”,来和VO类形成完全一致的对应
数组
//表单
<form action="reg5.action" method="post">
<input type="checkbox" name="item" value="苹果">苹果
<input type="checkbox" name="item" value="香蕉">香蕉
<input type="checkbox" name="item" value="梨子">梨子
<input type="submit" value="登录">
</form>
//测试类
@RequestMapping("/reg5.action")
public String reg5(String[] item) {
for (String string : item) {
System.out.println(string);
}
return "result";
}
- 这里的数组也很简单,就是一个单纯的赋值而已
- 我们通过name属性的“item”然后参数接受一样定义成“String[] item”
- 然后name属性和参数的名字一样,就形成了对应,已达到传值的效果
Map
//表单
<form action="reg8.action" method="post">
<input type="text" name="name" value=""/>
<input type="text" name="id" value=""/>
<input type="checkbox" name="item" value="苹果">苹果
<input type="checkbox" name="item" value="香蕉">香蕉
<input type="checkbox" name="item" value="梨子">梨子
<input type="submit" value="登录">
</form>
//测试类
@RequestMapping("/reg6.action")
public String reg7(HttpServletRequest req,@RequestParam Map<String,String> map) {
Map<String, String[]> maplList=req.getParameterMap();
for(String str:maplList.keySet()) {
for (String str1 : maplList.get(str)) {
System.out.println(str+":"+str1);
}
}
System.out.println(map.get("name"));
System.out.println(map.get("id"));
System.out.println(map.get("item"));
return "result";
}
- 我们这里接受map使用了两种方法
- 1.@RequestParam Map<String,String> map 通过注解接受
- 我们通过注解接受的,获取值也相当方便,直接map.get(“XXX”)就可以获取值了
- 但是需要注意,接受name属性值相同的时候,只会获取第一个值,后面的会丢失
- 2.HttpServletRequest req 通过请求对象接受
- 这里我们需要注意,使用对象接受的值不会丢失
- 但是我们接受的类型是Map<String, String[]> ,所以我们需要两次遍历才能获取值
List
关于list的获取,最简单的方法如同前面的VO对象,吧name属性改为“user.name”一样,形成和对象属性的完全一致,但是这个方法有很多BUG,所以这里不再介绍
然而最好的方法是使用json对象接受,使用ajax发送异步请求,并且转换表单数据,这里我会在后面介绍
关于日期的一个转换
我们使用SpringMVC接受表单数据的时候,不能自动吧String转换为Date,所以我们需要手动转换
DateConverter
public class DateConverter implements Converter<String, Date>{
@Override
public Date convert(String arg0) {
// TODO 自动生成的方法存根
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
return simpleDateFormat.parse(arg0);
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
}
Spring配置
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="Converter.DateConverter"></bean>
</list>
</property>
</bean>
<!--启用注解 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
- 这里我们需要注意,我们输入只能输入如同1990-1-1这种格式的
- 如果输入1990/1/1这样是获取不到值的哦,需要小心