您的位置:首页 > 编程语言 > Java开发

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

2016-12-28 15:07 393 查看
在之前我们没有用基于注解的控制器时,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(pro
4000
ductForm.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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: