1. 请解释Spring MVC的工作原理。
答案 :
Spring MVC是一个基于Java的MVC框架,用于构建Web应用程序。其工作原理如下:
- 客户端发送请求到
DispatcherServlet
,它是Spring MVC的前端控制器。 DispatcherServlet
查询HandlerMapping
,根据请求的URL找到对应的Controller
。HandlerAdapter
调用Controller
中的方法处理请求,并返回ModelAndView
对象。ViewResolver
根据ModelAndView
中的视图名称解析具体的视图模板(如JSP、Thymeleaf)。- 视图模板将模型数据渲染成最终的HTML页面,并返回给客户端。
2. 如何在Spring MVC中实现一个简单的控制器?
答案 :
可以通过注解的方式实现一个简单的控制器。例如:
java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloWorldController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, Spring MVC!";
}
}
上述代码定义了一个控制器,当访问/hello
路径时,返回字符串"Hello, Spring MVC!"
。
3. 如何在Spring MVC中实现文件上传?
答案 :
实现文件上传需要以下步骤:
-
添加
commons-fileupload
依赖(Spring Boot中已包含)。 -
在Spring配置中添加
CommonsMultipartResolver
:java@Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10 * 1024 * 1024); // 设置最大上传大小为10MB return resolver; }
-
创建文件上传的Controller:
java@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
。
4. 如何在Spring MVC中实现拦截器(Interceptor)?
答案 :
可以通过实现HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类来创建拦截器。例如:
java
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
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/login", "/register"); // 排除登录和注册页面
}
}
5. 如何在Spring MVC中实现国际化(i18n)?
答案 :
可以通过以下步骤实现国际化:
-
创建资源文件(如
messages.properties
、messages_zh_CN.properties
)。 -
在Spring配置中启用国际化:
java@Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource source = new ResourceBundleMessageSource(); source.setBasename("messages"); return source; }
-
在Controller中使用
@Value
注解或MessageSource
接口获取国际化消息:java@Controller public class LocaleController { @Value("${welcome.message}") private String welcomeMessage; @GetMapping("/welcome") public String welcome(Model model) { model.addAttribute("message", welcomeMessage); return "welcome"; } }
-
在视图中使用
<spring:message>
标签或Thymeleaf表达式显示国际化内容。