什么是参数绑定:从客户端请求key/value数据,经过参数绑定,将key/value绑定在controller方法的形参上
springmvc中,接受页面提交的数据通过方法的形参来接受,而不是在controller类定义成员
springmvc实现使用了参数绑定组件,现在使用converter。springmvc中提供了很多converter,但是当我们自己需要conveter时还是要自己定义。
SpringMVC 有支持的默认参数类型,我们直接在形参上给出这些默认类型的声明,就能直接使用了。如下:
①、HttpServletRequest 对象
②、HttpServletResponse 对象
③、HttpSession 对象
④、Model/ModelMap 对象 Model是一个接口,ModelMap是一个接口实现(两个差不多) ,作用是将Model数据填充到request域
public String selectTwo(Model model,HttpServletRequest request) throws IOException {
List<UserShopCustom> userShopCustom=userService.findUserById();
model.addAttribute("userShopCustom", userShopCustom);//相当于把model的数据存储起来,最后交给jsp页面
return "redirect:select.action"; //重定向
//return forward:select.action//页面转发,转发后的request和response可以公用
}
譬如这段代码,这些形参类型都是springmvc自带的可以直接使用
还可以存储简单数据类型:
public ModelAndView selectThree(Model model,Integer id) throws IOException {
List<UserShopCustom> userShopCustom=userService.findUserById();
System.out.println(userShopCustom);
ModelAndView modelAndView =new ModelAndView();
modelAndView.addObject("userShopCustom", userShopCustom);
modelAndView.setViewName("user/userList");
return modelAndView;
}
这里存储了基础类型Integer类型的参数id,这里有一个约束,就是传入的数据的名字必须和形参里的名字相同才能完成参数的传递。
但是如果传入的数据名称和参数名称想要不同,通过下面的参数绑定即可实现。
public ModelAndView selectThree(Model model,@RequestParam(value="id",required=true,defaultValue="")Integer id_1) throws IOException {
List<UserShopCustom> userShopCustom=userService.findUserById();
System.out.println(userShopCustom);
ModelAndView modelAndView =new ModelAndView();
modelAndView.addObject("userShopCustom", userShopCustom);
modelAndView.setViewName("user/userList");
return modelAndView;
}
这里面的使用了@RequestParam这个注解,里面的参数value为传入的数据name,id_1为参数名,requeired是否为必须传入,没传会报错,defaultValue为默认值
接下来当然要传入pojo类型的值。
public ModelAndView selectFour(Integer id,UserCustom userCustom) throws IOException {
List<UserShopCustom> userShopCustom=userService.findUserById();
System.out.println(userShopCustom);
ModelAndView modelAndView =new ModelAndView();
modelAndView.addObject("userShopCustom", userShopCustom);
modelAndView.setViewName("user/userList");
return modelAndView;
}
传来的数据会根据pojo UserCustom中的每个属性的名称和传入数据的名称匹配进行赋值
当形参中有一个基础类型的名称和UserCustom中的某个名称相同,那么会自动将所有pojo类和基础类型名称都赋值
但是当有些数据类型springmvc自带的converter无法解析时,我们需要自己定义converter。
接下来流程如下:
//string类型转为Date类型,需要实现converter接口,里面的泛型第一个为传入,第二个为传出
public class DateConverter implements Converter<String,Date>{
public Date convert(String source) {
//实现将日期串转为日期类型(格式是yyyy-MM-dd HH:mm:ss)
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(source);//转换成功直接返回
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
自定义的类需要实现converter接口,里面的泛型第一个为传入类型,第二个为传出类型。
第二步时在springmvc.xml文件中配置
首先我们之前配置的注解映射器和注解适配器里需要加入一个bean来实现注册自定义的converter
<mvc:annotation-driven conversion-service="conversionService"> </mvc:annotation-driven>
接下来注册我们自己写的的converter到这个bean中,这个bean的id必须和上面的conversion-service属性值相同,才能注入到这个适配器
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean.class"> <property name="converts"> <list> <!-- 注册日期类型的转换 --> <!--这个class存储自定义的bean的限定名--> <bean class="com.ssm.controller.convert.DateConverter" ></bean>// </list> </property></bean>
这样就可以使用这个自定义的converter了
包装类型pojo
如果要获得一个包装类型pojo里面的属性pojo在页面传入的数据name要与包装类型pojo里的属性pojo名称相同,在后端接受包装类型的pojo属性就行了。没有被赋值的会设为空。
数组类型
如果要传入一个数组类型,只需要前台传入的数据和后天接受的数据的属性名称相同即可。假设这个数组类型被包装在pojo包装类型中。也只需要名称相同就好了
List属性:
如果要传入一个list属性,那么需要前台传入的数据和后天接受的数据的属性名称相同即可,但是在前台要存入的时list存入的pojo类型的多个属性。那么需要list名.[下标].对应list里存的pojo里的属性 这种格式来存储
map类型
map类型和list相同,只是在前台传入数据时name=map属性名【key(pojo的属性名)】会将前台的value自动绑定到夏官营的key
参考:https://blog.csdn.net/eson_15/article/details/51718633
谢谢这位博主