跳至主要內容

springmvc

HeChuangJun约 2262 字大约 8 分钟

1. 谈谈你对 MVC 模式的理解?√

  • MVC是Model—View—Controller简称,它是一种架构模式,它分离了表现与交互。它被分为三个核心部件:模型、视图、控制器
  • Model(模型):指javaBean 是程序的主体部分,主要包含业务数据和逻辑。在模型层,还会涉及到用户发布的服务,在服务中会根据不同的业务需求,更新业务模型中的数据。
  • View(视图):指JSP或者HTML 是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在View视图层输入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理
  • Controller(控制器):指servlet或者Filter Controller用来处理用户输入数据,以及更新业务模型的部分。控制器中接收了用户与界面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态

3. springMVC执行流程?√SpringMVC 的核心组件有哪些?HandlerAdapter作用?√

  • 架构流程
    • 用户发送请求至前端控制器DispatcherServlet
    • DispatcherServlet收到请求调用HandlerMapping处理器映射器。处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)以 HandlerExecutionChain 对象的形式返回给DispatcherServlet
    • DispatcherServlet调用HandlerAdapter处理器适配器调用处理器。中途调用拦截器的preHandle和postHandle方法,HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
    • DispatcherServlet将ModelAndView传给ViewReslover视图解析器ViewReslover解析后返回具体View
    • DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
    • DispatcherServlet响应用户
  • 组件说明
    • DispatcherServlet:前端控制器,相当于mvc模式中的c,流程控制中心,由它调用其它组件处理用户的请求,降低了组件之间的耦合性。
    • HandlerMapping:处理器映射器。负责根据用户请求url找到Handler即处理器,提供配置文件方式,实现接口方式,注解方式等映射方式
    • Handler:处理器,后端控制器,具体的用户请求进行处理。涉及到具体的用户业务请求,需要程序员根据业务需求开发Handler
    • HandlAdapter:处理器适配器,适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。DispatcherServlet会根据controller对应的controller类型来调用相应的HandlerAdapter来进行处理,负责表单数据的验证、数据类型的转换、将表单数据封装到 JavaBean 等
    • ViewResolver:视图解析器。首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户
    • ModelAndView:装载了模型数据和视图信息,作为Handler处理结果返回给DispatcherServlet。
    • View:支持View视图类型:jstlView、freemarkerView、pdfView等
    • HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
    • HandlerExecutionChain:处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor(系统会有一个默认的 HandlerInterceptor,如果需要额外设置拦截,可以添加拦截器)。
  • 三大组件:处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。需要用户开发的组件有handler、view
    springmvcexecutionflow.png
    springmvcexecutionflow2.png

SpringMVC Restful风格的接口的流程是什么样的呢?

  • 客户端向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet
  • DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理
  • DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller
  • Controller被封装成了ServletInvocableHandlerMethod,HandlerAdapter处理器适配器去执行invokeAndHandle方法,完成对Controller的请求处理
  • HandlerAdapter执行完对Controller的请求,会调用HandlerMethodReturnValueHandler去处理返回值,主要的过程:
    • 调用RequestResponseBodyMethodProcessor,创建ServletServerHttpResponse(Spring对原生ServerHttpResponse的封装)实例
    • 使用HttpMessageConverter的write方法,将返回值写入ServletServerHttpResponse的OutputStream输出流中
    • 在写入的过程中,会使用JsonGenerator(默认使用Jackson框架)对返回值进行Json序列化
  • 执行完请求后,返回的ModealAndView为null,ServletServerHttpResponse里也已经写入了响应,所以不用关心View的处理
    springmvcrestful.png

4. 简述SpringMVC中使用的设计模式以及在SpringMVC中的应用场景(1-2个)

  • 单例模式:springmvc的controller默认是单例的
  • 代理模式:springmvc的controller是通过代理产生的

5. SpringMVC 常用的注解有哪些?

  • @RequestMapping:用于处理请求url映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径;方法上则映射url和http请求方法
  • @RequestBody:注解实现接收 HTTP 请求的 json 数据,将 json 转换为 Java 对象;
  • @ResponseBody:注解实现将 Controller 方法返回对象转化为 json 对象响应给客户。需要配合相应的支持 JSON 格式化的 HttpMessageConverter 实现类
  • @Controller,它将一个类标记为 Spring Web MVC 控制器 Controller
  • @RestController,在 @Controller 基础上,增加了 @ResponseBody,提供Restful API ,返回例如 JSON 数据格式。当然,返回什么样的数据格式,根据客户端的 "ACCEPT" 请求头决定。
  • @PathVariable从 URI 读取值,比如查询参数

6. @RequestMapping 和 @GetMapping 注解的不同之处在哪里?

  • @RequestMapping可注解在类和方法上;@GetMapping 仅可注册在方法上
  • @RequestMapping可进行GET、POST、PUT、DELETE等请求方法;@GetMapping是@RequestMapping的GET请求方法的特例

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

  • POST:web.xml中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8;
  • GET:
    • 方法1:修改tomcat配置文件添加编码与工程编码一致,<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort>
    • 方法2:对参数进行重新编码:String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

8. springmvc异常处理

  • Spring MVC提供了异常解析器HandlerExceptionResolver接口,将处理器(handler)执行时发生的异常,解析(转换)成对应的ModelAndView结果

9. Spring MVC 拦截器有哪些方法?作用?

  • preHandle方法,调用Controller方法前执行。按拦截器定义顺序调用。若任一拦截器返回false ,则Controller方法不再调用。
  • postHandle方法,调用Controller方法后执行。按拦截器定义逆序调用
  • afterCompletion方法,处理完Controller方法返回结果后执行.按拦截器定义逆序调用.只要preHandle方法返回true时就会执行.无视异常
  • 记录访问日志。记录异常日志。需要登陆的请求操作,拦截未登陆的用户。

10. Spring MVC 的拦截器和 Filter 过滤器有什么差别?

  • 功能相同:拦截器和 Filter都能实现相应的功能,谁也不比谁强。
  • 容器不同:拦截器构建在 Spring MVC 体系中;Filter 构建在 Servlet 容器之上。
  • 使用便利性不同:拦截器提供了三个方法,分别在不同的时机执行;过滤器仅提供一个方法,当然也能实现拦截器的执行时机的效果,就是麻烦一些。

11. 什么是安全的REST操作?

  • REST接口是否安全的界限,在于是否修改服务端的资源。因此GET和HEAD是安全的,PUT,POST 和 DELETE是不安全的

12. 什么是幂等操作? 为什么幂等操作如此重要?

  • 用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
  • POST方法不是幂等操作 ,因为如果发送多个 POST 请求,它将在服务端创建不同的资源。但是PUT更新资源是幂等操作。甚至多个PUT请求被用来更新服务端资源,将得到相同的结果。

13. REST 用哪种 HTTP 方法呢?

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

14. REST API是无状态的吗?

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

15. 如何创建 HttpMessageConverter 的自定义实现来支持一种新的请求/响应?

  • 自定义的AbstractHttpMessageConverter实现,并使用WebMvcConfigurerAdapter的#extendMessageConverters(List<HttpMessageConverter<?>> converters) 方法注册