WHCSRL 技术网

30000字 SpringMVC必读(推荐收藏)

有粉丝朋友去培训机构了,花了两三万,结果了?

也没学多少东西。

好多培训机构都在盗我的项目,可惜我时间有限,没时间追究他们。

其实培训机构的东西就那样,谈不上不好,只是多个学习的氛围。

很多的技术知识点、路线和项目我已经整理好了,帮你省去2w的费用。

 

首先看下整理的Java的学习路线:

这套路线包含了基础到就业,基本是全栈的路线,有前端、后端、微服务、小程序、安卓。到最后手撕源码。

如果你能搞完,你就是大神中的大神了。 

前面分享了一个Redis的面试题:

Redis面试题全面掌握

今天复习下SpringMVC的面试题。

目录

1,Spring MVC 框架有什么用?

2,Spring MVC 的处理流程?

3,可以描述一下 DispatcherServlet 的工作流程吗?

4,Spring MVC 有哪些组件?

5,Spring MVC 的相关注解有哪些?

6,如何解决 POST 请求和 GET 请求中文乱码问题?

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

8,SpringMVC 怎么和AJAX相互调用的?

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

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

11,怎么样把ModelMap里面的数据放入Session里面?

12,请说下Springmvc的优点有哪些?


1,Spring MVC 框架有什么用?

Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。

MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

2,Spring MVC 的处理流程?

Web 容器启动时会通知 Spring 初始化容器,加载 Bean 的定义信息并初始化所有单例 Bean,然后遍历容器中的 Bean,获取每⼀个 Controller 中的所有⽅法访问的 URL,将 URL 和对应的 Controller 保存 到⼀个 Map 集合中。

所有的请求会转发给 DispatcherServlet 前端处理器处理,DispatcherServlet 会请求 HandlerMapping

找出容器中被Controler注解修饰的 Bean 以及被RequestMapping修饰的⽅法和类,⽣成Handler 和 HandlerInterceptor 并以⼀个 HandlerExcutionChain 处理器执⾏链的形式返回。

之后 DispatcherServlet 使⽤ Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调⽤Handler 的⽅法,将请求参数绑定到⽅法的形参上,执⾏⽅法处理请求并得到 ModelAndView。

最后 DispatcherServlet 根据使⽤ ViewResolver 试图解析器对得到的 ModelAndView 逻辑视图进⾏解析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。

3,可以描述一下 DispatcherServlet 的工作流程吗?

DispatcherServlet 的工作流程可以用一幅图来说明:

image.png

1,向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。

2,DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以HandlerExecutionChain 对象的形式返回。

3,DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的 preHandler(…)方法)。

4,提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:

HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。

数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。

数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。

数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。

5. Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;

6. 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的ViewResolver)返回给DispatcherServlet。

7. ViewResolver 结合Model和View,来渲染视图。

8. 视图负责将渲染结果返回给客户端。

4,Spring MVC 有哪些组件?

DispatcherServlet :SpringMVC 中的前端控制器,是整个流程控制的核⼼,负责接收请求并转发给对应的处理组件。

Handler :处理器,完成具体业务逻辑,相当于 Servlet 或 Action。

HandlerMapping :完成 URL 到 Controller 映射,DispatcherServlet 通过 HandlerMapping 将不同请求映射到不同 Handler。

HandlerInterceptor :处理器拦截器,是⼀个接⼝,如果需要完成⼀些拦截处理,可以实现该接⼝。

HandlerExecutionChain :处理器执⾏链,包括两部分内容:Handler 和 HandlerInterceptor。

HandlerAdapter :处理器适配器,Handler执⾏业务⽅法前需要进⾏⼀系列操作,包括表单数据验证、数据类型转换、将表单数据封装到JavaBean等,这些操作都由 HandlerAdapter 完成。 DispatcherServlet 通过 HandlerAdapter 来执⾏不同的 Handler。

ModelAndView :装载模型数据和视图信息,作为 Handler 处理结果返回给 DispatcherServlet。

ViewResolver :视图解析器,DispatcherServlet 通过它将逻辑视图解析为物理视图,最终将渲染的结果响应给客户端。

5,Spring MVC 的相关注解有哪些?

@Controller :在类定义处添加,将类交给IoC容器管理。

@RequtestMapping :将URL请求和业务⽅法映射起来,在类和⽅法定义上都可以添加该注解。 value 属性指定URL请求的实际地址,是默认值。 method 属性限制请求的⽅法类型,包括GET、POST、PUT、DELETE等。如果没有使⽤指定的请求⽅法请求URL,会报405 Method Not Allowed 错误。 params 属性限制必须提供的参数,如果没有会报错。

@RequestParam :如果 Controller ⽅法的形参和 URL 参数名⼀致可以不添加注解,如果不⼀致可以使⽤该注解绑定。 value 属性表示HTTP请求中的参数名。 required 属性设置参数是否必要,默认false。 defaultValue 属性指定没有给参数赋值时的默认值。

@PathVariable :Spring MVC ⽀持 RESTful ⻛格 URL,通过的绑定。

 通过PathVariable完成请求参数与形参的绑定。

6,如何解决 POST 请求和 GET 请求中文乱码问题?

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

image.png

GET 请求中出现中文乱码,讲真在url 中传递中文,就不是什么明智之举,最好不要这用做!

但是事情已经发生了,总得要解决的:

1,修改 Tomcat 配置文件;

2,在拼接 url 的时候先做一个编码工作,然后将编码后生成的 url 进行拼接,之后再发送请求,然后再服务端拿到数据后做一次反编码的工作;

3,最好就是定义一个字典,在发送 url 的get 请求之前先查询一下要拼接的 中文 字段对应的字典值,然后用字典值进行传输,完事了再在服务端做解析;

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

是单例模式,之前在 Spring 篇章里面有说过控制层和Service 层以及 DAO 层一般是无状态的实例,不涉及数据的增删改等操作,只有简单的查询操作,那么就是线程安全的。

所以解决方案就是:在控制器里面不要写可变的状态量,如果需要这些可变的状态量,那么可以通过 ThreadLocal 进行解决,为每个线程提供一个独立的变量副本,进行数据操作。

8,SpringMVC 怎么和AJAX相互调用的?

通过 Jackson 框架可以将 Java 中的对象直接转换为 json 对象:

1,加入 Jackson.jar 包;

2,在配置文件中配置 json 的映射;

3,在接受 ajax 方法里面可以直接返回对象,但是需要使用 @ResponseBody 注解。

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

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

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

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

11,怎么样把ModelMap里面的数据放入Session里面?

可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。

12,请说下Springmvc的优点有哪些?

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

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

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

(4)支持各种请求资源的映射策略。

求个三连,点赞,收藏,更多干货的更新ing: 

为了帮助大家快速面试,整理了很多的面试干货题和项目。

​​​​​​​👇🏻 干货可通过搜索下方 公众号 获取👇🏻

springmeng
微信公众号
分享算法、java、springboot、微服务等项目
推荐阅读