Spring MVC零散知识点记录

一、参数接收-中文乱码处理

在Spring MVC中处理请求参数的中文乱码,需根据请求方法分别处理。

  1. 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>
  2. 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的URIEncodingUTF-8

二、日期转换器

Spring MVC可以接收基本数据类型和字符串,但默认无法将字符串自动转换为java.util.Date类型,需要自定义转换器。

  1. 创建日期转换器

    实现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;
            }
        }
    }
  2. 配置与注册转换器工厂

    在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实现,常用于登录校验、权限检查、日志记录等。

  1. 拦截器 vs 过滤器(Filter)

    特性 过滤器 (Filter) 拦截器 (Interceptor)
    原理 基于函数回调 基于AOP(动态代理)
    依赖 Servlet规范,不依赖任何框架 依赖SpringMVC框架
    使用场景 过滤所有内容(静态资源、JSP、Servlet),如解决乱码 拦截进入Controller的请求,如登录校验
  2. 使用步骤

    • ① 创建拦截器 :实现HandlerInterceptor接口,重写preHandlepostHandleafterCompletion方法。

      复制代码
      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组件实现文件上传,需进行相应配置。

  1. 添加依赖 ​ (pom.xml)

    复制代码
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
  2. 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/"/>
  3. 前端表单 ​ (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>
  4. 后端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 "上传失败,文件为空";
    }
相关推荐
几许1 小时前
高并发有序顺序号生成中间件 - 架构设计文档
java·后端
几许1 小时前
高并发强一致性顺序号生成系统 -- SequenceGenerator
java·github
闻哥1 小时前
深入理解 MySQL InnoDB Buffer Pool 的 LRU 冷热数据机制
android·java·jvm·spring boot·mysql·adb·面试
rainchestnut2 小时前
Spring AI 初步集成(2)-添加记忆
spring
koping_wu2 小时前
Java面试汇总:java基础、多线程、spring、jvm、分布式
java·spring·面试
摇滚侠2 小时前
IDEA 开发,Mybatis 中,@Insert 注解如何提示出列名
java·intellij-idea·mybatis
程序员Terry2 小时前
Docker 部署 RocketMQ 5.1.0 踩坑实录:从超时到 Console 连不上的完整解决之路
java·后端
tsyjjOvO2 小时前
SpringMVC 从入门到精通(续)
java·后端·spring