摘要:
1、通俗易懂,适合小白
2、仅做面试复习用,部分来源网络,博文免费,知识无价,侵权请联系!
1. 什么是 Spring MVC 框架?
答案:Spring MVC 是 Spring 框架中的一个模块,是基于 Java 实现 MVC 设计模式的轻量级 Web 框架。它通过一套注解和接口,使 Web 应用的开发变得简单高效。
核心特点:
- 清晰的职责分离(控制器、模型、视图)
- 强大的注解支持
- 灵活的视图解析
- 与 Spring 生态无缝集成
2. Spring MVC 中常用的注解包含哪些?
答案:
- @Controller:标识控制器类
- @RequestMapping:映射请求路径
- @RequestParam:获取请求参数
- @PathVariable:获取路径变量
- @ResponseBody:直接返回数据而非视图
- @RestController:组合 @Controller + @ResponseBody
- @ModelAttribute:绑定模型数据
- @SessionAttributes:将模型数据存入 session
- @Valid:参数校验
示例:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// ...
}
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
// ...
}
}
3. Spring MVC 执行流程是什么?
答案:
- 用户发送请求到前端控制器 DispatcherServlet
- DispatcherServlet 调用 HandlerMapping 查找 Handler
- 返回 HandlerExecutionChain(包含 Handler 和拦截器)
- DispatcherServlet 调用 HandlerAdapter 执行 Handler
- Handler 执行完成后返回 ModelAndView
- DispatcherServlet 调用 ViewResolver 解析视图
- 返回 View 对象
- DispatcherServlet 渲染视图并返回响应
4. Spring MVC 如何解决请求中文乱码问题?
解决方案:
- 配置 CharacterEncodingFilter
- 设置 request/response 编码
- 配置 Tomcat server.xml 的 URIEncoding
示例:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
}
5. Spring MVC 请求转发和重定向有什么区别?
答案:
特性 | 转发 (forward) | 重定向 (redirect) |
---|---|---|
请求次数 | 1 次 | 2 次 |
URL 变化 | 不变 | 变化 |
数据共享 | 共享 request 域 | 不共享 |
实现方式 | return “forward:url” | return “redirect:url” |
效率 | 更高 | 较低 |
6. Spring MVC 中系统是如何分层?
答案:
- 表现层 (Presentation Layer):@Controller
- 业务逻辑层 (Service Layer):@Service
- 数据访问层 (DAO Layer):@Repository
- 模型层 (Model Layer):POJO/DTO
- 视图层 (View Layer):JSP/Thymeleaf 等
7. 如何开启注解处理器和适配器?
答案:
- XML 配置方式:
<mvc:annotation-driven/>
- Java 配置方式:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// ...
}
8. Spring MVC 如何设置重定向和转发?
示例:
@Controller
public class RedirectController {
// 转发
@GetMapping("/forward")
public String forward() {
return "forward:/target";
}
// 重定向
@GetMapping("/redirect")
public String redirect() {
return "redirect:/target";
}
}
9. Spring MVC 中函数的返回值是什么?
答案:
- String:视图名称
- ModelAndView:包含模型和视图信息
- void:直接写 response
- ResponseEntity:包含完整响应(状态码、头、体)
- @ResponseBody:直接返回数据
10. Spring MVC 中 @RequestMapping 注解都有哪些属性?
主要属性:
- value/path:映射路径
- method:请求方法(GET/POST等)
- params:请求参数条件
- headers:请求头条件
- consumes:请求内容类型
- produces:响应内容类型
示例:
@RequestMapping(
value = "/users/{id}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE
)
public User getUser(@PathVariable Long id) {
// ...
}
11. Spring MVC 控制器是单例的吗?
答案:默认是单例的,所有请求共享同一个控制器实例。因此控制器应避免使用非线程安全的成员变量。
12. RequestMethod 可以同时支持POST和GET请求访问吗?
答案:可以,通过 method 属性指定多个请求方法:
@RequestMapping(
value = "/users",
method = {RequestMethod.GET, RequestMethod.POST}
)
public String handleRequest() {
// ...
}
13. Spring MVC 中文件上传有哪些需要注意事项?
注意事项:
- 配置 MultipartResolver
- 表单 enctype=“multipart/form-data”
- 使用 @RequestParam MultipartFile 接收文件
- 限制文件大小
- 处理文件名安全
示例:
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
// 处理文件
}
return "redirect:/success";
}
14. Spring MVC 和 Struts2 有哪些区别?
答案:
特性 | Spring MVC | Struts2 |
---|---|---|
设计 | 基于方法 | 基于类 |
性能 | 更高 | 较低 |
拦截器 | HandlerInterceptor | Interceptor |
依赖注入 | 原生支持 | 需整合 |
REST支持 | 完善 | 有限 |
15. Spring MVC 中 @RequestMapping 注解用在类上有什么作用?
答案:为控制器中的所有方法提供统一的路径前缀,减少重复路径定义。
示例:
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/list") // 实际路径:/users/list
public String list() {
// ...
}
}
16. Spring MVC 中 @PathVariable 和 @RequestParam 有哪些区别?
答案:
特性 | @PathVariable | @RequestParam |
---|---|---|
来源 | URL 路径 | 请求参数 |
必需性 | 默认必需 | 可选(required=false) |
格式 | /users/{id} | /users?id=123 |
多值支持 | 不支持 | 支持(数组/List) |
17. Spring MVC 中如何进行异常处理?
解决方案:
- 使用 @ExceptionHandler
- 实现 HandlerExceptionResolver
- 使用 @ControllerAdvice
- 配置 SimpleMappingExceptionResolver
示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(500).body(e.getMessage());
}
}
18. Spring MVC 如何将 Model 中数据存放到 Session?
解决方案:
- 使用 @SessionAttributes
- 直接操作 HttpSession
示例:
@Controller
@SessionAttributes("user")
public class UserController {
@PostMapping("/login")
public String login(@ModelAttribute User user, Model model) {
model.addAttribute("user", user);
return "redirect:/home";
}
}
19. Spring MVC 如何与 Ajax 相互调用?
解决方案:
- 使用 @ResponseBody 或 @RestController
- 返回 JSON/XML 数据
- 前端使用 jQuery/Axios 等发送请求
示例:
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.findAll();
}
}
20. Spring MVC 中如何拦截 get 方式请求?
解决方案:
- 使用拦截器
- 在 @RequestMapping 指定 method=GET
示例:
@GetMapping("/users")
public String getUsers() {
// 只拦截GET请求
}
21. Spring MVC 控制器注解一般适用什么?可以适用什么替代?
答案:
- 主要注解:@Controller 或 @RestController
- 替代方案:
- 实现 Controller 接口(传统方式)
- 使用 @Component + @RequestMapping(不推荐)
22. Spring MVC 中拦截器如何使用?
答案:
- 实现 HandlerInterceptor 接口
- 注册拦截器
示例:
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 验证逻辑
return true; // 继续执行
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
23. Spring MVC 中如何实现拦截器?
答案:见第22题答案。
24. 说一说 Spring MVC 注解原理?
答案:Spring MVC 注解基于 Java 反射和动态代理实现:
- 启动时扫描带有注解的类
- 解析注解信息生成元数据
- 请求时通过 HandlerMapping 匹配处理器
- 通过 HandlerAdapter 执行方法
- 使用 HttpMessageConverter 处理参数和返回值
25. Spring MVC 中日期类型参数如何接收?
解决方案:
- 使用 @DateTimeFormat
- 自定义 Converter/Formatter
- 配置全局日期格式
示例:
@GetMapping("/events")
public String getEvents(@RequestParam @DateTimeFormat(pattern="yyyy-MM-dd") Date date) {
// ...
}
26. 说一说对 RESTful 的理解及项目中的使用?
答案:
RESTful 原则:
- 资源标识(URI)
- 统一接口(HTTP方法)
- 无状态
- 可缓存
- 分层系统
项目应用:
@RestController
@RequestMapping("/api/users")
public class UserRestController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// GET /api/users/1
}
@PostMapping
public User createUser(@RequestBody User user) {
// POST /api/users
}
}
27. Spring MVC 常用的注解有哪些?
答案:见第2题答案。
28. Spring MVC模块的作用是什么?
答案:提供基于 MVC 架构的 Web 应用开发支持,包括:
- 请求路由
- 参数绑定
- 视图解析
- 异常处理
- 数据验证
- 文件上传
29. 说一说 Spring MVC 都有哪些组件?
核心组件:
- DispatcherServlet:前端控制器
- HandlerMapping:请求映射
- HandlerAdapter:处理器适配器
- ViewResolver:视图解析器
- HandlerInterceptor:拦截器
- MultipartResolver:文件上传解析器
- LocaleResolver:国际化解析器
30. 简单介绍一下 WebApplicationContext?
答案:WebApplicationContext 是 ApplicationContext 的扩展,专为 Web 应用设计,提供:
- 访问 ServletContext
- 主题解析
- 多配置文件支持
- 与 Servlet API 集成
31. Spring 中 BeanFactory 与 ApplicationContext 的作用有哪些?
答案:
- BeanFactory:基础 IoC 功能
- ApplicationContext:
- 继承 BeanFactory 所有功能
- 提供消息资源处理
- 事件发布
- 与 Web 环境集成
- 更方便的资源访问
32. handler method 参数绑定常用注解,处理 Request 内容部分分为哪四类?
答案:
常用注解:
- @RequestParam
- @PathVariable
- @RequestBody
- @ModelAttribute
Request 内容分类:
- URL 参数
- 路径变量
- 请求体
- 请求头
33. Spring MVC 框架的特点都有哪些?
答案:
- 清晰的 MVC 分层
- 强大的注解支持
- 灵活的视图技术
- 与 Spring 集成
- REST 支持
- 可扩展设计
- 国际化支持
- 主题支持