Spring MVC-面试题(33)

发布于:2025-05-23 ⋅ 阅读:(18) ⋅ 点赞:(0)

摘要:
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 执行流程是什么?

答案

  1. 用户发送请求到前端控制器 DispatcherServlet
  2. DispatcherServlet 调用 HandlerMapping 查找 Handler
  3. 返回 HandlerExecutionChain(包含 Handler 和拦截器)
  4. DispatcherServlet 调用 HandlerAdapter 执行 Handler
  5. Handler 执行完成后返回 ModelAndView
  6. DispatcherServlet 调用 ViewResolver 解析视图
  7. 返回 View 对象
  8. DispatcherServlet 渲染视图并返回响应

4. Spring MVC 如何解决请求中文乱码问题?

解决方案

  1. 配置 CharacterEncodingFilter
  2. 设置 request/response 编码
  3. 配置 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 中系统是如何分层?

答案

  1. 表现层 (Presentation Layer):@Controller
  2. 业务逻辑层 (Service Layer):@Service
  3. 数据访问层 (DAO Layer):@Repository
  4. 模型层 (Model Layer):POJO/DTO
  5. 视图层 (View Layer):JSP/Thymeleaf 等

7. 如何开启注解处理器和适配器?

答案

  1. XML 配置方式:
<mvc:annotation-driven/>
  1. 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 中函数的返回值是什么?

答案

  1. String:视图名称
  2. ModelAndView:包含模型和视图信息
  3. void:直接写 response
  4. ResponseEntity:包含完整响应(状态码、头、体)
  5. @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 中文件上传有哪些需要注意事项?

注意事项

  1. 配置 MultipartResolver
  2. 表单 enctype=“multipart/form-data”
  3. 使用 @RequestParam MultipartFile 接收文件
  4. 限制文件大小
  5. 处理文件名安全

示例

@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 中如何进行异常处理?

解决方案

  1. 使用 @ExceptionHandler
  2. 实现 HandlerExceptionResolver
  3. 使用 @ControllerAdvice
  4. 配置 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?

解决方案

  1. 使用 @SessionAttributes
  2. 直接操作 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 相互调用?

解决方案

  1. 使用 @ResponseBody 或 @RestController
  2. 返回 JSON/XML 数据
  3. 前端使用 jQuery/Axios 等发送请求

示例

@RestController
@RequestMapping("/api")
public class ApiController {
    
    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.findAll();
    }
}

20. Spring MVC 中如何拦截 get 方式请求?

解决方案

  1. 使用拦截器
  2. 在 @RequestMapping 指定 method=GET

示例

@GetMapping("/users")
public String getUsers() {
    // 只拦截GET请求
}

21. Spring MVC 控制器注解一般适用什么?可以适用什么替代?

答案

  • 主要注解:@Controller 或 @RestController
  • 替代方案
    • 实现 Controller 接口(传统方式)
    • 使用 @Component + @RequestMapping(不推荐)

22. Spring MVC 中拦截器如何使用?

答案

  1. 实现 HandlerInterceptor 接口
  2. 注册拦截器

示例

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 反射和动态代理实现:

  1. 启动时扫描带有注解的类
  2. 解析注解信息生成元数据
  3. 请求时通过 HandlerMapping 匹配处理器
  4. 通过 HandlerAdapter 执行方法
  5. 使用 HttpMessageConverter 处理参数和返回值

25. Spring MVC 中日期类型参数如何接收?

解决方案

  1. 使用 @DateTimeFormat
  2. 自定义 Converter/Formatter
  3. 配置全局日期格式

示例

@GetMapping("/events")
public String getEvents(@RequestParam @DateTimeFormat(pattern="yyyy-MM-dd") Date date) {
    // ...
}

26. 说一说对 RESTful 的理解及项目中的使用?

答案
RESTful 原则

  1. 资源标识(URI)
  2. 统一接口(HTTP方法)
  3. 无状态
  4. 可缓存
  5. 分层系统

项目应用

@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 应用开发支持,包括:

  1. 请求路由
  2. 参数绑定
  3. 视图解析
  4. 异常处理
  5. 数据验证
  6. 文件上传

29. 说一说 Spring MVC 都有哪些组件?

核心组件

  1. DispatcherServlet:前端控制器
  2. HandlerMapping:请求映射
  3. HandlerAdapter:处理器适配器
  4. ViewResolver:视图解析器
  5. HandlerInterceptor:拦截器
  6. MultipartResolver:文件上传解析器
  7. LocaleResolver:国际化解析器

30. 简单介绍一下 WebApplicationContext?

答案:WebApplicationContext 是 ApplicationContext 的扩展,专为 Web 应用设计,提供:

  1. 访问 ServletContext
  2. 主题解析
  3. 多配置文件支持
  4. 与 Servlet API 集成

31. Spring 中 BeanFactory 与 ApplicationContext 的作用有哪些?

答案

  • BeanFactory:基础 IoC 功能
  • ApplicationContext
    • 继承 BeanFactory 所有功能
    • 提供消息资源处理
    • 事件发布
    • 与 Web 环境集成
    • 更方便的资源访问

32. handler method 参数绑定常用注解,处理 Request 内容部分分为哪四类?

答案
常用注解

  1. @RequestParam
  2. @PathVariable
  3. @RequestBody
  4. @ModelAttribute

Request 内容分类

  1. URL 参数
  2. 路径变量
  3. 请求体
  4. 请求头

33. Spring MVC 框架的特点都有哪些?

答案

  1. 清晰的 MVC 分层
  2. 强大的注解支持
  3. 灵活的视图技术
  4. 与 Spring 集成
  5. REST 支持
  6. 可扩展设计
  7. 国际化支持
  8. 主题支持