SpringMVC 细节处理

本文聚焦 SpringMVC 细节处理,涵盖 post 请求中文乱码、类型转换、dispartcherServlet 路径设置、restful 风格响应报错及文件上传等问题。针对不同问题给出解决办法,如添加 CharacterEncodingFilter 解决中文乱码,使用 Jackson 依赖包处理 Json 转换等。

SpringMVC 细节处理

一、post 请求, 中文乱码问题

解决办法:web.xml 中添加CharacterEncodingFilter

<filter>
   <filter-name>CharacterEncodingFilter</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>

二、类型转换问题

POJO中日期属性:可以使用 @DateTimeFormat

@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;

POJO中特殊字符串转数字: 可以使用 @NumberFormat

//字符串  19,991,231.9
@NumberFormat(pattern = "#,###,###.#")
    private Double money;

Json 转 POJO 或 POJO 转json: 需要使用到 Jackson 依赖包

<!--引入jackson支持包,实现对象与json的互转。-->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.0</version>
</dependency>

@RequestBody 修饰参数,表示 Json 转 POJO

@ResponseBody 修饰返回值,或者方法 表示 POJO 转Json

三、dispartcherServlet url-parttent 设置 / 问题

dispartcherServlet 拦截路径设置 为 / 时 会拦截 除了 jsp 的所有资源,

原因:

因为 tomcat 默认有一个 default Servlet 拦截的虚拟 目录就是 / , 这个默认的servlet 是专门用来处理 静态资源的,系统 启动时,先加载 tomcat 的web.xml 配置文件, 然后再加载 项目的web.xml 配置文件, 这个时候,dispartcherServlet 的拦截目录会 覆盖 default Servlet, 从而导致无法访问静态资源

解决办法:

default *.html *.css *.js *.jpg ``` ```

<mvc:resources mapping="/pages/**" location="/pages/"/>
<mvc:resources mapping="/index.html" location="/index.html"/>


3. <font color='red'>推荐使用这种</font>

```xml
<mvc:default-servlet-handler/>

restful 风格 put delete 响应报错问题

原因:

浏览器 不支持 put 和 delete 请求或响应, 所以 controller 接受 put 或 delete 请求时,不能直接 重定向 或转发 , 只能向浏览器 响应json 数据

文件上传

需要使用 apache 的 fileupload 包

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

上传文件三要素

  1. 提交方式:post
  2. 表单类型:enctype=“multipart/form-data”
  3. 文件域:

apache fileupload 上传文件

    private void saveFile(String path, String fileName, HttpServletRequest request) throws Exception {
        //获得文件真实路径
        String realPath = request.getServletContext().getRealPath(path);
        //创建文件夹
        File dir = new File(realPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        List<FileItem> fileItems = servletFileUpload.parseRequest(request);
        //遍历集合,判断是否是 文件域
        for (FileItem fileItem : fileItems) {
            if (!fileItem.isFormField()) {
                //获得上传的文件名
                String name = fileItem.getName();
                //获得一个文件文件名
                String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + name.substring(name.lastIndexOf("."));
                //写入文件到硬盘
                fileItem.write(new File(realPath, newFileName));
                //清除临时文件
                fileItem.delete();
            }
        }
    }

SpringMVC 文件上传

注意:需要导入 apache fileupload 包, 还需要配置 multipartersolver 解析器

<!-- 解析器的id 必须是这个,不然会报错 --> 
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>
    </bean>
 // 注意 MultipartFile 的变量名 必须和 表单的 name 属性一致
    @RequestMapping("/upload2")
    public String upload2(MultipartFile upload, HttpServletRequest request) {
        String realPath = request.getServletContext().getRealPath("file");
        //创建文件夹
        File dir = new File(realPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        String fileName = upload.getOriginalFilename();
        String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + fileName.substring(fileName.lastIndexOf("."));
        try {
            upload.transferTo(new File(dir, newFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return SUCCESS;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值