springmvc热点面试题开胃菜
1. Spring MVC的核心组件有哪些?它们的作用是什么?
答案:
Spring MVC的核心组件包括以下部分,每个组件都有其特定的作用:
-
DispatcherServlet:
- 前端控制器,是Spring MVC的核心。它负责接收所有HTTP请求,并将请求分发给合适的处理器(Controller)。
- 它会根据请求信息查找合适的处理器,并调用处理器的相应方法处理请求。
-
HandlerMapping(处理器映射器):
- 用于将请求映射到具体的处理器(Controller)。
- 它根据请求的URL、HTTP方法等信息,找到对应的处理器方法。
- 常见的实现类包括
RequestMappingHandlerMapping
,它基于@RequestMapping
注解进行映射。
-
Controller(处理器):
- 用于处理具体的业务逻辑。
- 通常是一个带有
@Controller
注解的类,其中的方法通过@RequestMapping
等注解映射到特定的请求路径。 - 示例:
@Controller public class MyController { @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("message", "Hello, Spring MVC!"); return "hello"; } }
-
HandlerAdapter(处理器适配器):
- 用于执行处理器中的具体方法。
- 它会根据处理器的类型调用相应的方法,并处理方法的返回值。
- 常见的实现类包括
RequestMappingHandlerAdapter
,它支持注解驱动的控制器。
-
ViewResolver(视图解析器):
- 用于将逻辑视图名解析为具体的视图实现。
- 它会根据返回的视图名查找对应的视图模板(如JSP、Thymeleaf等)。
- 示例:
@Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; }
-
View(视图):
- 用于渲染最终的响应内容。
- 可以是JSP、Thymeleaf、Freemarker等模板引擎,也可以是JSON、XML等格式的响应。
Spring MVC的核心组件协同工作,实现了从请求接收、处理到响应的完整流程。DispatcherServlet
作为核心,通过HandlerMapping
找到处理器,HandlerAdapter
执行处理器方法,最后通过ViewResolver
渲染视图。
2. 如何在Spring MVC中实现文件上传?
答案:
在Spring MVC中实现文件上传需要以下步骤:
-
添加依赖:
- 确保项目中包含
commons-fileupload
依赖(Spring Boot中已包含)。 - 如果使用Maven,可以在
pom.xml
中添加:<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
- 确保项目中包含
-
配置文件上传解析器:
- 在Spring配置文件或Java配置类中,添加
CommonsMultipartResolver
:@Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10 * 1024 * 1024); // 设置最大上传大小(10MB) return resolver; }
- 在Spring配置文件或Java配置类中,添加
-
创建文件上传的Controller:
- 使用
@RequestParam
或@RequestPart
注解接收上传的文件:@Controller public class FileUploadController { @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file, Model model) { if (!file.isEmpty()) { try { // 保存文件到指定路径 Path path = Paths.get("uploads/"); Files.copy(file.getInputStream(), path.resolve(file.getOriginalFilename()), StandardCopyOption.REPLACE_EXISTING); model.addAttribute("message", "文件上传成功!"); } catch (IOException e) { model.addAttribute("message", "文件上传失败:" + e.getMessage()); } } else { model.addAttribute("message", "文件为空!"); } return "uploadStatus"; } }
- 使用
-
创建上传页面(如JSP):
- 确保表单的
enctype
属性设置为multipart/form-data
:<form method="POST" action="/upload" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">上传</button> </form>
- 确保表单的
通过配置CommonsMultipartResolver
和使用MultipartFile
接口,Spring MVC可以轻松实现文件上传功能。需要注意的是,表单的enctype
属性必须设置为multipart/form-data
,以便正确传输文件数据。
3. 如何在Spring MVC中实现拦截器(Interceptor)?
答案:
Spring MVC的拦截器用于在请求处理前后执行特定逻辑,例如权限验证、日志记录等。实现拦截器的步骤如下:
-
创建拦截器类:
- 实现
HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类。 - 示例:
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 请求处理前的逻辑 System.out.println("拦截器:请求处理前"); return true; // 返回true继续处理,返回false中断处理 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 请求处理后的逻辑 System.out.println("拦截器:请求处理后"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求完成后的逻辑 System.out.println("拦截器:请求完成"); } }
- 实现
-
注册拦截器:
- 在Spring配置文件或Java配置类中注册拦截器。
- 示例(Java配置):
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/login", "/register"); // 排除登录和注册页面 } }
-
拦截器的执行顺序:
- 如果有多个拦截器,它们的
preHandle
方法会按注册顺序执行,而postHandle
和afterCompletion
方法则按注册的逆序执行。
- 如果有多个拦截器,它们的
通过实现HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类,可以创建自定义拦截器。通过InterceptorRegistry
注册拦截器,并指定拦截路径和排除路径,可以灵活控制拦截器的作用范围。拦截器常用于权限验证、日志记录、性能监控等场景。