Spring MVC企业面试题
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 的定义比较清晰,就是用户界面。
三 请举例通过一个demo建立简单的spring mvc程序?
创建步骤
- 创建 Web 应用并引入 JAR 包,本教程 Spring 使用版本为 5.2.3
1 | <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- Spring MVC 配置:在 web.xml 中配置 Servlet,创建 Spring MVC 的配置文件
1 | 在 WEB-INF 目录下创建 springmvc-servlet.xml 文件,如下所示。 |
- 创建 Controller(处理请求的控制器)
- 创建 View(本教程使用 JSP 作为视图)
- 部署运行
四 介绍一下Spring MVC视图解析器(ViewResolver)?
视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象。
Spring MVC 提供了很多视图解析类,其中每一项都对应 Java Web 应用中特定的某些视图技术。下面介绍一些常用的视图解析类。
-
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 即可。
-
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> -
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执行流程?
SpringMVC 的执行流程如下。
- 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
- 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
- DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
- HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
- Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
- HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
- DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
- ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
- DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
- 视图负责将结果显示到浏览器(客户端)。
六 介绍一下Spring MVC @Controller和@RequestMapping注解?
- 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
50package net.biancheng.controller;
import org.springframework.stereotype.Controller;
public class IndexController {
// 处理请求的方法
}
2. RequestMapping注解
一个控制器内有多个处理请求的方法,如 UserController 里通常有增加用户、修改用户信息、删除指定用户、根据条件获取用户列表等。每个方法负责不同的请求操作,而 就负责将请求映射到对应的控制器方法上。
在基于注解的控制器类中可以为每个请求编写对应的处理方法。使用 注解将请求与处理方法一 一对应即可。
注解可用于类或方法上。用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。
## 七 说说Spring MVC传递参数的几种方式?
Spring MVC Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合。主要有以下几种方式:
1. 通过实体 Bean 接收请求参数
2. 通过处理方法的形参接收请求参数
3. 通过 HttpServletRequest 接收请求参数
4. 通过 接收 URL 中的请求参数
5. 通过 接收请求参数
6. 通过 接收请求参数
## 八 叙述一下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;
public class IndexController {
public String login() {
//转发到一个请求方法(同一个控制器类可以省略/index/)
return "forward:/index/isLogin";
}
public String isLogin() {
//重定向到一个请求方法
return "redirect:/index/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 时,有以下几种应用情况。
- 应用在方法上
-
应用在无返回值的方法
-
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 页面。