Spring MVC企业面试题



一.简要概述一下Spring MVC框架?

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
Spring MVC 角色划分清晰,分工明细。由于 Spring MVC 本身就是 Spring 框架的一部分,可以说和 Spring 框架是无缝集成。性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架,最热门的开发技能。

二.介绍一下MVC设计模式?

MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。
spring+jsp+servlet

三 请举例通过一个demo建立简单的spring mvc程序?

创建步骤

  1. 创建 Web 应用并引入 JAR 包,本教程 Spring 使用版本为 5.2.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>springMVC</display-name>
<!-- 部署 DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 表示容器再启动时立即加载servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 处理所有URL -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
  1. Spring MVC 配置:在 web.xml 中配置 Servlet,创建 Spring MVC 的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
在 WEB-INF 目录下创建 springmvc-servlet.xml 文件,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- LoginController控制器类,映射到"/login" -->
<bean name="/login"
class="net.biancheng.controller.LoginController"/>
<!-- LoginController控制器类,映射到"/register" -->
<bean name="/register"
class="net.biancheng.controller.RegisterController"/>
</beans>
  1. 创建 Controller(处理请求的控制器)
  2. 创建 View(本教程使用 JSP 作为视图)
  3. 部署运行

四 介绍一下Spring MVC视图解析器(ViewResolver)?

视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象。
Spring MVC 提供了很多视图解析类,其中每一项都对应 Java Web 应用中特定的某些视图技术。下面介绍一些常用的视图解析类。

  1. URLBasedViewResolver
    UrlBasedViewResolver 通过 prefix 属性指定前缀,suffix 属性指定后缀。当 ModelAndView 对象返回具体的 View 名称时,它会将前缀 prefix 和后缀 suffix 与具体的视图名称拼接,得到一个视图资源文件的具体加载路径,从而加载真正的视图文件并反馈给用户。
    使用 UrlBasedViewResolver 除了要配置前缀和后缀属性之外,还需要配置“viewClass”,表示解析成哪种视图。示例代码如下。

    1
    2
    3
    4
    5
    6
    7
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">            
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/> <!--不能省略-->
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
    </bean>

    上述 viewClass 值为 InternalResourceViewResolver,它用来展示 JSP 页面。如果需要使用 jstl 标签展示数据,将 viewClass 属性值指定为 JstlView 即可。

  2. InternalResourceViewResolver
    [^1]: InternalResourceViewResolver 为“内部资源视图解析器”,是日常开发中最常用的视图解 析器类型。它是 URLBasedViewResolver 的子类,拥有 URLBasedViewResolver 的一切特性。
    使用 InternalResourceViewResolver 视图解析时,无需再单独指定 viewClass 属性。示例代码如下。

    1
    2
    3
    4
    5
    6
    7
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/> <!--可以省略-->
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
    </bean>
  3. FreeMarkerViewResolver

    [^2]: FreeMarkerViewResolver 最终会解析逻辑视图配置,返回 freemarker 模板。不需要指定 viewClass 属性。
    FreeMarkerViewResolver 配置如下。

    1
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">    <property name="prefix" value="fm_"/>    <property name="suffix" value=".ftl"/></bean>

五 介绍一下Spring MVC执行流程?

Spring MVC执行流程
SpringMVC 的执行流程如下。

  1. 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
  2. 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
  3. DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
  4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
  5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
  6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
  7. DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
  8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
  9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
  10. 视图负责将结果显示到浏览器(客户端)。

六 介绍一下Spring MVC @Controller和@RequestMapping注解?

  1. Controller注解
    @Controller 注解用于声明某类的实例是一个控制器。例如,在 net.biancheng.controller 包中创建控制器类 IndexController,示例代码如下。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
       package net.biancheng.controller;
    import org.springframework.stereotype.Controller;
    @Controller
    public class IndexController {
    // 处理请求的方法
    }
    2. RequestMapping注解
    一个控制器内有多个处理请求的方法,如 UserController 里通常有增加用户、修改用户信息、删除指定用户、根据条件获取用户列表等。每个方法负责不同的请求操作,而 @RequestMapping 就负责将请求映射到对应的控制器方法上。
    在基于注解的控制器类中可以为每个请求编写对应的处理方法。使用 @RequestMapping 注解将请求与处理方法一 一对应即可。
    @RequestMapping 注解可用于类或方法上。用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。

    ## 七 说说Spring MVC传递参数的几种方式?
    Spring MVC Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合。主要有以下几种方式:
    1. 通过实体 Bean 接收请求参数
    2. 通过处理方法的形参接收请求参数
    3. 通过 HttpServletRequest 接收请求参数
    4. 通过 @PathVariable 接收 URL 中的请求参数
    5. 通过 @RequestParam 接收请求参数
    6. 通过 @ModelAttribute 接收请求参数

    ## 八 叙述一下Spring MVC重定向和转发?它们是怎么实现的?
    Spring MVC 请求方式分为转发、重定向 2 种,分别使用 forward 和 redirect 关键字在 controller 层进行处理。
    在 Spring MVC 框架中,重定向与转发的示例代码如下:
    ```java
    package net.biancheng.controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;

    @Controller
    @RequestMapping("/index")
    public class IndexController {
    @RequestMapping("/login")
    public String login() {
    //转发到一个请求方法(同一个控制器类可以省略/index/)
    return "forward:/index/isLogin";
    }

    @RequestMapping("/isLogin")
    public String isLogin() {
    //重定向到一个请求方法
    return "redirect:/index/isRegister";
    }

    @RequestMapping("/isRegister")
    public String isRegister() {
    //转发到一个视图
    return "register";
    }
    }

九 说说Spring MVC @Autowired和@Service注解?

将依赖注入到 Spring MVC 控制器时需要用到 @Autowired 和 @Service 注解。
@Autowired 注解属于 org.springframework.beans.factory. annotation 包,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
@Service 注解属于 org.springframework.stereotype 包,会将标注类自动注册到 Spring 容器中。
在配置文件中需要添加 元素来扫描依赖基本包。
<context:component-scan base-package=“net.biancheng.service”/>

十 说说Spring MVC @ModelAttribute注解?

在 Controller 中使用 @ModelAttribute 时,有以下几种应用情况。

  1. 应用在方法上
    1. 应用在无返回值的方法

      
      

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ModelAttributeController {
// 方法无返回值
@ModelAttribute
public void myModel(@RequestParam(required = false) String name, Model model) {
model.addAttribute(“name”, name);
}

@RequestMapping(value = "/model")
public String model() {
    return "index";
}

}
2. 应用在有返回值的方法


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ModelAttributeController {
 // 方法有返回值
 @ModelAttribute("name")
 public String myModel(@RequestParam(required = false) String name) {

     return name;
 }
 
 @RequestMapping(value = "/model")
 public String model() {
     return "index";
 }
}
2. 应用在方法的参数上
 @ModelAttribute 注解在方法的参数上,调用方法时,模型的值会被注入。这在实际使用时非常简单,常用于将表单属性映射到模型对象。
3. 应用在方法上,并且方法也使用了 @RequestMapping
@ModelAttribute 和 @RequestMapping 注解同时应用在方法上时,有以下作用:
1. 方法的返回值会存入到 Model 对象中,key 为 ModelAttribute 的 value 属性值。
2. 方法的返回值不再是方法的访问路径,访问路径会变为 @RequestMapping 的 value 值,例如:@RequestMapping(value = "/index") 跳转的页面是 index.jsp 页面。