在之前我们没有用基于注解的控制器时,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>