不用多说,这里是我从Java访谈中常见的一些常见问题的Spring MVC问题列表,特别是来自Web开发职位。
答案:MVC是Model-View-Controller设计模式的缩写。该模式基于关注点分离设计原理,该原理促进处理不同层的不同功能以及层之间的松散耦合。
在MVC模式中,模型包含由View和Controler帮助在请求处理和路由中呈现的数据。
两个模型都不知道View,或View不依赖于Model,这意味着相同的模型可以由不同的视图呈现,例如JSP或FreeMarker,或者甚至可以在RESTful Web服务的情况下编写为JSON或XML。您可以在我个人讲解的手写SpringMVC源码中了解有关MVC的更多信息 。如果您对Spring很认真,那么这就是您应该查看的课程。关注我,私信回复“架构资料”即可。
spring-mvc.jar不是spring-core的一部分,这意味着如果要在Java项目中使用Spring MVC框架,则必须在应用程序的类路径中包含spring-mvc.jar。在Java Web应用程序中,spring-mvc.jar通常放在/ WEB-INF / lib文件夹中。
这 DispatcherServlet 是Front Controller设计模式的一个实现,它处理Spring MVC应用程序的所有传入Web请求。前端控制器模式是Web应用程序中的常见模式,其作用是接收所有请求并将其路由到应用程序的不同组件以进行实际处理。
对于Spring MVC, DispatcherServlet 路由Web请求Spring MVC控制器。
在Spring MVC中, DispatcherServlet 用于查找正确的Controller来处理请求,它在处理程序映射的帮助下完成,例如 @RequestMapping 注释。
它还负责将逻辑视图名称委派 ViewResolver 给客户端,然后将呈现的响应发送到客户端。
不,它 DispatcherServlet 是由像Tomcat或Jetty这样的Servlet容器实例化的。您必须将其定义 DispatcherServlet 到web.xml文件中,如下所示。
您可以看到 load-on-startup 标记为1,这意味着 DispatcherServlet 在将Spring MVC应用程序部署到Tomcat或任何其他Servlet容器时会实例化。在实例化期间,它会查找文件servlet-name-context.xml,然后初始化此文件中定义的bean。
在Spring MVC中,使用的上下文 ContextLoaderListener 称为“根”应用程序上下文,它属于整个应用程序,而初始化使用的上下文 DispatcherServlet 实际上是特定于该servlet的。
从技术上讲,Spring MVC允许 DispatcherServlet 在Spring MVC Web应用程序中使用多个,因此,多个上下文分别针对相应的servlet。但是,可能存在相同的根上下文。您可以进一步查看 关于Pluralsight的Spring MVC课程简介,以了解有关Spring基础知识的更多信息。
这 @Controller 是一个用于定义Controller的Spring MVC注释,但实际上,它只是一个刻板印象注释。您甚至可以使用@Controller 注释创建一个控制器而无需 注释Spring MVC Controller类 @Component 。请求映射到处理程序方法的实际工作是使用@RequestMapping 注释完成的 。
这 ContextLoaderListener 是一个有助于引导Spring MVC的监听器。顾名思义,它会加载并创建 ApplicationContext, 因此您不必编写显式代码来创建它。
应用程序上下文是Spring bean离开的地方。对于Web应用程序,有一个名为的子类 WebAppliationContext。
该 ContextLoaderListener 还关系的生命周期 ApplicationContext 到的生命周期 ServletContext。你可以 ServletContext 从 WebApplicationContext 使用 getServletContext() 方法中获得。
将 ContextLoaderListener 在web.xml中为收听配置,你把一个标签内,如下图所示:
< 听众>
< listener-class >
org.springframework.web.context.ContextLoaderListener
listener-class >
listener >
部署Spring MVC Web应用程序时,Servlet容器创建了一个ContextLoaderListener 类的实例,该实例 加载了Spring WebApplicationContext。您还可以看到 Spring MVC的初学者 ,以了解更多有关 ContextLoaderListener 和 WebApplicationContext 与他们的Spring MVC中的作用。
有时,还会问这个问题:如何 DispatcherServlet 知道哪个Controller应该处理请求?嗯,答案在于称为处理程序映射的东西。
Spring使用处理程序映射将控制器与请求相关联。两个常用的处理程序映射是 BeanNameUrlHandlerMapping 和 SimpleUrlHandlerMapping。
在 BeanNameUrlHandlerMapping,当请求URL与bean的名称匹配时,bean定义中的类是将处理请求的控制器。
另一方面, SimpleUrlHandlerMapping映射更明确。您可以指定URL的数量,并且每个URL可以与控制器显式关联。
如果您正在使用注释来配置Spring MVC,则应使用注释将 @RequestMapping 传入请求映射到控制器和处理程序方法。
您还可以@RequestMapping 通过URI路径,查询参数,请求的HTTP方法以及请求中存在的HTTP标头来配置 注释。
这 @RequestParam 是一个Spring MVC注释,用于从Controller的处理程序方法中的URL中提取请求参数或查询参数,如下所示:
public String personDetail(@RequestParam(“id”)long id){
....
返回 “personDetails” ;
}
该 @RequestParam 注释还支持数据类型转换,例如,你可以在这里看到一个字符串转换为自动登录,但它也可以导致一个异常,如果查询参数不存在或类型不匹配的情况。您还可以使用requried = false使参数可选,例如 @RequestParam (value =“id”,required = false)
尽管两者 @RequestParam 和 @PathVariable 注释都用于从URL中提取一些数据,但它们之间存在关键差异。
将 @RequestParam 用于提取查询参数后,例如什么“?” 在URL中, @PathVariable 用于提取URI本身的一部分。例如,如果给定的URL是http:// localhost:8080 / SpringMVC / books / 3232233 /?format = json,那么您可以使用@RequestParam 注释和/ books / {id}使用 @PathVariable,访问查询参数“format” ,哪个会给你3232233。
这是另一个例子 @PathVariable:
@RequestMapping(“/ persons / {id}”)
public String personDetail(@PathVariable(“id”)long id){...}
此代码可以从/ persons / 123中提取person id = 123。它特别用于 RESTful Web服务, 因为它们的ID通常是URI或URL路径的一部分。
Spring MVC中的控制器方法有许多返回类型,它们由@RequestMapping 控制器内部注释 。一些流行的是:
串
空虚
视图
ModelAndView(Class)
型号(接口)
地图
HttpEntity <?>或ResponseEntity <?>
HttpHeaders
您可以在此处查看 Spring MVC控制器的有效返回类型的完整列表。
每种返回类型都有其特定用途。例如,如果您正在使用String,那么这意味着Controller将只返回视图名称,此视图名称将被解析 ViewResolver。
如果您不想返回任何视图名称,请提及返回类型void。如果要设置视图名称以及要发送对象,请将其 ModelAndView 用作返回类型。
A View 是Spring MVC应用程序中的一个接口,其实现负责呈现上下文和公开模型。单个视图公开多个模型属性。Spring MVC中的视图可以是bean。
它们很可能被a实例化为bean ViewResolver。由于此接口是无状态的,因此视图实现应该是线程安全的。通过使用 ViewResolver,可以将视图的逻辑名称解析为不同类型的 View 实现,例如, JstlView 用于显示FreeMarker和Velocity的JSP或其他视图实现。
如果您是Spring MVC的新手,并且不熟悉这些基础课程,那么我建议您通过加入其中一门免费的Spring课程来学习Spring 。那么哪里有免费的课程呢?可以关注我,私信回复:“架构资料”我这里有自己讲解的手写SpringMVC的课程供你参考学习。
右边 View 是由ViewResolver Spring MVC 选择的 。当Controller返回逻辑视图名称时 DispatcherServlet,它会查询 ViewResolver 以找到正确的名称 View。
的 ViewResolver,这取决于它的实施,解决了逻辑视图到物理资源,例如JSP页面或Freemarker模板。
例如, InternalResourceViewResolver 是一个默认值 ViewResolver ,它使用前缀和后缀将逻辑视图名称(例如“hello”)转换为“/WEB-INF/hello.jsp”。
Model 是用于封装数据或输出以进行渲染的引用。 Model 始终创建并传递给Spring MVC中的视图。如果映射的控制器方法具有 Model 方法参数,则 model Spring框架会自动将实例注入该方法。
注入模型上设置的任何属性都会被保留并传递给 View。以下是在Spring MVC中使用Model的示例:
public String personDetail(Model model){
...
模特。addAttribute(“name”,“Joe”);
...
}
您需要访问 model View中的视图才能呈现输出。它 model 包含要呈现的数据。该 Model 控制器随附,其处理他们的客户机请求并封装输出成 Model 对象。
会话范围的目的是为HTTP会话创建bean的实例。这意味着如果相同的bean在会话中作用域,则可以为多个请求提供服务。您可以使用范围属性或@Scope Spring MVC应用程序中的注释来定义Spring bean的范围 。
单例作用域是Spring bean的默认作用域,即使在Web上下文中也是如此。其他三个Web上下文感知范围是请求,会话和全局会话,它们仅在Web应用程序感知ApplicationContext 对象中可用 。请参阅 Spring Master Class - Beginner to Expert 以了解有关ApplicationContext Spring的更多信息 。
在Spring MVC中,控制器是可测试的工件,因为它们不直接与任何View 技术耦合 。它们只返回一个逻辑 View 名称,可以轻松测试。
在Spring MVC中, ViewResolver 返回 View 基于逻辑视图名称(由控制器提供)和语言环境处理输出呈现。这样,Controller不会耦合到特定的视图技术,例如JSP或FreeMarker。它只返回逻辑视图名称。
InternalResourceViewResolver 是ViewResolver Spring MVC中配置的默认值 , DispatcherServlet 使用它来查找正确的视图。 InternalResourceViewResolver 用于呈现JSPs( 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.jsp,并将 DispatcherServlet 请求转发到此JSP页面进行渲染。
关于常见问题的Spring MVC面试问题,现在都是如此 。如果您知道这些问题的答案,那么您就拥有了Spring MVC框架及其不同组件的良好基础,例如 DispatcherServlet处理程序映射,控制器 Views和 Model。