SpringMVC
Spring执行流程
Spring集成web开发环境
-
应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件)方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件),这样的弊端是配置文件加载多次,应用上下文对象创建多次。
-
在Web项目中,可以使用ServletContextListener监听Web应用的启动, 我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。
Spring提供获取应用上下文的工具
所以我们需要做两件事
- 在web.xml中配置ContextLoaderListener监听器(导入Spring-web坐标)
- 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext
知识要点
- Spring集成web环境步骤
- 配置ContextLoaderListener
- 使用webApplicationContextUtils获取应用上下文
SpringMvc简介
SpringMvc组件解析
- RequestMapping
- 作用:用于建立请求url和处理方法之间的对应关系
- 位置:
- 类上.请求url的第一集访问目录,此处不写,就相当于应用的根目录
- 方法上,请求url的第二级访问目录,与类上的使用@RequestMapping标注的一级目录一起组成访问虚拟路径
- 属性:
- value:用于指定请求的url,它和path属性的作用是一样的
- method:用于指定请求的方式
- params:用于指定限制请求参数的条件,它支持简单的表达式,要求请求参数的key和value必须和配置一模一样
知识要点
SpringMVC的相关组件
- 前端控制器:DispatchServlet
- 处理器映射:HandlerMapping
- 处理器适配器:HandlerAdapter
- 处理器:Handler
- 视图解析器:ViewResolver View Resolver 负责将处理结果生成 View 视图,将视图返回给前端控制器DispatcherServlet,再由DispatcherServlet响应浏览器。
- 视图:View
SpringMVC的注解和配置
- 请求映射注解:@RequestMapping
- 视图解析器配置:
SpringMVC的数据响应
- 页面跳转
- 直接返回字符串
- 通过ModelAndView对象返回
- 回写数据
- 直接返回字符串
- 直接返回字符串需要在方法上添加注解@ResponseBody
- 返回对象或者集合
- 在SpringMVC的各个组件中,处理器映射器,处理器适配器,视图解析器是SpringMVC的三大组件,使用
<mvc:annotation-driven>
自动加载以上组件替代配置 - 同时
<mvc:annotation-driven>
底层默认继承jackson进行对象或者集合的封装转换
- 直接返回字符串
SpringMVC的请求数据
- 基础数据类型
- Controller中的业务方法的参数的名称与请求参数的的名称一致
- POJO类型
- Controller中的业务方法的POJO参数的属性名与请求参数的的名称一致
- 数组类型
- Controller中的业务方法数组名称与请求参数的名称一致,参数值会自动跳转映射匹配
- 集合类型
- 获取参数时,需要将集合参数封装到POJO中才行(目前)
- 获取参数类型时,使用ajax发送请求时候,设置contextType类型为json类型就能直接获取集合类型
过滤静态资源
- 在请求数据中,使用
<mvc:resource mapping="/js/**" location="/js/">
<mvc:default-servlet-handler>
- 如果想在控制器直接接受集合需要在前端发送json数据,在参数列表声明
@RequestBody
注解
过滤全局乱码
-
在web.xml中配置filter
CharacterEncodingFilter
-
配置filter-mapping
filter-name
<url-patter> /* </url-patter>
参数绑定注解@requestParam
参数
- value:与请求参数名称
- required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数报错
- defaultValue:当没有指定请求参数时,则使用指定的默认赋值
自定义类型转化器
步骤:
-
定义转换器Converter接口
public class DateConverter implements Converter<String, Date> { @Override public Date convert(String s) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:ss"); Date parseDate = null; try { parseDate = simpleDateFormat.parse(s); } catch (ParseException e) { e.printStackTrace(); } return parseDate; } }
-
在配置文件声明转换器
<!--转换器--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="自定义转换器全包名"/> </list> </property>
-
在
<annotation-driven>
中引用转换器<!--配置mvc注解驱动--> <mvc:annotation-driven conversion-service="conversionService"/>
SpringMVC获取请求头
- @RequestHeader
- value:请求头
- required:是否必须携带请求头
- @CookieValue
- value:请求头
- required:是否携带此cookie
文件上传
-
表单必须是POST类型
method="post"
,多文件表单形式enctype="multipart/form-data"
-
服务端配置文件解析器设置必要参数
<!--配置文件上传解析器,指定编码和大小--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="50000000"/> <property name="defaultEncoding" value="UTF-8"/> </bean>
-
业务方法形参位置接受
multipart
类型参数,参数名称与前端name
属性一致调用文件transferTo
方法输出文件地址//获取文件名称 String originalFilename = file.getOriginalFilename(); file.transferTo(new File("文件地址"+originalFilename));
SpringMVC拦截器
-
拦截器(interceptor)
类似SpringMVC的拦截类似于Servlet开发中的Filter,用于对处理器进行预处理和后处理
-
自定义拦截器
- 创建拦截器类实现HandlerInterceptor接口
- 拦截器实现
HandlerInterceptor
三个方法- preHandler():方法在请求处理之前进行调用,返回值是布尔类型,放返回值为false,表示请求结束,后续方法不执行,返回值为true时,执行下一个interceptor的preHandler方法或后续方法
- postHandler():该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为
true时才能被调用,且它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作 - afterCompletion():该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图
之后执行,前提是preHandle方法的返回值为true时才能被调用
- 拦截器实现
- 在
spring-mvc.xml
配置拦截器,拦截路径,拦截类bean - 测试拦截
- 创建拦截器类实现HandlerInterceptor接口
SpringMVC异异常处理机制
- 两种处理方式
- SimpleMappingExceptionRsesolver
- 实现Spring的异常处理接口HandlerExceptionResolver自定义异常处理器
SimpleMappingExceptionRsesolver
-
配置文件配置异常处理
-
<!--配置异常处理器--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView" value="error"/> <property name="exceptionMappings"> <map> <entry key="java.lang.ClassCastException" value="ClassCastError"/> <entry key="java.lang.NullPointerException" value="NullPointerError"/> </map> </property> </bean>
HandlerExceptionResolver自定义异常处理器
- 创建类实现HandlerExceptionResolver接口
- 配置异常处理器
- 编写异常页面
- 测试异常