Spring MVC Controller中返回json数据中文乱码处理

问题
在使用spring MVC Controller的过程中,发现返回到客户端的的中文出现乱码。后台Java代码:

@RequestMapping(value = "/upload", method = RequestMethod.POST,   
        produces = "text/json")  
public @ResponseBody String upload(  
        @RequestParam("groupId") String groupId,  
        HttpServletRequest request,  
        HttpServletResponse response) {  
           //...  
       }  

解决
在produce参数中加入编码声明 charset=UTF-8
修改后的代码为:

@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = "text/json;charset=UTF-8")  
public @ResponseBody String upload(  
        @RequestParam("groupId") String groupId,  
        HttpServletRequest request,  
        HttpServletResponse response) {  
           //...  
       }  

参考资料1:

springMVC返回json数据乱码问题及@RequestMapping 详解

一、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

1、 value, method;

  • value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
  • method: 指定请求的method类型, GET、POST、PUT、DELETE等;

2、 consumes,produces;

  • consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
  • produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

3、 params,headers;

  • params: 指定request中必须包含某些参数值是,才让该方法处理。
  • headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

二、json数据乱码

在springMVC controller中返回json数据出现乱码问题,因为没有进行编码,只需要简单的注解就可以了。

@RequestMapping()中加入produces=”text/html;charset=UTF-8”属性即可,如下:

@RequestMapping(value="/respost",method=RequestMethod.GET,produces="text/html;charset=UTF-8")  
    @ResponseBody  
    public String postList(@RequestParam("topicId") String topicId){  
        List<Post> posts=new ArrayList<Post>();  
        System.out.println("topicId-----"+topicId);  
        posts=postService.findPostList(topicId);  
        JSONArray postJson=JSONArray.fromObject(posts);  
        return postJson.toString();  
    }

参考资料2:

三种方式解决你的js加载乱码

第一种方式—编码统一

我们以前觉得出现乱码的原因是因为编码不统一,就是因为我们设置编码统一之后,就解决了问题,所以,让html和js的编码统一,是最简单的一个乱码解决方式,原因是什么,是因为,如果你在加载js的时候,并没有声明js的编码格式,那么浏览器会默认的按照当前html的编码格式进行解析引入的js文件,如果你的js和本身页面编码不一样,并且js中引入了中文字符,那么肯定会出现乱码的。要知道,程序都是笨笨的。

第二种方式—在引入js的标签中加入charset属性

这样引入,那么这个xx.js就会以本身页面的编码进行解析,而如果两个的编码不一样,如果这个js是gbk的编码,那么我们可以这样写

<script src="../../lib/Plugins/datepicker_lang_zh_CN.js" charset="utf-8" type="text/javascript"></script>

那么,只要是保证这个js文件的确是gbk或者对应的,你自己写的编码,那么无论在哪种编码的页面中引用这个js,都不会出现编码问题,这样写才是最规范的,第一种方式会出现一种情况,就是有很少情况下,由于一些不规范的原因,我们会发现即使是编码统一的时候,也会出现乱码,那么我们最好就是用第二种方式来写。

第三种方式—用服务器语言声明header头信息

这种方式是比较少见的一种方式,适合某些特定的情况。编码信息都是在头信息中声明的。而js本身并没有像html mate标签这样的声明头信息的标签,所以要借助服务器语言,我是学php的,其header(“Content-Type:text/html;charset=gb2312″);就可以声明头信息,而如何写这个js,就是把js内容写在php文件中,这里就有一个知识点,就是js文件并不一定非写在js为后缀的文件中,其实可以写的服务器文件(php文件等)中,php以

<script type="text/jscript" charset="gbk" src="xx.php"></script>

在这个xx.php写

<?
$ip = getenv('REMOTE_ADDR');
echo "alert($ip);";
?>

这样我们访问这个html页面,就会弹出ip地址,我们就可以对他进行其他操作等。当然,既然是连接服务端文件,就不能是直接双击打开这个html了,一定是通过浏览器访问才可以,或者是连接这个php文件的src要写http形式,目的就是保证这个php文件要是通过服务器解析访问的,如果你这样写相对目录的形式连接php,你直接打开html,就相当于直接打开了这个php文件,而不是通过http访问的,这个php是不能被解析的。讲的复杂了,但是这是一个很重要的知识点。如果单从乱码而言,这种引用js文件的方式适合我们已经引用了,不能再修改这个引用文件了,比如我们在一些外链站发了文章,不能再修改了,那么,我们可以修改连接的我们网站上的这个js文件,当前前提是,连接的是服务端文件,我们就可以通过这样的方式解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值