SpringMVC02
tips:/拦截所有,但是不包括JSP,/* 拦截所有
高级参数绑定
- JSP页面的多个参数同名,可以使用同名数组接受,或者使用POJO的属性(数组)接受(同名)
- JSP页面的多个POJO,可以使用包装类型的对应POJO类型的List接收。
接收List类型的数据必须是pojo的属性,如果方法的形参为ArrayList类型无法正确接收到数据。
异常处理器
系统中异常包括两类:预期异常和运行时异常RuntimeException。

配置全局异常处理器,只需要实现HandleExceptionResolver,置于容器中即可。
上传图片
配置上传解析器
<!-- 文件上传,id必须设置为multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置文件上传大小 -->
<property name="maxUploadSize" value="5000000" />
</bean>
JSON 数据转化
@RequestBody将请求中的字符串,通过SpringMVC提供的HttpMessageConverters接口将字符串,转化为Java对象,并绑定到形参上。@ResponseBody做相反的操作,另外如果加上@ResponseBody注解,就不会走视图解析器,不会返回页面。
配置JSON转换器
如果不使用注解驱动<mvc:annotation-driven />,就需要给处理器适配器配置json转换器。
<!--处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
RestFul
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
使用RESTful操作资源
| url | 操作 |
|---|---|
| http://127.0.0.1/item/1 | 查询,GET |
| http://127.0.0.1/item | 新增,POST |
| http://127.0.0.1/item | 更新,PUT |
| http://127.0.0.1/item/1 | 删除,DELETE |
? url 包括查询参数?
拦截器
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
public interface HandlerInterceptor {
// Controller执行前调用此方法
// 返回true表示继续执行,返回false中止执行
// 这里可以加入登录校验、权限拦截等
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
// handler返回后,调用视图解析器之前,可以添加一些公用的数据,比如公司信息。
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
// controller执行后且视图返回后调用此方法
// 这里可得到执行controller时的异常信息
// 这里可记录操作日志
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
<mvc:interceptors>
<mvc:interceptor>
<!-- 所有的请求都进入拦截器 -->
<mvc:mapping path="/**" />
<!-- 配置具体的拦截器 -->
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
调用规则
preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用
postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用