一、参数接收-中文乱码处理
在Spring MVC中处理请求参数的中文乱码,需根据请求方法分别处理。
-
POST请求乱码
通过配置Spring提供的字符编码过滤器(
CharacterEncodingFilter)统一处理,这是最常用和推荐的方式。<!-- 在web.xml中配置 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <!-- 拦截所有请求 --> <url-pattern>/*</url-pattern> </filter-mapping> -
GET请求乱码
对于GET请求,上述过滤器在Tomcat 8及以上版本可能失效。通常需要在代码层面手动进行转码。
// 在Controller的方法中,对接收到的String参数进行转换 String param = request.getParameter("paramName"); String correctParam = new String(param.getBytes("ISO-8859-1"), "UTF-8");注意 :更一劳永逸的方式是修改Tomcat服务器配置文件(
server.xml)中Connector的URIEncoding为UTF-8。
二、日期转换器
Spring MVC可以接收基本数据类型和字符串,但默认无法将字符串自动转换为java.util.Date类型,需要自定义转换器。
-
创建日期转换器
实现
Converter<String, Date>接口,定义字符串到日期的转换逻辑。public class DateConverter implements Converter<String, Date> { @Override public Date convert(String source) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { return sdf.parse(source); } catch (ParseException e) { e.printStackTrace(); return null; } } } -
配置与注册转换器工厂
在Spring的配置文件中,将自定义转换器注入到转换服务中,并注册该服务。
<!-- 1. 配置转换器工厂 --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.yourpackage.converter.DateConverter"/> </set> </property> </bean> <!-- 2. 注册转换器工厂到SpringMVC核心驱动 --> <mvc:annotation-driven conversion-service="conversionService"/>
三、拦截器
拦截器(Interceptor)用于在处理器执行前后进行预处理和后处理,基于AOP实现,常用于登录校验、权限检查、日志记录等。
-
拦截器 vs 过滤器(Filter)
特性 过滤器 (Filter) 拦截器 (Interceptor) 原理 基于函数回调 基于AOP(动态代理) 依赖 Servlet规范,不依赖任何框架 依赖SpringMVC框架 使用场景 过滤所有内容(静态资源、JSP、Servlet),如解决乱码 拦截进入Controller的请求,如登录校验 -
使用步骤
-
① 创建拦截器 :实现
HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion方法。public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在Controller方法执行前调用,返回true则放行 System.out.println("preHandle..."); return true; } // ... postHandle, afterCompletion 方法 } -
② 配置拦截器:在SpringMVC配置文件中声明。
<mvc:interceptors> <mvc:interceptor> <!-- 拦截的路径 --> <mvc:mapping path="/**"/> <!-- 排除的路径 --> <mvc:exclude-mapping path="/user/login"/> <bean class="com.yourpackage.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
-
四、文件上传
Spring MVC使用Apache Commons FileUpload组件实现文件上传,需进行相应配置。
-
添加依赖 (
pom.xml)<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> -
Spring配置文件 (
springmvc.xml)<!-- 1. 配置文件上传解析器,id必须为multipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 最大上传大小(字节),5MB --> <property name="maxUploadSize" value="5242880"/> <property name="defaultEncoding" value="UTF-8"/> </bean> <!-- 2. 静态资源映射(可选,用于直接访问已上传文件) --> <mvc:resources mapping="/upload/**" location="/upload/"/> -
前端表单 (
JSP)表单的
enctype必须设置为multipart/form-data。<form action="/file/upload" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="myFile"><br> <input type="submit" value="上传"> </form> -
后端Controller
使用
MultipartFile类型接收上传的文件。@PostMapping("/upload") public String handleFileUpload(@RequestParam("myFile") MultipartFile file) { if (!file.isEmpty()) { String fileName = file.getOriginalFilename(); // 保存文件到服务器指定路径 File dest = new File("/upload/path/" + fileName); file.transferTo(dest); return "上传成功"; } return "上传失败,文件为空"; }