乐趣区

关于后端:三天吃透SpringMVC面试八股文

本文曾经收录到 Github 仓库,该仓库蕴含 计算机根底、Java 根底、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享 等外围知识点,欢送 star~

Github 地址:https://github.com/Tyson0314/Java-learning


说说你对 SpringMVC 的了解

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的申请驱动类型的轻量级 Web 框架,属于 Spring 框架的一个模块。

它通过一套注解,让一个简略的 Java 类成为解决申请的控制器,而无须实现任何接口。同时它还反对 RESTful 编程格调的申请。

什么是 MVC 模式?

MVC 的全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller) 的缩写,是一种软件设计榜样。它是用一种业务逻辑、数据与界面显示拆散的办法来组织代码,将泛滥的业务逻辑汇集到一个部件外面,在须要改良和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑,达到缩小编码的工夫。

View,视图是指用户看到并与之交互的界面。比方由 html 元素组成的网页界面,或者软件的客户端界面。MVC 的益处之一在于它能为利用程序处理很多不同的视图。在视图中其实没有真正的解决产生,它只是作为一种输入数据并容许用户操纵的形式。

model,模型是指模型表示业务规定。在 MVC 的三个部件中,模型领有最多的解决工作。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,因为利用于模型的代码只需写一次就能够被多个视图重用,所以缩小了代码的重复性。

controller,控制器是指控制器承受用户的输出并调用模型和视图去实现用户的需要,控制器自身不输入任何货色和做任何解决。它只是接管申请并决定调用哪个模型构件去解决申请,而后再确定用哪个视图来显示返回的数据。

SpringMVC 有哪些长处?

  1. 与 Spring 集成应用十分不便,生态好。
  2. 配置简略,疾速上手。
  3. 反对 RESTful 格调。
  4. 反对各种视图技术,反对各种申请资源映射策略。

Spring MVC 和 Struts 的区别

  1. Spring MVC 是基于办法开发,Struts2 是基于类开发的。

    • Spring MVC 会将用户申请的 URL 门路信息与 Controller 的某个办法进行映射,所有申请参数会注入到对应办法的形参上,生成 Handler 对象,对象中只有一个办法;
    • Struts 每解决一次申请都会实例一个 Action,Action 类的所有办法应用的申请参数都是 Action 类中的成员变量,随着办法增多,整个 Action 也会变得凌乱。
  2. Spring MVC 反对单例开发模式,Struts 只能应用多例

    • Struts 因为只能通过类的成员变量接管参数,故只能应用多例。
  3. Struts2 的外围是基于一个 Filter 即 StrutsPreparedAndExcuteFilter,Spring MVC 的外围是基于一个 Servlet 即 DispatcherServlet(前端控制器)。
  4. Struts 处理速度略微比 Spring MVC 慢,Struts 应用了 Struts 标签,加载数据较慢。

Spring MVC 的工作原理

Spring MVC 的工作原理如下:

  1. DispatcherServlet 接管用户的申请
  2. 找到用于解决 request 的 handler 和 Interceptors,结构成 HandlerExecutionChain 执行链
  3. 找到 handler 绝对应的 HandlerAdapter
  4. 执行所有注册拦截器的 preHandler 办法
  5. 调用 HandlerAdapter 的 handle() 办法解决申请,返回 ModelAndView
  6. 倒序执行所有注册拦截器的 postHandler 办法
  7. 申请视图解析和视图渲染

Spring MVC 的次要组件?

  • 前端控制器(DispatcherServlet):接管用户申请,给用户返回后果。
  • 处理器映射器(HandlerMapping):依据申请的 url 门路,通过注解或者 xml 配置,寻找匹配的 Handler。
  • 处理器适配器(HandlerAdapter):Handler 的适配器,调用 handler 的办法解决申请。
  • 处理器(Handler):执行相干的申请解决逻辑,并返回相应的数据和视图信息,将其封装到 ModelAndView 对象中。
  • 视图解析器(ViewResolver):将逻辑视图名解析成真正的视图 View。
  • 视图(View):接口类,实现类可反对不同的 View 类型(JSP、FreeMarker、Excel 等)。

Spring MVC 的罕用注解由有哪些?

  • @Controller:用于标识此类的实例是一个控制器。
  • @RequestMapping:映射 Web 申请(拜访门路和参数)。
  • @ResponseBody:注解返回数据而不是返回页面
  • @RequestBody:注解实现接管 http 申请的 json 数据,将 json 数据转换为 java 对象。
  • @PathVariable:取得 URL 中门路变量中的值
  • @RestController:@Controller+@ResponseBody
  • @ExceptionHandler 标识一个办法为全局异样解决的办法。

@Controller 注解有什么用?

@Controller 注解标记一个类为 Spring Web MVC 控制器。Spring MVC 会将扫描到该注解的类,而后扫描这个类上面带有 @RequestMapping 注解的办法,依据注解信息,为这个办法生成一个对应的处理器对象,在下面的 HandlerMapping 和 HandlerAdapter 组件中讲到过。

当然,除了增加 @Controller 注解这种形式以外,你还能够实现 Spring MVC 提供的 Controller 或者 HttpRequestHandler 接口,对应的实现类也会被作为一个处理器对象

本文曾经收录到 Github 仓库,该仓库蕴含 计算机根底、Java 根底、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享 等外围知识点,欢送 star~

Github 地址:https://github.com/Tyson0314/Java-learning

@RequestMapping 注解有什么用?

@RequestMapping 注解,用于配置处理器的 HTTP 申请办法,URI 等信息,这样能力将申请和办法进行映射。这个注解能够作用于类下面,也能够作用于办法下面,在类下面个别是配置这个控制器的 URI 前缀。

@RestController 和 @Controller 有什么区别?

@RestController 注解,在 @Controller 根底上,减少了 @ResponseBody 注解,更加适宜目前前后端拆散的架构下,提供 Restful API,返回 JSON 数据格式。

@RequestMapping 和 @GetMapping 注解有什么不同?

  1. @RequestMapping:可注解在类和办法上;@GetMapping 仅可注册在办法上
  2. @RequestMapping:可进行 GET、POST、PUT、DELETE 等申请办法;@GetMapping@RequestMapping 的 GET 申请办法的特例。

@RequestParam 和 @PathVariable 两个注解的区别

两个注解都用于办法参数,获取参数值的形式不同,@RequestParam 注解的参数从申请携带的参数中获取,而 @PathVariable 注解从申请的 URI 中获取

@RequestBody 和 @RequestParam 的区别

@RequestBody 个别解决的是在 ajax 申请中申明 contentType: “application/json; charset=utf-8″ 时候。也就是 json 数据或者 xml 数据。

@RequestParam 个别就是在 ajax 外面没有申明 contentType 的时候,为默认的 x-www-form-urlencoded 格局时。

Spring MVC 的异样解决

能够将异样抛给 Spring 框架,由 Spring 框架来解决;咱们只须要配置简略的异样处理器,在异样处理器中添视图页面即可。

  • 应用零碎定义好的异样处理器 SimpleMappingExceptionResolver
  • 应用自定义异样处理器
  • 应用异样解决注解

SpringMVC 用什么对象从后盾向前台传递数据的?

  1. 将数据绑定到 request;
  2. 返回 ModelAndView;
  3. 通过 ModelMap 对象,能够在这个对象外面调用 put 办法,把对象加到外面,前端就能够通过 el 表达式拿到;
  4. 绑定数据到 Session 中。

SpringMvc 的 Controller 是不是单例模式?

单例模式。在多线程拜访的时候有线程平安问题,解决方案是在控制器外面不要写可变状态量,如果须要应用这些可变状态,能够应用 ThreadLocal,为每个线程独自生成一份变量正本,独立操作,互不影响。

介绍下 Spring MVC 拦截器?

Spring MVC 拦截器对应 HandlerInterceor 接口,该接口位于 org.springframework.web.servlet 的包中,定义了三个办法,若要实现该接口,就要实现其三个办法:

  1. 前置解决(preHandle()办法):该办法在执行控制器办法之前执行。返回值为 Boolean 类型,如果返回 false,示意拦挡申请,不再向下执行,如果返回 true,示意放行,程序持续向下执行(如果前面没有其余 Interceptor,就会执行 controller 办法)。所以此办法可对申请进行判断,决定程序是否继续执行,或者进行一些初始化操作及对申请进行预处理。
  2. 后置解决(postHandle()办法):该办法在执行控制器办法调用之后,且在返回 ModelAndView 之前执行。因为该办法会在 DispatcherServlet 进行返回视图渲染之前被调用,所以此办法多被用于解决返回的视图,可通过此办法对申请域中的模型和视图做进一步的批改。
  3. 已实现解决(afterCompletion()办法):该办法在执行完控制器之后执行,因为是在 Controller 办法执行结束后执行该办法,所以该办法适宜进行一些资源清理,记录日志信息等解决操作。

能够通过拦截器进行权限测验,参数校验,记录日志等操作

SpringMvc 怎么配置拦截器?

有两种写法,一种是实现 HandlerInterceptor 接口,另外一种是继承适配器类,接着在接口办法当中,实现解决逻辑;而后在 SpringMvc 的配置文件中配置拦截器即可:

<!-- 配置 SpringMvc 的拦截器 -->
<mvc:interceptors>
    <bean id="myInterceptor" class="com.dabin.MyHandlerInterceptor"></bean>
 
    <!-- 只拦挡局部申请 -->
    <mvc:interceptor>
       <mvc:mapping path="/xxx.do" />
       <bean class="com.dabin.MyHandlerInterceptorAdapter" />
    </mvc:interceptor>
</mvc:interceptors>

Spring MVC 的拦截器和 Filter 过滤器有什么差异?

有以下几点:

  • 性能雷同:拦截器和 Filter 都能实现相应的性能
  • 容器不同:拦截器构建在 Spring MVC 体系中;Filter 构建在 Servlet 容器之上
  • 应用便利性不同:拦截器提供了三个办法,别离在不同的机会执行;过滤器仅提供一个办法

什么是 REST?

REST,英文全称,Resource Representational State Transfer,对资源的拜访状态的变动通过 url 的变动表述进去。

Resource:资源。资源是 REST 架构或者说整个网络解决的外围。

Representational:某种表现形式,比方用 JSON,XML,JPEG 等。

State Transfer:状态变动。通过 HTTP method 实现。

REST 形容的是在网络中 client 和 server 的一种交互模式。用大白话来说,就是 通过 URL 就晓得要什么资源,通过 HTTP method 就晓得要干什么,通过 HTTP status code 就晓得后果如何

举个例子:

GET /tasks 获取所有工作
POST /tasks 创立新工作
GET /tasks/{id} 通过工作 id 获取工作
PUT /tasks/{id} 更新工作
DELETE /tasks/{id} 删除工作

GET 代表获取一个资源,POST 代表增加一个资源,PUT 代表批改一个资源,DELETE 代表删除一个资源。

server 提供的 RESTful API 中,URL 中只应用名词来指定资源,原则上不应用动词。用 HTTP Status Code 传递 server 的状态信息。比方最罕用的 200 示意胜利,500 示意 Server 外部谬误等。

应用 REST 有什么劣势呢?

第一,格调对立 了,不会呈现 delUser/deleteUser/removeUser 各种命名的代码了。

第二,面向资源,高深莫测,具备自解释性。

第三,充分利用 HTTP 协定自身语义


最初给大家分享一个 Github 仓库,下面有大彬整顿的 300 多本经典的计算机书籍 PDF,包含 C 语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生 等,能够 star 一下,下次找书间接在下面搜寻,仓库继续更新中~

Github 地址:https://github.com/Tyson0314/java-books

退出移动版