SpringMVC学习记录五——功能开发及参数处理 15       包装类型pojo参数绑定 16      集合类型绑定 17       springmvc校验 18      数据回显

SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

15.1      需求

         商品查询controller方法中实现商品查询条件传入。

15.2      实现方法

第一种方法:在形参中 添加HttpServletRequest request参数,通过request接收查询条件参数。

第二种方法:在形参中让包装类型的pojo接收查询条件参数。

         分析:

         页面传参数的特点:复杂,多样性。条件包括 :用户账号、商品编号、订单信息。。。

         如果将用户账号、商品编号、订单信息等放在简单pojo(属性是简单类型)中,pojo类属性比较多,比较乱。

         建议使用包装类型的pojo,pojo中属性是pojo。

15.3      页面参数和controller方法形参定义

页面参数:

         商品名称:<input name="itemsCustom.name" />

         注意:itemsCustom和包装pojo中的属性一致即可。

controller方法形参:

         public ModelAndView queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo) throws Exception

SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

16      集合类型绑定

16.1      数组绑定

16.1.1     需求

商品批量删除,用户在页面选择多个商品,批量删除。

16.1.2     表现层实现

关键:将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商品id。

controller方法定义:

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

页面定义:

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

16.2      list绑定

16.2.1     需求

通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中,比如:成绩录入(录入多门课成绩,批量提交),

本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。

16.2.2     表现层实现

controller方法定义:

         1、进入批量商品修改页面(页面样式参考商品列表实现)

         2、批量修改商品提交

         使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list<pojo>属性

SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

页面定义:

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

16.3      map绑定

也通过在包装pojo中定义map类型属性。

在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。

包装类中定义Map对象如下:

Public class QueryVo {

private Map<String, Object> itemInfo = new HashMap<String, Object>();

  //get/set方法..

}

页面定义如下:

<tr>

<td>学生信息:</td>

<td>

姓名:<inputtype="text"name="itemInfo['name']"/>

年龄:<inputtype="text"name="itemInfo['price']"/>

.. .. ..

</td>

</tr>

Contrller方法定义如下:

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{

System.out.println(queryVo.getStudentinfo());

}

17       springmvc校验

17.1      校验理解

项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。

服务端校验:

         控制层conroller:校验页面请求的参数的合法性。在服务端控制层conroller校验,不区分客户端类型(浏览器、手机客户端、远程调用)

         业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。

         持久层dao:一般是不校验的。

17.2      springmvc校验需求

springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。

校验思路:

         页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。

具体需求:

         商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。

17.3      环境准备

hibernate的校验框架validation所需要jar包:

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.4      配置校验器

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.5      校验器注入到处理器适配器中

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.6      在pojo中添加校验规则

在ItemsCustom.java中添加校验规则:

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.7      CustomValidationMessages.properties

在CustomValidationMessages.properties配置校验错误信息:

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.8      捕获校验错误信息

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

//在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult接收校验出错信息

   //注意:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。

17.9      在页面显示校验错误信息

在controller中将错误信息传到页面即可。

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

页面显示错误信息:

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.10      分组校验

17.10.1     需求

在pojo中定义校验规则,而pojo是被多个 controller所共用,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。

解决方法:

定义多个校验分组(其实是一个java接口),分组中定义有哪些规则

每个controller方法使用不同的校验分组

17.10.2     校验分组

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.10.3     在校验规则中添加分组

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

17.10.4     在controller方法使用指定分组的校验

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

18      数据回显

18.1      什么数据回显

提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面。

18.2      pojo数据回显方法

1、springmvc默认对pojo数据进行回显。

pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)

使用@ModelAttribute指定pojo回显到页面在request中的key

2、@ModelAttribute还可以将方法的返回值传到页面

在商品查询列表页面,通过商品类型查询商品信息。

在controller中定义商品类型查询方法,最终将商品类型传到页面。

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

页面上可以得到itemTypes数据。

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

3、使用最简单方法使用model,可以不用@ModelAttribute

 SpringMVC学习记录五——功能开发及参数处理
15       包装类型pojo参数绑定
16      集合类型绑定
17       springmvc校验
18      数据回显

18.3      简单类型数据回显

使用最简单方法使用model。

model.addAttribute("id", id);