Spring全家桶(二)之SpringMVC总结
SpringMVC面试题
关于Spring,SpringMVC,SpringBoot三者的源码等解析,会在博客园上详细整理!
这个仅仅是面试题整理 SpringMVC工作原理
1、是否需要在类路径中使用spring-mvc.jar,或者是spring-core的一部分?
spring-mvc.jar不是spring-core的一部分,如果要在Java项目中使用Spring MVC框架,则必须在应用程序的类路径中包含spring-mvc.jar。在Java Web应用程序中,spring-mvc.jar通常放在/ WEB-INF / lib文件夹中。
2、什么是DispatcherServlet以及它用于什么?
DispatcherServlet是Front Controller设计模式的一个实现,它处理对Spring MVC应用程序的所有传入Web请求。前端控制器模式是Web应用程序中的常见模式,其作用是接收所有请求并将其路由到应用程序的不同组件以进行实际处理。
在Spring MVC的情况下,DispatcherServlet将Web请求路由到Spring MVC控制器。
在Spring MVC中,DispatcherServlet用于查找正确的Controler以处理请求,它在处理程序映射的帮助下执行,例如@RequestMapping注解。
它还负责将逻辑视图名称委派给ViewResolver,然后将呈现的响应发送到客户端。
3、DispatcherServlet如何通过应用程序上下文实例化?
DispatcherServlet由Tomcat或Jetty等Servlet容器实例化。必须将DispatcherServlet定义到web.xml文件中,如下所示。
可以看到load-on-startup标记为1,当Spring MVC应用程序部署到Tomcat或任何其他Servlet容器时,将实例化DispatcherServlet。在实例化期间,它会查找文件servlet-name-context.xml,然后初始化此文件中定义的bean。
4、Spring MVC中的root应用程序上下文是什么?怎么装载的?
在Spring MVC中,使用ContextLoaderListener加载的上下文称为“root”应用程序上下文,它属于整个应用程序,而使用DispatcherServlet初始化的应用程序上下文实际上是特定于该servlet。
从技术上讲,Spring MVC允许在Spring MVC Web应用程序中使用多个DispatcherServlet ,因此可能存在多个这样的上下文,每个上下文都针对相应的servlet,但是具有相同的根上下文。
5、@Controller注释的用途?如何在没有注释的情况下创建控制器?
@Controller是用来定义Controller的Spring MVC注释,但实际上它只是一个原型注释。甚至可以在没有@Controller的情况下通过使用@Component注释Spring MVC控制器类来创建控制器。请求映射到处理程序方法的实际工作是使用@RequestMapping注释来完成的。
6、什么是ContextLoaderListener,它的作用是什么?
ContextLoaderListener是一个监听器,这有助于引导Spring MVC的。顾名思义它加载并创建ApplicationContext,因此不必编写显式代码来创建它。应用程序上下文是Spring bean离开的地方。对于Web应用程序,有一个名为WebAppliationContext的子类。
ContextLoaderListener还将ApplicationContext的生命周期与ServletContext的生命周期联系起来。可以使用getServletContext()方法从WebApplicationContext获取ServletContext。
ContextLoaderListener是在web.xml中配置为监听器的,可以将它放在一个标记中,如下所示:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
部署Spring MVC Web应用程序时,Servlet容器创建了一个ContextLoaderListener类的实例,该类加载Spring的WebApplicationContext。
7、传入请求如何映射到控制器和方法?
有时也会问这个问题DispatcherServlet如何知道哪个Controller应该处理请求?
Spring使用处理程序映射将控制器与请求相关联,两个常用的处理程序映射是BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。
在BeanNameUrlHandlerMapping中,当请求url与bean的名称匹配时,bean定义中的类是将处理请求的控制器。
另一方面,在SimpleUrlHandlerMapping中,映射更明确。可以指定URL的数量,并且每个URL可以与控制器显式关联。
顺便说一句,如果你使用注释来配置Spring MVC,那么应该使用@RequestMapping注释将传入请求映射到控制器和处理程序方法。
还可以通过URI路径,查询参数,请求的HTTP方法以及请求中存在的HTTP标头配置@RequestMapping批注。
8、@RequestParam用于什么?
@RequestParam是一个Spring MVC注释,其被用于提取从URL中控制器的处理程序方法请求参数或查询参数,如下所示:
public String personDetail(@RequestParam("id")long id){
....
return "personDetails";
}
@RequestParam注释也支持数据类型转换,例如这里可以看到一个String被自动转换为long,但它也可能导致一个异常,如果查询参数不存在或类型不匹配的情况下 还可以使用requried = false使参数成为可选参数,例如@RequestParam(value ="id",required = false)
9、控制器方法的一些有效返回类型是什么?
Spring MVC中的控制器方法有许多可用的返回类型,这些方法由控制器内部的@RequestMapping注释。其中一些流行的是:
(1)String (2)void (3)View (4)ModelAndView (Class) (5)Model (Interface) (6)Map (7)HttpEntity<?> or ResponseEntity<?> (8)HttpHeaders
每种返回类型都有其特定用途。例如,如果使用的是String,则表示Controller只返回View Name,此视图名称将由ViewResolver解析。
如果不想返回任何视图名称,请提回返回类型void。如果要设置视图名称以及想要发送一些对象,请使用ModelAndView作为返回类型。
10、什么是模型?
Model再次是封装数据或输出以进行渲染的引用。始终创建模型并将其传递给Spring MVC中的视图。如果映射的控制器方法将Model作为方法参数,则Spring框架会自动将模型实例注入该方法。
注入模型上设置的任何属性都将保留并传递给View。以下是在Spring MVC中使用Model的示例:
public String personDetail(Model model){
...
model.addAttribute("name","Joe");
...
}
11、InternalResourceViewResolver有什么作用?
在Spring MVC中,ViewResolveer返回View以处理基于逻辑视图名称(由控制器提供)和语言环境输出呈现。这种方式控制器没有耦合到特定的视图技术,例如JSP或FreeMarker,它只返回逻辑视图名称。
InternalResourceViewResolver是在Spring MVC和DispatcherServlet中配置的默认View解析器用它来找到正确的视图。InternalResourceViewResolver用于呈现JSP(JstlView)。
它将前缀和后缀配置为逻辑视图名称,然后生成特定JSP的路径,如下所示:
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value = "/WEB-INF/" />
<property name = "suffix" value = ".jsp" />
</bean >
因此,如果Controller返回"hello"作为逻辑视图名称,则InternalViewResolver将返回/WEB-INF/hello。
Spring全家桶(二)之SpringMVC总结的更多相关文章
- Java秋招面试复习大纲(二):Spring全家桶+MyBatis+MongDB+微服务
前言 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了面试时主要考察的内容. 这里说「天方夜谭」 ...
- 10分钟详解Spring全家桶7大知识点
Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...
- 一文解读Spring全家桶 (转)
Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...
- Spring全家桶–SpringBoot Rest API
Spring Boot通过提供开箱即用的默认依赖或者转换来补充Spring REST支持.在Spring Boot中编写RESTful服务与SpringMVC没有什么不同.总而言之,基于Spring ...
- Spring全家桶系列–SpringBoot之AOP详解
//本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关 ...
- 【转】Spring全家桶
Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶.它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflo ...
- Spring全家桶——SpringBoot之AOP详解
Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方 ...
- Spring全家桶一一SpringBoot与Mybatis
Spring全家桶系列一一SpringBoot与Mybatis结合 本文授权"Java知音"独家发布. Mybatis 是一个持久层ORM框架,负责Java与数据库数据交互,也可以 ...
- Spring全家桶系列–SpringBoot渐入佳境
//本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 首发地址:https://www.javazhiyin.com/20913.html 萌新:小哥,我在实 ...
- Spring全家桶系列–[SpringBoot入门到跑路]
//本文作者:cuifuan Spring全家桶————[SpringBoot入门到跑路] 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻,这也是为什么 ...
随机推荐
- 欠你们的 → k8s 集群搭建,除夕奉上!
开心一刻 有一天,qq收到一个好友申请,验证消息上写的是:哥哥加我,我是妹妹 我以为是性骚扰,就没加,直接回了一句:我喜欢少妇 过了一会儿,姑姑就给我打了个电话:你妹妹qq加你,你怎么不同意,她想问你 ...
- py教学之字典
字典简介 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示: ...
- 垃圾收集器必问系列—CMS
本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 CSDN: 码农BookSea 应该相信,自己是生活的战胜者.--雨果 目录 CMS简介 运作过程 CMS的缺陷 处理器 ...
- 你想成为.Net 7的技术高手吗?来这里看看
前言: 你是否时常觉得,整天搞些Curd和增删改查.这些毫无意义的东西,完全是浪费生命.想要进阶,成为高手.却苦于找不到方法,没有一套系统性的东西. 有鉴于此,新建了一个群,方便大家一起交流和分享一些 ...
- FLASH-CH32F103替换STM32F103 FLASH快速编程移植说明
因CH32F103 相对于STM32F103 flash 操作多了快速编程模式,该文档说明主要目的是为了方便客户在原先ST 工程的基础上实现flash 快速编程模式的快速移植. 1.在stm32f10 ...
- 力扣每日一题2023.1.19---2299. 强密码检验器 II
如果一个密码满足以下所有条件,我们称它是一个 强 密码: 它有至少 8 个字符. 至少包含 一个小写英文 字母. 至少包含 一个大写英文 字母. 至少包含 一个数字 . ...
- JAVA虚拟机13-字节码指令简介
1.简介 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需的参数(称为操作数,Operand)构成.JVM指令=1字节 ...
- concurrent.futures之ThreadPoolExecutor python线程池代码实现方法
from concurrent.futures import ThreadPoolExecutor def main(i): print(i) THREAD_NUM = 20 # 线程数 with T ...
- P17_总结
能够知道如何创建小程序项目 微信开发者工具的使用.appID 的获取 能够清楚小程序项目的基本组成结构 app.js.app.json.app.wxss.pages 文件夹 能够知道小程序页面由几部分 ...
- 上篇 | 使用 🤗 Transformers 进行概率时间序列预测
介绍 时间序列预测是一个重要的科学和商业问题,因此最近通过使用基于深度学习 而不是经典方法的模型也涌现出诸多创新.ARIMA 等经典方法与新颖的深度学习方法之间的一个重要区别如下. 概率预测 通常,经 ...