WinddSnow

Java面试题09SpringMVC框架

字数统计: 1.7k阅读时长: 6 min
2022/10/22

谈一下你对 SpringMVC 框架的理解

SpringMVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web框架,通过把 Model,View,Controller 分离,将 web 层进行职责解耦,把复杂的 web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

在我看来,SpringMVC 就是将我们原来开发在 servlet 中的代码拆分了,一部分由SpringMVC 完成,一部分由我们自己完成

SpringMVC 主要组件

  • 前端控制器 DispatcherServlet :接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
  • 处理器映射器 HandlerMapping:根据请求的 URL 来查找 Handler
  • 处理器适配器 HandlerAdapter:负责执行 Handler
  • 处理器 Handler:处理业务逻辑的 Java 类
  • 视图解析器 ViewResolver:进行视图的解析,根据视图逻辑名将 ModelAndView 解析成真正的视图(view)
  • 视图 View:View 是一个接口,它的实现类支持不同的视图类型,如 jsp,freemarker, pdf 等等

谈一下 SpringMVC 的执行流程以及各个组件的作用

  1. 用户发送请求到前端控制器(DispatcherServlet)
  2. 前 端 控 制 器 ( DispatcherServlet ) 收 到 请 求 调 用 处 理 器 映 射 器(HandlerMapping),去查找处理器(Handler)
  3. 处理器映射器(HandlerMapping)找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。
  4. 前端控制器(DispatcherServlet)调用处理器映射器(HandlerMapping)
  5. 处理器适配器(HandlerAdapter)去调用自定义的处理器类(Controller,也叫后端控制器)。
  6. 自定义的处理器类(Controller,也叫后端控制器)将得到的参数进行处理并返回结果给处理器映射器(HandlerMapping)
  7. 处 理 器 适 配 器 ( HandlerAdapter ) 将 得 到 的 结 果 返 回 给 前 端 控 制 器(DispatcherServlet)
  8. DispatcherServlet( 前 端 控 制 器 ) 将 ModelAndView 传 给 视 图 解 析 器(ViewReslover)
  9. 视图解析器(ViewReslover)将得到的参数从逻辑视图转换为物理视图并返回给前端控制器(DispatcherServlet)
  10. 前端控制器(DispatcherServlet)调用物理视图进行渲染并返回
  11. 前端控制器(DispatcherServlet)将渲染后的结果返回

3.4 说一下 SpringMVC 支持的转发和重定向的写法

  • 转发

    forward 方式:在返回值前面加”forward:”,比如”””forward:user.do?name=method4”

  • 重定

    redirect 方式:在返回值前面加 redirect:, 比如”redirect:http://www.baidu.com"

SpringMVC 的常用注解

  • @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。

  • @RequestBody:注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。

  • @ResponseBody:注解实现将 conreoller 方法返回对象转化为 json 对象响应给客户

  • @PathVariable 用户从 url 路径上获取指定参数,标注在参数前 @PathVariabel(“ 要获取的参数名”)。

  • @RequestParam: 标注在方法参数之前,用于对传入的参数做一些限制,支持三个属性:

    • value:默认属性,用于指定前端传入的参数名称
    • required:用于指定此参数是否必传
    • defaultValue:当参数为非必传参数且前端没有传入参数时,指定一个默认值
  • @ControllerAdvice 标注在一个类上,表示该类是一个全局异常处理的类。

  • @ExceptionHandler(Exception.class) 标注在异常处理类中的方法上,表示该方法可以处理的异常类型。

谈一下 SpringMVC 统一异常处理的思想和实现方式

使用 SpringMVC 之后,代码的调用者是 SpringMVC 框架,也就是说最终的异常会抛到框架中,然后由框架指定异常处理类进行统一处理

  • 方式一: 创建一个自定义异常处理器(实现 HandlerExceptionResolver 接口),并实现里面的异常处理方法,然后将这个类交给 Spring 容器管理
  • 方式二: 在类上加注解(@ControllerAdvice)表明这是一个全局异常处理类,在方法上加注解 (@ExceptionHandler), 在 ExceptionHandler 中有一个value 属性,可以指定可以处理的异常类型

在 SpringMVC 中, 如果想通过转发将数据传递到前台,有几种写法?

  • 方式一:直接使用 request 域进行数据的传递

    request.setAttirbuate(“name”, value);

  • 方式二:使用 Model 进行传值,底层会将数据放入 request 域进行数据的传递

    model.addAttribuate(“name”, value);

  • 方式三:使用 ModelMap 进行传值,底层会将数据放入 request 域进行数据的传递

    modelmap.put(“name”,value);

  • 方式四:借用 ModelAndView 在其中设置数据和视图

    mv.addObject(“name”,value);

    mv.setView(“success”);

    return mv;

在 SpringMVC 中拦截器的使用步骤是什么样的?

  1. 定义拦截器类:

    SpringMVC 为 我 们 提 供 了 拦 截 器 规 范 的 接 口 , 创 建 一 个 类 实 现HandlerInterceptor,重写接口中的抽象方法;

    preHandle 方法:在调用处理器之前调用该方法,如果该方法返回 true 则请求继续向下进行,否则请求不会继续向下进行,处理器也不会调用

    postHandle 方法:在调用完处理器后调用该方法

    afterCompletion 方法:在前端控制器渲染页面完成之后调用此方法

  2. 注册拦截器:

    在 SpringMVC 核心配置文件中注册自定义的拦截器

在 SpringMVC 中文件上传的使用步骤是什么样的? 前台三要素是什么?

文件上传步骤:

  • 加入文件上传需要的 commons-fileupload 包
  • 配置文件上传解析器,springmvc 的配置文件的文件上传解析器的 id 属性必须为multipartResolver
  • 后端对应的接收文件的方法参数类型必须为 MultipartFile,参数名称必须与前端的 name 属性保持一致

文件上传前端三要素:

  • form 表单的提交方式必须为 post
  • enctype 属性需要修改为:multipart/form-data
  • 必须有一个 type 属性为 file 的 input 标签,其中需要有一个 name 属性;如果需要上传多个文件需要添加 multiple 属性

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

  • (1)解决 post 请求乱码问题:在 web.xml 中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8;

  • (2) get 请求中文参数出现乱码解决方法有两个:

    修改 tomcat 配置文件添加编码与工程编码一致

    另外一种方法对参数进行重新编码:

String userName= new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),”utf-8”)
ISO8859-1 是 tomcat 默认编码,需要将 tomcat 编码后的内容按 utf-8 编码。

CATALOG
  1. 1. 谈一下你对 SpringMVC 框架的理解
  2. 2. SpringMVC 主要组件
  3. 3. 谈一下 SpringMVC 的执行流程以及各个组件的作用
  4. 4. 3.4 说一下 SpringMVC 支持的转发和重定向的写法
  5. 5. SpringMVC 的常用注解
  6. 6. 谈一下 SpringMVC 统一异常处理的思想和实现方式
  7. 7. 在 SpringMVC 中, 如果想通过转发将数据传递到前台,有几种写法?
  8. 8. 在 SpringMVC 中拦截器的使用步骤是什么样的?
  9. 9. 在 SpringMVC 中文件上传的使用步骤是什么样的? 前台三要素是什么?
  10. 10. SpringMVC 中如何解决 GET|POST 请求中文乱码问题?