关于springmvc的面试经验分享

2023-11-18

1 什么是 Spring MVC?

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

2 什么是 MVC 模型?
在这里插入图片描述
用户的请求会到达 Servlet,然后根据请求调用相应的 Java Bean,并把所有的显示结果交给 JSP 去完成,这样的模式我们就称为 MVC 模式。

M 代表 模型(Model):数据,dao,bean

V 代表 视图(View):网页,JSP,用来展示模型中的数据

C 代表 控制器(controller):把不同的数据(Model),显示在不同的视图(View)上,Servlet 扮演的就是这样的角色

3 Spring MVC 的优点?

可以支持各种视图技术,而不仅仅局限于 JSP

与 Spring 框架集成(如 IoC 容器、AOP 等)

清晰的角色分配:前端控制器(dispatcherServlet),请求到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)

支持各种请求资源的映射策略

4 Spring MVC 和 struts2 的区别?

springmvc 的入口是一个 servlet 即前端控制器(DispatchServlet),而 struts2 入口是一个 filter 过虑器(StrutsPrepareAndExecuteFilter)

springmvc 是基于方法开发(一个 url 对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例

Struts 采用值栈存储请求和响应的数据,通过 OGNL 存取数据,springmvc 通过参数解析器是将 request 请求内容解析,并给方法形参赋值,将数据和视图封装成 ModelAndView 对象,最后又将 ModelAndView 中的模型数据通过 reques 域传输到页面。Jsp 视图解析器默认使用 jstl

5 Spring MVC 的处理流程?
在这里插入图片描述
用户发送请求至前端控制器 DispatcherServlet

DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器

处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet

DispatcherServlet 通过 HandlerAdapter 处理器适配器调用处理器

执行处理器(Controller,也叫后端控制器)

Controller 执行完成返回 ModelAndView

HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet

DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器

ViewReslover 解析后返回具体 View

DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)

DispatcherServlet 响应用户

6 Spring MVC 十一个处理流程的详细解释?

浏览器发送请求,请求具体发到谁呢?先发到前端控制器,也就是说所有的请求都给发到前端控制器,前端控制器是所有请求的入口,但前端控制器不能处理业务请求,它只是一个请求的转发

谁来处理业务请求呢?Handler 处理器来真正处理业务请求,那么问题来了,前端控制器如何来找到这个 Handler 处理器呢?处理器映射器记录的就是请求的 url 和处理的方法之间的映射关系,这个映射关系是怎么建立起来的呢?就是通过 @RequestMapping 这个注解来建立起来的,这个映射关系就相当于一个 Map(key-value 这种形式),key 就是请求的 url,value 就是处理的 Handler。现在,前端控制器拿到这个请求之后,要找到对应的 Handler,怎么找呢?就要找处理器映射器,问它请求谁来处理?

处理器映射器会根据你请求的 url 来找对应的处理器,找不到就会报错,如果找到之后,这时,它就会返回一个处理器执行链,这个处理器执行链里面除了有 Handler 之外,还有拦截器(这儿我们可以开发自己的拦截器),然后返回给前端控制器

前端控制器依然不能处理这个业务请求,它这时做的还有另外一件事情,因为返回 Handler,它也不知道这个 Handler 是什么类型,因为在 springmvc 中 Handler 除了可以是注解形式的之外,其实还可以是非注解形式的(非注解形式我们一般不用),前端控制器并不知道这个 Handler 到底是什么类型的,那就没办法执行它,那总得找个东西执行,这时它就会把这个事交给另外一个组件来处理,这个组件就叫处理器适配器,这个处理器适配器就是来适配不同类型的 Handler。它就会根据你不同类型的 Handler 来选择不同类型的适配器来执行它

假如当前 Handler 是注解形式的,那么它就会选择注解形式的处理器适配器来执行这个 Handler。Handler 就执行了,也就是说我们 Controller 类中的那个方法就执行了,方法执行之后,里面的业务就处理了

业务处理之后,最后返回一个 ModelAndView。处理器适配器拿到这个结果是没有用的,它的作用就是执行这个 Handler,把这个 Handler 执行完之后,它的事就做完了

做完之后,拿到这个返回结果,那么它会原封不动地把这个返回结果扔给前端控制器,这时处理器适配器的事就做完了

前端控制器拿到这个 ModelAndView,它还是没有办法处理,它还是不能返回 html,这时它要找到相应的 jsp,因为 ModelAndView 即包含模型又包含视图,这个视图指定我们要用谁来渲染这个数据。我们要渲染数据,这时它就要找一个视图解析器来解析这个视图,由于这个视图也有很多种(我们最常见的视图是 jsp,除了 jsp,其实还有其他的,比如说还可以是报表,还可以是 pdf,还可以是 freemaker 等),它会找不同的视图解析器来处理。因为现在我们最常用的视图是 jsp,所以它就找到 jsp 对应的视图解析器

找到这个视图解析器,它来把这个视图解析,解析完了之后它会返回一个 View 对象

最后我们再调用这个视图解析器的渲染视图这个过程,渲染视图这个过程其实就是对于我们的 jsp 来说,就是把这个数据渲染成 html

最终渲染成 html 之后,就响应给用户

7 Spring MVC 的组件?

DispatcherServlet:前端控制器。用户请求到达前端控制器,它就相当于 mvc 模式中的 c,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性

HandlerMapping:处理器映射器。HandlerMapping 负责根据用户请求找到 Handler 即处理器,springmvc 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等

Handler:处理器。Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler

HandlAdapter:处理器适配器。通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行

ViewResolver:视图解析器。ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户

View:视图。SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等。我们最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面

其实,在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 springmvc 的三大组件。

8 Spring MVC 的重定向和转发?

转发:在返回值前面加 forward:

重定向:在返回值前面加 redirect:

9 Spring MVC 的异常处理 ?

系统的 dao、service、controller 出现异常都通过 throws Exception 向上抛出,最后由 Spring MVC 前端控制器交由异常处理器进行异常处理,Spring MVC 提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理
在这里插入图片描述
10 Spring MVC 的控制器是不是单例模式?存在什么问题?怎么解决?

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

11 Spring MVC 常用的注解?

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

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

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

12 Spring MVC 中控制器的注解?

一般用 @Controller 注解,也可以使用 @RestController。@RestController 注解相当于@ResponseBody + @Controller。

13 如何在拦截请求中拦截 get 方式提交的方法?

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

14 如何在方法中得到 Request 或 Session?

直接在方法的形参中声明 request,Spring MVC 就自动把 request 对象传入

15 如何在拦截的方法里得到从前台传入的参数?

直接在形参里面声明这个参数即可,但名字必须和传过来的参数一样

16 如果前台有很多个参数传入,并且这些参数都是一个对象的,如何得到这个对象?

直接在方法中声明这个对象即可,Spring MVC 就自动会把属性赋值到这个对象里面

17 Spring MVC 中函数的返回值是什么?

返回值可以有很多类型,例如 String,ModelAndView。ModelAndView 把视图和数据合并在一起,但一般用 String 比较好

18 Spring MVC 如何实现一个拦截器?

一是实现 HandlerInterceptor 接口,一是继承适配器类

需要更多Java相关学习以及面试资料私信笔者“Java”领取

另外喜欢这篇文章的可以给笔者点个赞,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于springmvc的面试经验分享 的相关文章

  • 【Python 1-17】Python手把手教程之——文件的读写以及I/O操作

    作者 弗拉德 来源 弗拉德 公众号 fulade me 从文件中读取数据 文本文件可存储的数据量很多 每当需要分析或修改存储在文件中的信息时 读取文件都很有用 对数据分析应用程序来说尤其 如此 例如 你可以编写一个这样的程序 读取一个文本文
  • 研发人员欠缺的“不要脸”文化

    一直感觉研发人员相对市场人员确实缺少点什么 今天听到一个原华为的人说华为的文化中有一个 不要脸 文化 讲的就是研发人员要特别注意的事项 特别说明 不要脸 三个字 据说是任正非认为这样好记 才取得名字 这三点是 抬头看路 找人问路 请人带路
  • 由先序中序,或后序中序,可以唯一确定二叉树;完全二叉树的顺序存储,c/c++描述

    这是课本里的 两个定理 由先序 根左右 后序 左右根 可以确定根节点是哪个 由中序 左根右 可以确定左子树和右子树的范围 所以我们也找到了二叉树的左子树和右子树的先序 或后序 和中序排列 由归纳法 可得出这个构造二叉树链表的方法 对于完全二
  • loadrunner负载生成器;

    负载生成器 Load Generators 是脚本生成的负载引擎 相当于加压机 主要功能是生成虚拟用户进行负载 在默认的情况下使用本地的负载生成器来运行脚本 但是每生成一个虚拟用户 需要话费负载生成器大约2M 3M的内存空间 通常运行CON

随机推荐

  • java8有哪些jvm参数

    Java8中的JVM参数有很多种 这里列出一些常用的 server 指定JVM运行在服务器模式 在服务器环境下性能会更好 Xmx 设置JVM最大可用内存 Xms 设置JVM初始内存 XX PermSize 设置持久代 Perm Gen 的初
  • Python常用库大全

    作者 史豹 链接 https www zhihu com question 20501628 answer 223340838 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 环境管理 管理 Python 版
  • Visual Studio 2017 远程调试器(MSVSMON.EXE) 找不到连接

    Visual Studio 2017 远程调试器 MSVSMON EXE 找不到连接 用的是wifi上网 而远程主机是有线连接 经过几个小时的排查 终于发现不在一个网段内 把wifi改成有线 确保和远程主机在一个网段内 就可以联上了
  • 【node】12、Koa实现简单爬虫案例

    效果图如下 首先我们新建文件夹 进入终端 初始化node项目 npm init y 安装koa搭建服务模块 npm install koa 安装superagent发送请求模块 npm install superagent 安装cheeri
  • 有关Proteus安装时的一些报错

    在安装Proteus的之后 使用的时候经常会出现 已使用符号sMKRORIGIN但未在库中找到 或者许多找不到文件在哪里的一些许多错误 我也是经常遇到 然后也是一点一点找资料解决 有时候这种方法能够解决 有时候又不能解决 确实很让人头疼 所
  • java: MySQL Metadata

    https www baeldung com jdbc database metadata https docs oracle com en java javase 11 docs api java sql java sql Databas
  • ant design pro v5 配置拦截器,header

    ant design pro v5 配置拦截器 header 1 资料文档 https umijs org zh CN plugins plugin request requestinterceptors 2 编写app tsx 我这里是自
  • 创建一个空的Git仓库,然后本地代码推上去

    这篇文章说的是如何将本地代码库推送到远端空的代码仓库 如需了解如何从远端代码仓库克隆代码到本地 看这里 1 创建代码仓库 2 终端进入本地代码库文件夹内 3 将本地和远端联系起来 并给远端起个名字 git remote add myOwnC
  • Hudi和Kudu的比较

    与Kudu相比 Kudu是一个支持OLTP workload的数据存储系统 而Hudi的设计目标是基于Hadoop兼容的文件系统 如HDFS S3等 重度依赖Spark的数据处理能力来实现增量处理和丰富的查询能力 Hudi支持Increme
  • 微信小程序WE分析----事件分析

    目录 web分析 小程序 事件分析概述 1 新增事件管理 事件参数说明 1 填写事件配置 2 小程序添加上报代码 将上报代码添加到小程序中 3 测试事件数据上报 测试事件上报的数据是否正确 属性管理 字典管理 新增事件分析 创建事件分析 添
  • Web自动化之Selenium常用操作

    本文总结使用selenium进行web UI自动化时 会用到的一些常用操作 定位元素 driver find element by xpath 1 绝对路径 2 元素属性 3 层级和属性结合 4 使用逻辑运算符 driver find el
  • 磁盘类型和相关术语学习笔记

    磁盘类型和相关术语 在 Linux 中一切皆文件 但是类型不同 例如使用 ls l 对于设备文件和普通文件有一部分内容是不同的 即普通文件有大小 而设备文件有主设备号和次设备号 没有大小 ll 1 txt dev sda dev sda1
  • TCP/IP、UDP协议

    TCP IP协议是Internet最基本的协议 Internet国际互联网络的基础 由网络层的IP协议和传输层的TCP协议组成 通俗而言 TCP负责发现传输的问题 一有问题就发出信号 要求重新传输 直到所有数据安全正确地传输到目的地 而IP
  • module ‘keras.api._v1.keras.datasets.mnist‘ has no attribute ‘train‘AttributeError: module ‘numpy‘ h

    AttributeError module numpy has no attribute no nep50 warning 尝试过更新numpy但是更新不了 module keras api v1 keras datasets mnist
  • 常见 Web 中间件及其漏洞概述(一):IIS

    目录 PUT漏洞 漏洞原理 复现 修复 短文件名猜解 漏洞原理 IIS短文件名产生 复现 短文件漏洞的局限性 IIS短文件名扫描工具 修复 远程代码执行 解析漏洞 IIS 6 0 基于文件名 基于目录名 IIS 7 0 7 5 IIS PH
  • docker容器内访问宿主机127.0.0.1服务

    docker容器内访问宿主机127 0 0 1服务 原创 技术生活 技术生活 2020 04 15 09 00 点击上方 技术生活 选择 设为星标 做积极的人 而不是积极废人 背景 原因分析 解决方案 背景 已经通过docker启动的ela
  • mac m1 搭建 arduino 环境

    前前后后弄了几次 arduino 环境 这次就以 mac m1 为例 来做一个笔记 搭建 arduino 首先 第一步肯定是安装 arduino 这直接去官网下载安装就好了 地址放在下面 https www arduino cc en so
  • Android 打包aar给unity3d使用 项目心得

    步骤 制作androidproject 修改build gradle配置 打包aar 1 混淆打包aar 2 jar包导出 3 在其他的android工程引入aar 导入unity项目 运行unity3d输出apk包 新建一个project
  • JAVA性能分析工具--Jvisualvm使用方法

    JDK自带的JAVA性能分析工具 它已经在你的JDK bin目录里了 只要你使用的是JDK1 6 Update7之后的版本 点击一下jvisualvm exe图标它就可以运行了 这里是VisualVM 的官方网站 https visualv
  • 关于springmvc的面试经验分享

    1 什么是 Spring MVC Spring MVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架 通过把 Model View Controller 分离 将 web 层进行职责解耦 把复杂的 w