1.包装类型pojo参数绑定
(1)需求
商品查询controller方法中实现商品查询条件传入。
(2)实现方法
- 第一种方法:在形参中 添加HttpServletRequest request参数,通过request接收查询条件参数。
- 第二种方法:在形参中让包装类型的pojo接收查询条件参数。建议使用
(3)页面参数和controller方法形参定义
jsp页面的标签的name值和包装pojo中的属性一致即可。
2 集合类型绑定
2.1 数组绑定
(1)需求
商品批量删除,用户在页面选择多个商品,批量删除。(注意不能删除存在外键关联的数据)
(2)实现
- 将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商品id。
- 在service层多次调用itemMapper的delete(id)方法,完成目标
- 最后重定向到查询页面,检查结果
2.2 list绑定
(1)需求
通常在需要批量提交数据时,将提交的数据绑定到list中,比如:成绩录入(录入多门课成绩,批量提交),
本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。
(2)实现
- 进入批量商品修改页面(页面样式参考商品列表实现)
- 批量修改商品提交
- 使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list属性
- 最后对每个商品执行前面的单个商品的更新操作
3. 校验validation
(1)需求:
商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误
(2)流程
- 在springmvc配置校验器和错误信息配置文件
- 新建错误信息配置文件,添加内容
- 在处理器适配器中注入校验器
- 在pojo相应的属性添加校验规则
- 在controller的对应参数添加注解@Validated和bindingResult参数
- 在jsp页面获取相关内容输出
遇到的问题:
properties文件读取乱码,直接写不行,但是配置就可以正常读取
(3)改为分组检验
- 创建不同的分组接口
- 为不同属性的校验规则配置所在组
- 在注解@Validated添加所使用的校验分组
4. 回显
(1)pojo类型-默认回显
可使用@ModelAttribute
指定pojo回显到页面在request中的key
(2)使用@ModelAttribute
将方法的返回值传到request
可在jsp页面直接使用itemtypes
(3)为model设置属性
简单类型的回显只能使用这种方法。
5. 上传图片
(1)配置虚拟目录
在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加:
<Context docBase="F:\develop\upload\temp" path="/pic" reloadable="false"/>
访问http://localhost:8080/pic即可访问F:\develop\upload\temp下的图片。
(2)在springmvc.xml配置解析器
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
(3)jar包
CommonsMultipartResolver解析器依赖commons-fileupload.jar
和commons-io.jar
(4)图片上传controller
//商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Items items, MultipartFile pictureFile)throws Exception{
//原始文件名称
String pictureFile_name = pictureFile.getOriginalFilename();
//新文件名称
String newFileName = UUID.randomUUID().toString()+pictureFile_name.substring(pictureFile_name.lastIndexOf("."));
//上传图片
File uploadPic = new java.io.File("F:/develop/upload/temp/"+newFileName);
if(!uploadPic.exists()){
uploadPic.mkdirs();
}
//向磁盘写文件
pictureFile.transferTo(uploadPic);
(5)jsp页面:
form添加enctype="multipart/form-data"
:
file的name与controller形参一致:
<tr>
<td>商品图片</td>
<td>
<c:if test="${item.pic !=null}">
<img src="/pic/${item.pic}" width=100 height=100 />
<br />
</c:if> <input type="file" name="pictureFile" />
</td>
</tr>
6. 数据交互json
(1)两种情况:
- 1、请求json、输出json。要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。
- 2、请求key/value、输出json。此方法比较常用。
(2)流程
- 导包:
- 配置json转换器:使用<mvc:annotation-driven /> 则不用再配置了
- 编写JSP页面输入内容:
需要引入jquery-1.4.4.min.js
$.ajax()方法详解 - 编写controller:
–@RequestBody
:注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
–@ResponseBody
:用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
7. RESTful支持
(1)需求
定义方法,进行url映射使用REST风格的url(包含id),将查询商品信息的id传入controller .
(2)实现
@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上。
如果RequestMapping中表示为"/ itemsView /{id}",id和形参名称一致,@PathVariable不用指定名称。
8. 拦截器
(1)定义
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
需要实现HandlerInterceptor接口:
public class HandlerInterceptor1 implements HandlerInterceptor{
//进入 Handler方法之前执行
//用于身份认证、身份授权
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
return false;
}
//进入Handler方法之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
//执行Handler完成执行此方法
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
}
(2)全局多个拦截器的执行顺序
- 1.两个拦截器都放行
preHandle方法按顺序执行,
postHandle和afterCompletion按拦截器配置的逆向顺序执行。 - 2.拦截器1放行,拦截器2不放行;拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle不会执行。 - 3.拦截器1不放行,拦截器2不放行
拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1 preHandle不放行,拦截器2不执行。
(3)拦截器应用。
统一日志处理拦截器,需要该 拦截器preHandle一定要放行,且将它放在拦截器链接中第一个位置。
登陆认证拦截器,放在拦截器链接中第一个位置。权限校验拦截器,放在登陆认证拦截器之后。(因为登陆通过后才校验权限)