简述 SpringMVC 工作原理 ?
SpringMVC 工作原理:
1:用户发送请求至前端控制器DispatcherServlet。
2:DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3:处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4:DispatcherServlet调用HandlerAdapter处理器适配器。
5:HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6:Controller执行完成返回ModelAndView。
7:HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8:DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9:ViewReslover解析后返回具体View。
10:DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11:DispatcherServlet响应用户。
请简述Spring MVC的五大组件
1.DispatcherServlet:前端控制器,接收请求,调用其他组件处理请求响应请求,相当于转发器,中央控制器,是整个控制流程的中心。
2.HandlerMapping: 处理器映射,主要功能是实现请求派发,找到请求和控制器之间的对应关系。
3.Controller:控制器,接收处理前端控制器分发的请求,将执行的结果(ModelAndView)返回给前端控制器。
4.ModelAndView:封装数据模型和视图信息。
5.ViewResolver:视图解析器,根据视图名称解析后返回一个真正的页面
请详细描述 DispatcherServlet 的工作流程 ?
DispatcherServlet 的工作流程
- 向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。
- DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
- DispatcherServlet 根据获得的 Handler ,选择一个合适的 HandlerAdapter 。(附注:如果成功获得 HandlerAdapter 后,此时将开始执行拦截器的 preHandler(…)方法)。
- 提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler ( Controller )。 在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
HttpMessageConveter : 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换 :对请求消息进行数据转换。如 String 转换成 Integer 、 Double 等。
数据根式化 :对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
数据验证 : 验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。 - 根据返回的 ModelAndView ,选择一个适合的 ViewResolver (必须是已经注册到 Spring 容器中的 ViewResolver )返回给 DispatcherServlet 。
- ViewResolver 结合 Model 和 View ,来渲染视图。
- 视图负责将渲染结果返回给客户端。
简述Spring MVC的前端控制器是什么
前端控制器是org.springframework.web.servlet包中存在的DispatcherServlet类
它将请求分派到适当的控制器并管理应用程序的流程。需要在web.xml文件中指定DispatcherServlet
实际开发
简述用于处理不同类型的传入HTTP请求方法的注释 ?
@GetMapping
@PostMapping
@PutMapping
@PatchMapping
@DeleteMapping
简述Spring MVC中@PathVariable注释的作用
@PathVariable批注用于提取URI模板的值。它在处理程序方法的参数中传递。
简述@ResponseBody注释在Spring MVC中起什么作用?
@ResponseBody批注用于在JSON中自动序列化返回的对象, 并将其与Http响应主体绑定
SpringMVC 常用注解都有哪些?
requestMapping:用于请求 url 映射。
@RequestBody: 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
@ResponseBody :注解实现将 controller 方法返回对象转化为 json 响应给客户。
@Conntroller:控制器的注解,表示是表现层,不能用用别的注解代替
简述SpringMVC和Struts2的区别有哪些?
- Spring MVC 基于方法开发,Struts2 基于类开发。
-
- Spring MVC 可以进行单例开发,Struts2 无法使用单例
Spring MVC 支持单例开发模式,而 Struts2 由于只能通过类的成员变量接受参数,所以无法使用单例模式,只能使用多例。
- Spring MVC 可以进行单例开发,Struts2 无法使用单例
- 经过专业人员的大量测试,Struts2 的处理速度要比 SpringMVC 慢,原因是 Struts2 使用了 Struts 标签,Struts 标签由于设计原因,会出现加载数据慢的情况
简述@RestController 和 @Controller 有什么区别?
@RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API ,返回 JSON 数据格式。
如果在拦截请求中,我想拦截 get 方式提交的方法,怎么配置?
可以在@RequestMapping 注解里面加上 method=RequestMethod.GET或直接使用@GetMapping
解释@RequestMapping 和 @GetMapping 注解有什么不同
@RequestMapping:可注解在类和方法上;@GetMapping 仅可注册在方法上
@RequestMapping:可进行 GET、POST、PUT、DELETE 等请求方法;@GetMapping 是 @RequestMapping 的 GET 请求方法的特例
简述@RequestParam 和 @PathVariable 两个注解的区别
@RequestParam 和 @PathVariable 注解是用于从request中接收请求的,都可接收参数
@RequestParam 是从request里取值
@PathVariable 是从一个URI模板里面来填充
简述@RequestBody和@RequestParam的区别
@RequestBody一般处理的是在ajax请求中声明contentType: "application/json; charset=utf-8"时候。也就是json数据或者xml数据。
@RequestParam一般就是在ajax里面没有声明contentType的时候,为默认的x-www-form-urlencoded格式时。.
简述SpringMvc的Controller是不是单例模式?
单例模式。在多线程访问的时候有线程安全问题,解决方案是在控制器里面不要写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal,为每个线程单独生成一份变量副本,独立操作,互不影响
简述SpringMvc怎么配置拦截器?
有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:
请简述Spring MVC 的拦截器和 Filter 过滤器有什么差别?
有以下几点:
功能相同:拦截器和 Filter 都能实现相应的功能
容器不同:拦截器构建在 Spring MVC 体系中;Filter 构建在 Servlet 容器之上
使用便利性不同:拦截器提供了三个方法,分别在不同的时机执行;过滤器仅提供一个方法
如何把ModelMap里面的数据放入Session里面?
可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。
SpringMVC如何读取请求参数值 ?
1、通过ServletAPI获取
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请 求的请求报文的对象
2、@RequestParam
@RequestParam是将请求参数和控制器方法的形参创建映射关系
4、@RequestHeader
@RequestHeader是将请求头信息和控制器方法的形参创建映射关系
5、@CookieValue
@CookieValue是将cookie数据和控制器方法的形参创建映射关系
@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam
6、通过POJO获取请求参数
可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实 体类中的属性名一致,那么请求参数就会为此属性赋值
简述请求转发(forward)与重定向(redirect)的区别
请求转发在服务器端完成的;重定向是在客户端完成的。
请求转发的速度快;重定向速度慢。
请求转发的是同一次请求;重定向是两次不同请求。
请求转发不会执行转发后的代码;重定向会执行重定向之后的代码。
请求转发地址栏没有变化;重定向地址栏有变化。
请求转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成