从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上
springmvc中,接收页面的提交的数据的是通过方法形参来接收的,而不是在controller类定义成员变量接收
客户端:key/value
处理器适配器调用springmvc提供的参数绑定组件将key/value数据转成controller方法的形参,
参数绑定组件,早期适应propetyEditor(只能将字符串转成java对象),后期使用converter(进行任意类型的转换)
通常情况springmvc提供了很多的converter(转换器),特殊情况下需要自定义converter
如:后端不知时间是1999/0908 还是1999-09-09,如日期数据的绑定。
凡是形参的东西都是形参里定义的东西
默认支持类型:
model,request,response,httpsession(session),model, modelMap(它是model接口的实现类,通过model或modelmap向页面传递数据)
直接在controller方法形参上定义下边的类型对象,就可使用。在参数绑定的过程中,适配器回调组件,通过java反射判断形参类型,若是默认的一种,(底层DispatcherServlet已拿到客户端发来的形参的数据,若是这么一个东西,默认类型,就将DispatcherServlet里的数据赋值给形参里参数。
定义modelmap(modle接口的实现类,内部的for循环赋值后的map集合)与model(接口)是一样的,
作用:将model数据填充到request数据域)
简单类型绑定:
@RequestMapping("/editItems")
public String editItems(Model model,Integer id) throws Exception {
//model要调用service获取
ItemsCustom itemsCustom=itemsService.finItemById(id);
这里的controller的形参id必须要和request传入参数名称一致
使用了@RequestParam,则二者的参数可以不一致。用法如下:
@RequestMapping("/editItems")
public String editItems(Model model,@RequestParam (value = "id",required=true)Integer my_id,@RequestParam (value = "name")Integer my_name) throws Exception {
//model要调用service获取
ItemsCustom itemsCustom=itemsService.finItemById(my_id,my_name);
还可通过required=true属性指定其是否必传,通过defaultvalue设置默认值(比较常用,比如默认指定商品类型为“水果”,当没有值时,就按水果查,或不指定时,默认加载时,也用水果查)
get,post请求中文参数出现乱码解决:
web.xml中添加全局字符过滤器:
<!-- 这是解决post提交乱码问题的解决方案-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.post表单提交乱码,可在tomcat的配置文件中加上<Connector URIEncoding="utf-8" connectionTimeout="20000"....../>
2.另一种对方法参数重新编码 String username new String(request.getParameter("username").getBytes("ISO8859-1"),"utf-8") ISO8859-1是tomcat默认编码,需将tomcat编码后的内容按utf-8再次编码
pojo绑定,前提是页面中的<input>的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo
controller的形参的类型与它一致,才会映射成功:用法如下:
@RequestMapping("/editItems")
public String editItems(Model model,Integer id,ItemsCustom itemsCustom) throws Exception {
//调用service更新商品信息,页面需要将商品信息传到此方法
// 写service的人看到缺id,但根据接口,就知道要向editItems中添加id
//id是简单类型的绑定,ItemsCustom是pojo类型的绑定
itemsService.updateItems(id,itemsCustom);
return "success";
2.查询商品controller方法中实现商品查询条件传入:
2.1在形参中添加HttpservletRequest参数,通过request接收查询条件参数
2.2在形参中让包装类型的pojo接收查询条件的参数
(包装类型pojo参数类型绑定:)
分析---页面传参复杂,多样,如用户账号,商品编号,订单信息。。。这就不能放到简单的pojoli(简单pojo就是里面的类型是简单类型,int,string...包含List<?>集合类的就不是简单类型)
页面参数:商品名称。
<td>商品名称<input type="submit" value="itemsCustom.name"></td>
注意:itemsCustom和包装pojo中的属性一致即可
@RequestMapping(value = "/editItemsSubmit",method = {RequestMethod.POST})
public ModelAndView editItemsSubmit(HttpServletRequest request, Integer id,ItemsCustom itemsCustom,Use user)throws Exception{
itemsService.updateItems(id,itemsCustom,user );
上面带码中,商品中的name,可能会和user中的name重复,会造成问题,不利于程序的拓展,最好写成:pojo包装类:
@RequestMapping(value = "/editItemsSubmit",method = {RequestMethod.POST})
public ModelAndView editItemsSubmit(HttpServletRequest request,Interger id,ItemsQueryVo itemsQueryVo)throws Exception{
itemsService.updateItems(id,itemsQueryVo );
集合类型(数组绑定):举个用户批量删除商品的例子:
表现层,将页面多选的id,传到形参,方法形参使用数组来来接收页面请求的多个商品的id
页面定义,商品页面定义