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

spring拦截器 request获取json数据 spring拦截器获取参数_json


spring拦截器 request获取json数据 spring拦截器获取参数_json_02

(2)使用@ModelAttribute将方法的返回值传到request

spring拦截器 request获取json数据 spring拦截器获取参数_json_03


可在jsp页面直接使用itemtypes

(3)为model设置属性

spring拦截器 request获取json数据 spring拦截器获取参数_数据_04


简单类型的回显只能使用这种方法。

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.jarcommons-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不用指定名称。

spring拦截器 request获取json数据 spring拦截器获取参数_拦截器_05

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一定要放行,且将它放在拦截器链接中第一个位置

登陆认证拦截器,放在拦截器链接中第一个位置。权限校验拦截器,放在登陆认证拦截器之后。(因为登陆通过后才校验权限)