SpringMVC参数绑定过程:从客户端请求key/value的数据,经过参数绑定,将key/value的数据绑定管道controller方法的形参中。
在SpringMVC中,接收页面提交的数据时,通过方法形参来接收,而不是controller类定义成员变量来接收。
流程:
客户端请求key/value数据 >> 处理器适配器调用SpringMVC提供参数绑定组件将key/value数据转成controller方法的形参(参数绑定组件:在springmvc早期版本中使用PropertyEditor只能将字符串转成Java对象;后期使用converter可以进行任意类型的转换)。springmvc提供了很多converter转换器,在特殊情况下需要自定义converter(如对日期数据绑定需要自定义converter)>> 调用controller方法(形参)
参数绑定默认支持的类型:
如要使用参数帮i的那个默认支持的类型,只需要直接在controller方法形参中定义默认支持的类型对象即可。这些对象就是在参数绑定的过程中,适配器如需要默认支持的类型直接进行绑定。
HttpServletRequest:通过request对象获取请求信息。
HttpServletResponse:通过response处理响应信息。
HttpSession:通过session对象得到session中存放的对象。
Model/ModelMap:Model是一个接口,ModelMap是一个接口实现。它们的作用就是将model模型数据填充到request域。
参数绑定简单类型:
通过@RequestParam对简单类型的参数进行绑定。若不使用@RequestParam,要求request传入参数名称和controller方法的参数名称保持一致。若使用@RequestParam,不限制request参数参数名称和controller方法的形参名称一致。
//如:请求url http://localhost/springmvc_projectname/goods/query.action?id=1 @RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST}) public String query1(Model model,Integer id)throws Exception{ } @RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST}) public String query2(Model model,@RequestParam(value="id") Integer goods_id)throws Exception{ //@RequestParam中指定request传入参数名称id和形参good_id进行绑定 } @RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST}) public String query3(Model model,@RequestParam(value="id"required=true) Integer goods_id)throws Exception{ //若在@RequestParam中指定required属性,则表示指定参数是否必须要传入。true时,若没有该参数则会报错。 } @RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST}) public String query(Model model,@RequestParam(value="id",required=true,defaultValue="") Integer goods_id)throws Exception{ //在@RequestParam中还可以指定defaultValue属性来设置默认值,当required=true且id没有传入时,将默认值和形参绑定。 }
参数绑定pojo类型:
页面中input标签的name属性值和controller的pojo形参中的属性名称一致。才可以将页面中的数据绑定到pojo中。
参数绑定包装类型pojo:
页面中input标签的name属性值和controller的形参包装类型pojo中的普通pojo的属性名称保持一致。才可以将页面中的数据帮i的那个到pojo中。该页面中input标签的name属性值的表现形式为:pojo类型.属性名.属性名......
参数绑定数组类型:
如、复选框。
controller形参中数组变量名要和页面中name值保持一致。
参数绑定List类型:
使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list属性。页面name属性对应包装pojo中的 list属性名[下标].包装pojo中list类型属性中的pojo属性名。
自定义参数绑定:
实现日期类型绑定,对于controller形参中pojo对象,若属性中有日期类型,需要自定义参数绑定。将请求日期数据串转成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。所以自定义参数绑定将日期串转成java.util.Date类型,需要向处理器适配器中注入自定义参数绑定组件。
配置方式:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 自定义参数绑定 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <!-- 转换器 --> <property name="converter"> <list> <!-- 日期类型转换 --> <bean class="cn.ccir.springmvctest.converter.CustomDateConverter"/> <bean class="自定义类型转换器类路径"/> </list> </property> </bean>
自定义日期转换器需要实现Converter<S,T>接口。
public class CustomDateConverter implements Converter<String,Date>{ public Date convert(String source){ //将日期串转成日期类型,格式:yyyy-MM-dd HH:mm:ss SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try{ return sdf.parse(source); }catch(ParseException pe){ pe.printStackTrace(); } return null; } }
SpringMVC中POST提交中文乱码:
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>