SpringMVC的高频面试题

1. SpringMVC的优点

  • SpringMVC是基于组件技术的,无论控制器和视图,还是业务对象之类的都是Java组件,并且和Spring提供的其他基础结构紧密集成
  • 不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于 Servlet 的)
  • 可以使用多种视图技术,而不仅仅局限于 JSP
  • 支持各种请求资源的映射策略
  • 它应是易于扩展的

2. SpringMVC的执行流程是什么?

  • 在彻底理解SpringMVC的执行流程之前,先要知道与SpringMVC相关的各个重要组件

    • 前端控制器(DispatcherServlet)
      • DispatcherServlet是整个流程控制的中心,用于接收请求,响应结果,相当于转发器,中央处理器。DispatcherServlet的存在降低了组件之间的耦合性。
    • 处理器映射器(HandlerMapping)
      • HandlerMapping负责根据用户请求的URL找到Handler处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:xml配置文件的方式注解的方式,实现接口的方式等。
    • 处理器适配器(HandlerAdapter)
      • 按照特定规则(HandlerAdapter要求的规则)去执行Handler,这是适配器模式的应用,通过扩展适配器可以对更多类型的
        处理器进行执行 。
    • 处理器(Handler)
      • Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
    • 视图解析器(ViewResolver)
      • ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名(即具体的页面地址),再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
      • springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
    • 视图View
      • View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf等)

    在这六个组件中,DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver都是由框架提供的,不需要我们自己去开发。但是由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。 (编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler ) 。视图View也需要我们自己去开发,如写JSP页面等。

  • SpringMVC的执行流程图

  • Spring的执行步骤

    1. 用户发起请求到DispatcherServlet
    2. DispatcherServlet调用HandlerMapping,根据xml或者注解的方式去查找handler
    3. 找到handler后HandlerMapping向DispatcherServlet返回一个执行链HandlerExecutionChain
    4. DispatcherServlet调用HandlerAdapter
    5. HandlerAdapter去执行Handler
    6. Handler执行完毕后向HandlerAdapter返回一个ModelAndView对象
    7. HandlerAdapter将ModelAndView对象返回到DispatcherServlet
    8. DispatcherServlet请求ViewResolver进行视图解析
    9. ViewResolver向DispatcherServlet返回View
    10. DispatcherServlet对视图进行渲染
    11. DispatcherServlet向用户返回响应结果

3. SpringMVC怎么样设定重定向和转发的?

  • 转发:在返回值前面加"forward:“,譬如"forward:login.do?name=method1”
  • 重定向:在返回值前面加"redirect:“,譬如"redirect:https://blog.csdn/qq_52248567?type=blog”

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

  • @Controller:用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法。(SpringMVC中的控制器的注解只能用@Controller,不能用其他注解代替
  • @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
  • @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。

5. SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

  • SpringMVC是单例模式,所以在多线程访问的时候有线程安全问题,使用同步,也会影响性能的。
  • 解决方案是在控制器里面不能写字段。

6. 简单介绍下SpringMVC和struts2的区别有哪些?

  1. 入口不同
    • SpringMVC的入口是一个前端控制器DispatcherServlet
    • struts2入口是一个Filter过虑器
  2. 配置映射不同
    • SpringMVC是基于方法开发),传递参数是通过方法的形参,可以设计为单例或多例(建议单例)
    • struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例
  3. 视图不同
    • Struts采用值栈存储请求和响应的数据,通过 OGNL 存取数据
    • SpringMVC通过参数解析器是将request 请求内容解析,并给方法形参赋值,将数据和视图封装成 ModelAndView 对象,最后又将ModelAndView 中的模型数据通过 reques 域传输到页面。Jsp 视图解析器默认使用 jstl

7. 怎么样把某个请求映射到特定的方法上面?

  • 直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径

8. 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?

  • 可以在@RequestMapping 注解里面加上 method=RequestMethod.GET

9. 怎么样在方法里面得到Request或者Session?

  • 直接在方法的形参中声明request和session,SpringMVC就自动把request对象和session对象传入

10. SpringMVC中函数的返回值是什么?

  • 返回值可以有很多类型,有 String、ModelAndView,一般用 String 比较好。

11. SpringMVC怎么和 AJAX 相互调用的?

  • 通过Jackson框架就可以把Java里面的对象直接转化成JS可以识别的 json对象。
    具体步骤如下 :
    1. 加入 Jackson.jar
    2. 在配置文件中配置 json 的映射
    3. 在接受 Ajax 方法里面可以直接返回 Object、List 等,但方法前面要加上@ResponseBody 注解

更多推荐

SpringMVC的高频面试题