SpringMVC学习--POST请求中文乱码问题

在之前我们没有用基于注解的控制器时,controller是这么写的:

public class SaveProductController implements Controller{

    private static final Log logger= LogFactory.getLog(SaveProductController.class);

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.info("SaveProductController 被调用!");
        //解决中文乱码
        request.setCharacterEncoding("UTF-8");

        ProductForm productForm=new ProductForm();

        productForm.setName(request.getParameter("name"));
        productForm.setDescription(request.getParameter("description"));
        productForm.setPrice(request.getParameter("price"));

        Product product=new Product();
        product.setName(productForm.getName());
        product.setDescription(productForm.getDescription());
        product.setPrice(Float.parseFloat(productForm.getPrice()));

        return new ModelAndView("ProductDetails","product",product);
    }
}

request以UTF-8编码接受请求:

request.setCharacterEncoding("UTF-8");

使用注解控制器之后:

@RequestMapping(value = "/save_product",method = RequestMethod.POST)
    public String saveProduct(ProductForm productForm, RedirectAttributes redirectAttributes){
        logger.info("saveProduct 调用");

        //无需再从request中取出表单数据再ProductForm实例化
        Product product=new Product();
        product.setName(productForm.getName());
        product.setDescription(productForm.getDescription());
        product.setPrice(Float.parseFloat(productForm.getPrice()));

        //add
        Product saveProduct=productService.add(product);

        //重定向传递参数
        redirectAttributes.addFlashAttribute("message", "商品成功保存!");

        return "redirect:/product_view/"+saveProduct.getId();
    }

SpringMVC会将请求参数直接填充到ProductForm对象中去,不再需要我们手动都取出再new对象。但是这样直接填入就会有中文乱码问题,如下:
这里写图片描述

那我们怎么解决这个问题?能不能像之前一样,加上request.setCharacterEncoding(“UTF-8”);
答案是,不行!
为什么呢?

原因是,SpringMVC将表单中的参数取出填充到ProductForm中,是在调用controller之前,如果要使用中文,则需要在取出来的时候就设置好编码(utf-8),取出之后设置就没用了。

那有什么办法可以在调用controller之前设置编码呢?

其实controller的本质也是一个servlet,要解决这个问题也就是怎么在servlet执行之前解决编码问题。显而易见,我们都想到了fiter(过滤器)。
使用一个Filter取出request设置需要的编码,然后配置在web.xml中OK啦。

思路就是这样,其实SpringMVC已经给我内置了这样的编码fiter,在org.springframework.web.filter.CharacterEncodingFilter中,我们只需要在web.xml中加入即可:

<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>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带着天使反上帝 - Kaybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值