Spring MVC 的乱码解决方案

一.SpringMVC中的乱码的处理

1post乱码

springmvc 中提供的CharacterEncodingFilter过滤器解决

web.xml中配置如下

<!-- =====设置Post提交的中文编码,对Get提交没有效果===== -->

  <filter>

    <filter-name>encodingFilter</filter-name>

    <filter-class>

        org.springframework.web.filter.CharacterEncodingFilter

    </filter-class>

    <init-param>

    <!-- encoding用来指定一个具体的字符集 -->

      <param-name>encoding</param-name>

      <param-value>UTF-8</param-value>

    </init-param>

    <init-param>

      <!-- 此参数如果为true,当程序中未指定字符集时将自动指定配置的字符集到requestresponse-->

      <param-name>forceEncoding</param-name>

      <param-value>true</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>encodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

2Get方式乱码

方法一:修改tomcat的配置

方法二:自己写过滤器

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

 

@WebFilter("/CharacterEncodingFilter")

public class CharacterEncodingFilter implements Filter {

     String encoding=null;

    /**

     * @see Filter#Filter()

     */

    public CharacterEncodingFilter() {

        super();

    }

/**

 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)

 */

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

if(encoding==null||"".equals(encoding)){

encoding="utf-8";

}

//解决Post请求

request.setCharacterEncoding(encoding);

response.setCharacterEncoding(encoding);

chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request){

public String getParameter(String name){

//对于get请求进行特殊处理

if(this.getMethod().toLowerCase().equals("get")){

String value=super.getParameter(name);

try{

return new String(value.getBytes("iso-8859-1"),encoding);

}catch(UnsupportedEncodingException e){

e.printStackTrace();

}

return value;

}

return super.getParameter(name);

}

}, response);

}

/**

 * @see Filter#init(FilterConfig)

 */

public void init(FilterConfig fConfig) throws ServletException {

encoding=fConfig.getInitParameter("encoding");

}

}

二.Spring mvc 返回JSON数据乱码

Spring版本:3.2.2.RELEASE

Jackson JSON版本:2.1.3

解决思路:Controller的方法中直接通过response向网络流写入String类型的json数据使用 Jackson  ObjectMapper Java对象转换为String类型的JSON数据

为了避免中文乱码,需要设置字符编码格式,例如:UTF-8GBK

代码如下

 1 import org.springframework.beans.factory.annotation.Autowired;

 2 import org.springframework.stereotype.Controller;

 3 import org.springframework.ui.Model;

 4 import org.springframework.web.bind.annotation.RequestMapping;

 5 import org.springframework.web.bind.annotation.RequestMethod;

 6 import org.springframework.web.bind.annotation.RequestParam;

 7 

 8 import com.fasterxml.jackson.databind.ObjectMapper; //Jsckson JSON Processer

 9 

10 import java.util.*;

11 import javax.servlet.ServletOutputStream;

12 import javax.servlet.http.*;

13 import java.io.PrintWriter;

14 import java.nio.charset.Charset;

15 

16 /**

17  * Created with IntelliJ IDEA 12.0

18  * Date: 2013-03-15

19  * Time: 16:17

20  */

21 @Controller

22 public class HomeController {

23     @RequestMapping(value="/Home/writeJson", method=RequestMethod.GET)

24     public void writeJson(HttpServletResponse response)

25     {

26         ObjectMapper mapper = new ObjectMapper();

27 

28         HashMap<String,String> map = new HashMap<String,String>();

29         map.put("1","张三");

30         map.put("2","李四");

31         map.put("3","王五");

32         map.put("4", "Jackson");

33 

34         String json = "";

35 

36         try

37         {

38             json = mapper.writeValueAsString(map);

39             System.out.println(json);

40 

41             //方案二

42             ServletOutputStream os = response.getOutputStream(); //获取输出流

43             os.write(json.getBytes(Charset.forName("GBK"))); //json数据写入流中

44             os.flush();

45 

46             //方案一

47             response.setCharacterEncoding("UTF-8"); //设置编码格式

48             response.setContentType("text/html");   //设置数据格式

49             PrintWriter out = response.getWriter(); //获取写入对象

50             out.print(json); //json数据写入流中

51             out.flush();

52         }

53         catch(Exception e)

54         {

55             e.printStackTrace();

56         }

57 

58         //return "home";

59     }

60 }

还有一种方法:设置 @RequestMapping  produces 参数,代码如下所示

思路:使用 @ResponseBody 注解直接返回json字符串,为了防止中文乱码,将@RequestMapping  produces 参数设置成"text/html;charset=UTF-8" 即可

1 @RequestMapping(value="/Home/writeJson", method=RequestMethod.GET, produces = "text/html;charset=UTF-8")

 2 @ResponseBody

 3 public Object writeJson(HttpServletResponse response)

 4 {

 5         ObjectMapper mapper = new ObjectMapper();

 6 

 7         HashMap<String,String> map = new HashMap<String,String>();

 8         map.put("1","张三");

 9         map.put("2","李四");

10         map.put("3","王五");

11         map.put("4", "Jackson");

12 

13         String json = "";

14 

15         try

16         {

17             json = mapper.writeValueAsString(map);

18             System.out.println(json);

19         }

20         catch(Exception e)

21         {

22             e.printStackTrace();

23         }

24 

25         return json;

26 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值