SpringMVC:
SpringMVC:
重点:
1.SpringMVC的运行流程
1.用户发送请求到前端控制器dispatcherservlet
2.dispatcherservlet发送查找的handler的请求到处理器映射器handlermapping,处理器映射器handlermapping将handlerexecutionchain
和拦截器再返回给前端控制器dispatcherservlet
3.前端控制器dispatcherservlet再将执行handler的请求发送给处理器适配器handleradapter找到合适的接口
4.处理器适配器handleradapter将请求发送给处理器handler执行,执行完目标handler之后返回modelandview
5.处理器适配器handleradapter将modelandview再返回给前端控制器dispatcherservlet
6.前端控制器dispatcherservlet找到视图解析器viewresolver进行视图解析,并把解析好的视图view返回给前端控制器
7.将model数据填充进视图view,并将渲染好的视图返回给前端控制器dispatcherservlet
8.响应给用户
SpringMVC组件说明:
1.DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,
DispatcherServlet的存在降低了组件之间的耦合性
2.HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方法,如:配置文件方式、
实现接口方法、注解方式等
3.Handler:处理器
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理
由于Handler涉及到具体的用户的业务请求,所以一般情况需要程序员根据业务需求开发Handler
4.HandlerAdapter:处理器适配器handleradapter将modelandview再返回给前端控制器dispatcherservlet
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更对类型的学护理期进行执行
5.ViewResolver:视图解析器
ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View
视图对象,最后对View进行渲染将处理结果通过页面展现给用户。SpringMVC框架提供了很多的View视图类型,包括jstlView、
freemarkView、pdfView等
一般情况下需要通过页面标签或页面模板技术奖模型数据通过页面展示给用户,需要有程序员根据业务需求开发具体的页面
SpringMVC注解以及注解的含义:
@RequestMapping: 用来映射请求url的
@ResponseBody: 返回json数据
@RequestBody: 接收前端传过来的json对象
@RequestParam: 获取请求参数
@PathVariable: 将占位符绑定到目标方法的参数上
@ControllerAdvice:全局异常处理类
@ExceptionHandler:局部异常处理类
@NumberFormat:数字格式化
@DateTimeFormat:格式化时间的
@RequestHeader:获取请求头信息
get/put请求乱码的处理方式:
get请求,在tomcat的server.xml文件中配置URIEncpoding=UTF-8
post请求,在web.xml文件中加上CharacterEncodingFilter过滤器
将post请求转化为delete或put请求
1.在web.xml文件中配置HiddenHttpMethodFilter过滤器
2.在表单域中需要携带一个"_method"和"delete"或"put"的键值对
SpringMVC处理模型数据
1.ModelAndView
2.Map、Model、ModelMap
无论返回值类型是String还是ModelAndView,放入Map...等的数据都会放入ModelAndView对象中,最终都是放入request域中
SpringMVC的返回值类型:
ModelAndView:通过ModelAndView中的ViewheModel来设置视图和数据
String:通过返回值设置视图,通过Model/ModelMap/Map类型的参数传递数值
Void:通过原生API【HttpServletRequest】传递数值、转发或者重定向到目标页
SpringMVC处理静态资源:
对于静态资源文件,如:js/css/图片 的访问我么需要在SpringMVC配置文件中配置一个标签:
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
SpringMVC 如何返回json数据:
1.导入json的jar包
2.目标方法上加@ResponseBody
3.springmvc配置文件中配置mvc:annotation-driven标签
数据类型转换:
1.自定义类型转换器实现Converter<T>接口并加入到SpringMVC的IOC容器中
2,配置自定义转换器到FormattingConversionServiceFactoryBean工厂中
自定义类型转换器
1.实现Converter接口,指定源数据类型和目标数据类型,并实现接口中的方法
2.将该自定义类型的转换器对象放入到SpringMVC的容器中:@Componnent
3.在SpringMVC的配置文件中配置FormattingConversionServiceFactoryBean,指定converters属性
4.<mvc:annotation-driven conversion-service="myConversionService">
数据格式化标签:
1.在SpringMVC配置文件中配置<mvc:annotation-driven/>
2.在目标POJO对象的属性上加上@NumberFormat或者@DateTimeFormat注解
@DateTimeFormat:-pattern属性:类型为字符串。指定解析/格式化字段数据的模式,如:pattern="yyyy-MM-dd hh:mm:ss"
@NumberFormat:-pattern属性:类型为String,自定义样式,如pattern="#,###"
文件上传:
SpringMVC上下文中没有为文件上传提供直接的支持,因此默认情况下不能处理文件的上传工作,如果想使用Spring的文件上传功能,
需要在上下文中配置CommonsMultipartResolver
1.加入jar包
2.在SpringMVC配置文件中配置CommonsMultipartResolver
3.表单:POST请求,file类型,enctype="multipart/form-data"
文件下载:
用ResponseEntity<byte[]>返回值完成文件下载
自定义拦截器:
SpringMVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义拦截器必须实现
HandlerInterceptor接口
1.自定义实现类实现HandlerInterceptor接口
2.在SpringMVC配置文件中配置相对应的拦截器
<mvc:interceptors>
<!--配置自定义拦截器 ,所有的路径都拦截 -->
<bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
</mvc:interceptors>
说明:
-preHandler():该方法在目标方法执行之前被调用
若返回值true,则继续调用后续的拦截器和目标方法
若返回值为false,则不会调用后续的拦截器和目标方法
可以考虑做权限,日志或者事务等
-postHandler():调用目标方法之后,但渲染视图之前被调用
可以对请求域中的属性或者视图做出修改
-afterCompletion():渲染视图之后被调用
可以下该方法中进行一些资源清理的操作
单个拦截器的执行顺序:
FirstInterceptor#preHandler --> HandlerAdapter#handler --> FirstInterceptor#postHandler -->
DispatcherServlet#render --> FirstInterceptor#afterCompletion
多拦截器的执行顺序:
FirstInterceptor#preHandler --> SecondInterceptor#preHandler --> HandlerAdapter#handler -->
SecondInterceptor#postHandler --> FirstInterceptor#postHandler --> DispatcherServlet#render -->
SecondInterceptor#afterCompletion --> FirstInterceptor#afterCompletion
SpringMVC的异常处理:
1.加上<mvc:annotation-driven/>标签
2.在当前Controller中定义有@ExceptionHandler注解修饰的方法,用于处理异常信息
注意:
1.@ExceptionHandler方法修饰的入参中可以加入Exception类型的参数,该参数即对应发生的异常信息
2.@ExceptionHandler方法修饰的入参中不能传入Map,若希望吧异常信息传到页面上,需要使用ModelAndView作为返回值类型
3.@ExceptionHandler注解定义的优先级问题:
例如发生的是NullPointerException,但是声明的异常有RuntimeException和Exception,此时会根据异常的最近 继承关系找到
继承深度最浅的那个@ExceptionHandler注解方法,即标记了RuntimeException的方法
4.ExceptionHandlerMethodResolver内部找不到@ExceptionHandler注解的话,会找@ControllerAdvice中的@ExceptionHandler注解方法,
即标记了RuntimeException的方法
异常有几个原则:
1.一早抛出
2.延迟处理
3.尽量不要使用Exception来捕获异常,要尽量使用异常类型和异常信息能让读的人精确了解到你的代码容易出现哪些问题
4.实在不行,就往外抛出,抛出一个通用的异常处理机制[异常切面处理-->底层AOP],然后抛出给远程调用者
5.异常信息要尽量记录下来,尤其是分布式系统的开发的时候[抛出或是记录日志,根据情况而定]
6.异常try...catch的执行效率要比普通代码的执行效率要低(影响jvm执行),所以仅需用try...catch捕获可能出现的异常的代码段