跳至主要內容

Spring MVC

HeChuangJun约 1263 字大约 4 分钟

MVC模式?√设计模式及场景?线程安全?

Model-View-Controller 架构模式,分离了表现与交互。包括
Model模型:javaBean,负责处理与数据和业务逻辑
View视图:JSP或HTML,负责显示数据,提供用户界面。接收用户输入并传递给Controller处理
Controller控制器:servlet或Filter,接收用户输入,调用Model处理逻辑更新数据。根据结果选择View显示

单例\代理模式:controller是单例\代理产生的

Servlet、SpringMVC线程不安全,单例
Struts2线程安全,Action多例,每个请求都创建Action处理

MVC、Restful执行流程?√核心组件?HandlerAdapter作用?√

用户发送请求至前端控制器DispatcherServlet
DispatcherServlet收到请求调用HandlerMapping处理器映射器。~根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)并返回HandlerExecutionChain
DispatcherServlet调用HandlerAdapter处理器适配器根据类型调用处理器controller。中途调用拦截器的preHandle和postHandle方法,HandlerAdapter将controller结果ModelAndView返回给DispatcherServlet
DispatcherServlet将ModelAndView传给ViewReslover视图解析器解析后返回View
DispatcherServlet对View进行渲染视图(将模型数据填充至视图中)并返回给客户端

Controller返回数据对象(User)或ResponseEntity
DispatcherServlet通过HttpMessageConverter将数据对象序列化为JSON返回给客户端

springmvcrestful.png
springmvcrestful.png

DispatcherServlet:前端控制器,mvc模式中的c,负责调用其它组件处理用户的请求,降低耦合性
HandlerMapping:处理器映射器。负责根据用户请求url找到Handler即处理器,提供配置文件方式
Handler:处理器,后端控制器,处理用户请求
HandlerAdapter:处理器适配器,扩展适配器可以对更多类型的处理器进行执行。
ViewResolver:视图解析器。首先根据逻辑视图名解析页面地址再生成View视图返回给用户
ModelAndView:装载了模型数据和视图信息,作为Handler处理结果返回给DispatcherServlet。
View:支持视jstlView、freemarkerView
HandlerInterceptor:处理器拦截器,拦截处理接口
HandlerExecutionChain:处理器执行链,包括Handler和HandlerInterceptor

三大组件:处理器映射器、处理器适配器、视图解析器。handler、view需要自定义
springmvcexecutionflow2.png

SpringMVC注解?@RequestMapping和@GetMapping区别?

@RequestMapping:用于类上表示类中的响应请求的方法的父路径;方法上则映射url和http请求方法。Restful接口根据请求类型使用不同的注解@GetMapping、@PostMapping、@PutMapping、@DeleteMapping
@RequestBody:接收HTTP请求的json数据并转换为Java对象
@ResponseBody:将Controller方法返回对象转化为json对象响应给客户
@Controller:组合@Component,MVC的控制层C
@RestController:组合@ResponseBody,返回JSON数据格式,由客户端的"ACCEPT"请求头决定
@PathVariable:用于接收路径参数,@RequestMapping("/{name}")将注解放在参数前

如何解决POST、GET请求中文乱码问题?

POST:web.xml中配置CharacterEncodingFilter过滤器,编码utf-8
GET:
修改tomcat配置文件<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort>
使用拦截器解码String userName = new String(request.getParamter("x").getBytes("ISO8859-1"),"utf-8")

异常处理

异常解析器HandlerExceptionResolver接口,将处理器handler的异常转换成ModelAndView结果

拦截器的方法?作用?和 Filter过滤器区别?√

preHandle方法,调用Controller方法前执行。按定义顺序调用。若返回false则不再调用Controller方法
postHandle方法,后。逆
afterCompletion方法,返回结果后执行,逆,preHandle方法返回true时就执行,无视异常

记录日志。需要登陆的请求操作,拦截未登陆的用户

拦截器基于Spring容器,Filter基于Servlet容器
拦截器作用于SpringMVC请求的controller,Filter作用于匹配的路径请求包括静态资源
拦截器在DispatcherServlet之后执行,Filter在DispatcherServlet 之前执行
拦截器处理与业务相关的逻辑,如权限校验、日志记录;Filter处理通用的请求预处理,如编码设置、跨域

http请求方法有哪些?RESTful操作线程安全?幂等操作及重要性?API是无状态的吗?

GET、POST、PUT、DELETE检索、创建、更新、删除服务端资源

取决于是否修改服务端的资源。
用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用

因此GET和HEAD是安全的,PUT,POST和DELETE不安全
如果多个POST请求将在服务端创建不同的资源。多个PUT请求得到相同的结果。

是无状态的,因为基于HTTP是无状态
请求应该包含所需的所有细节。它不应该依赖于以前或下一个请求或服务器端维护的一些数据,例如会话。

如何支持新请求/响应?

创建HttpMessageConverter自定义实现。实现AbstractHttpMessageConverter,
用WebMvcConfigurerAdapter的extendMessageConverters(List<HttpMessageConverter<?>> converters)方法注册