SpringMVC02

255 阅读3分钟

SpringMVC02

tips:/拦截所有,但是不包括JSP,/* 拦截所有

高级参数绑定

  • JSP页面的多个参数同名,可以使用同名数组接受,或者使用POJO的属性(数组)接受(同名)
  • JSP页面的多个POJO,可以使用包装类型的对应POJO类型的List接收。

接收List类型的数据必须是pojo的属性,如果方法的形参为ArrayList类型无法正确接收到数据。

异常处理器

系统中异常包括两类:预期异常和运行时异常RuntimeException。

捕获.PNG

配置全局异常处理器,只需要实现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才调用