`

SpringMVC 转换ajax的json数据乱码问题

 
阅读更多
Spring mvc 用ajax传输json数据 http://blog.csdn.net/u012457196/article/details/43498139
在spring mvc3中,已经集成了Jackson(json处理器)来处理数据输出json格式,spring中封装的类是 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter这个json转换器, 如果是springmvc3.2之前的版本,可以使用org.springframework.http.converter.MappingJacksonHttpMessageConverter这个json转换器。



springmvc使用@ResponseBody返回json乱码解决方法 http://www.itxxz.com/a/javashili/ask/2014/1222/501.html
1.springmvc 3.2以上的版本解决乱码的方法:

  第一步:在配置中加入:

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                     <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                         <property name="failOnEmptyBeans" value="false" />
                     </bean>
                 </property>
            </bean>
        </mvc:message-converters>
     </mvc:annotation-driven>

或者可以这样写
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="jsonRequestConverter" />
			</list>
		</property>
	</bean>
	<bean id="jsonRequestConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>



   第二步:需要的加入的jackson jar如下:

<dependency>

        <groupId>com.fasterxml.jackson.core</groupId>

        <artifactId>jackson-annotations</artifactId>

        <version>2.1.0</version>

      </dependency>

      <dependency>

        <groupId>com.fasterxml.jackson.core</groupId>

        <artifactId>jackson-core</artifactId>

        <version>2.1.0</version>

      </dependency>

      <dependency>

        <groupId>com.fasterxml.jackson.core</groupId>

        <artifactId>jackson-databind</artifactId>

        <version>2.1.0</version>

      </dependency>

      <dependency>

        <groupId>com.fasterxml.jackson.module</groupId>

        <artifactId>jackson-module-jaxb-annotations</artifactId>

        <version>2.1.0</version>

      </dependency> 
  


另一种方法:, 貌似偶尔出问题, 还没找原因
package cn.com.voge.utils;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.FileCopyUtils;

public class UTF8StringHttpMessageConverter extends
		AbstractHttpMessageConverter<String> {

	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
	private final List<Charset> availableCharsets;

	public UTF8StringHttpMessageConverter() {
		this(DEFAULT_CHARSET);
	}

	public UTF8StringHttpMessageConverter(Charset defaultCharset) {
		super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
		this.availableCharsets = new ArrayList<Charset>(Charset
				.availableCharsets().values());
	}

	@Override
	protected boolean supports(Class<?> clazz) {
		return String.class.equals(clazz);
	}

	@Override
	protected String readInternal(Class<? extends String> clazz,
			HttpInputMessage inputMessage) throws IOException,
			HttpMessageNotReadableException {
		MediaType contentType = inputMessage.getHeaders().getContentType();
		Charset charset = contentType.getCharSet() != null ? contentType
				.getCharSet() : DEFAULT_CHARSET;
		return FileCopyUtils.copyToString(new InputStreamReader(inputMessage
				.getBody(), charset));
	}

	@Override
	protected void writeInternal(String t, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException {
		MediaType contentType = outputMessage.getHeaders().getContentType();
		Charset charset = contentType.getCharSet() != null ? contentType
				.getCharSet() : DEFAULT_CHARSET;
		FileCopyUtils.copy(t, new OutputStreamWriter(outputMessage.getBody(),
				charset));
	}

	protected List<Charset> getAcceptedCharsets() {
		return this.availableCharsets;
	}

	@Override
	protected Long getContentLength(String s, MediaType contentType) {
		if (contentType != null && contentType.getCharSet() != null) {
			Charset charset = contentType.getCharSet();
			try {
				return (long) s.getBytes(charset.name()).length;
			} catch (UnsupportedEncodingException ex) {
				throw new InternalError(ex.getMessage());
			}
		} else {
			return null;
		}
	}
}

<mvc:annotation-driven>   
	    <mvc:message-converters register-defaults="true">   
	        <bean class="cn.com.voge.utils.UTF8StringHttpMessageConverter"/>   
	    </mvc:message-converters>   
	</mvc:annotation-driven> 



2.springmvc 3.1解决中文乱码的方法:
  第一步:在配置文件中加入以下代码:
<mvc:annotation-driven>
 
    <mvc:message-converters register-defaults="true">
 
      <bean class="com.util.spring.UTF8StringHttpMessageConverter"/>
 
    </mvc:message-converters>
 
  </mvc:annotation-driven>

     第二步:自定义一个编码转换类:
public class UTF8StringHttpMessageConverter extends 
        AbstractHttpMessageConverter<String> { 
 
      public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 
      private final List<Charset> availableCharsets; 
 
      public UTF8StringHttpMessageConverter() { 
          this(DEFAULT_CHARSET); 
      } 
 
      public UTF8StringHttpMessageConverter(Charset defaultCharset) { 
          super(new MediaType("text", "plain", defaultCharset), MediaType.ALL); 
          this.availableCharsets = new ArrayList<Charset>(Charset .availableCharsets().values()); 
      } 
 
      @Override 
      protected boolean supports(Class<?> clazz) { 
          return String.class.equals(clazz); 
      } 
 
      @Override 
      protected String readInternal(Class<? extends String> clazz, 
              HttpInputMessage inputMessage) throws IOException, 
              HttpMessageNotReadableException { 
          MediaType contentType = inputMessage.getHeaders().getContentType(); 
          Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET; 
          return FileCopyUtils.copyToString(new InputStreamReader(inputMessage .getBody(), charset)); 
      } 
 
      @Override 
      protected void writeInternal(String t, HttpOutputMessage outputMessage) 
              throws IOException, HttpMessageNotWritableException { 
          MediaType contentType = outputMessage.getHeaders().getContentType(); 
          Charset charset = contentType.getCharSet() != null ? contentType .getCharSet() : DEFAULT_CHARSET; 
          FileCopyUtils.copy(t, new OutputStreamWriter(outputMessage.getBody(),  charset)); 
      } 
 
      protected List<Charset> getAcceptedCharsets() { 
          return this.availableCharsets; 
      } 
     
      @Override 
      protected Long getContentLength(String s, MediaType contentType) { 
          if (contentType != null && contentType.getCharSet() != null) { 
              Charset charset = contentType.getCharSet(); 
              try { 
                  return (long) s.getBytes(charset.name()).length; 
              } catch (UnsupportedEncodingException ex) {                 
                  throw new InternalError(ex.getMessage()); 
              } 
          } else { 
              return null; 
          } 
      } 
  }

 第三步:加入需要的jackson包:
<dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.8.8</version>
      </dependency>
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.8.8</version>
      </dependency>
分享到:
评论

相关推荐

    解决SpringMvc后台接收json数据中文乱码问题的几种方法

    本文将深入探讨两种解决SpringMvc后台接收JSON数据中文乱码问题的方法。 1. **使用Ajax传输数据** 当前端通过Ajax使用JSON格式向SpringMvc后台发送数据时,可能出现中文乱码。这通常是因为服务器默认的字符编码不...

    解决Ajax加载JSon数据中文乱码问题

    完成上述修改后,SpringMvc将能够正确处理`text/plain`类型的数据,并以UTF-8编码返回,从而解决Ajax加载JSON数据时的中文乱码问题。 三、总结 解决Ajax加载JSON数据中文乱码问题的关键在于确保服务器端正确设置...

    springmvc 发送ajax出现中文乱码的解决方法汇总

    在开发Web应用时,Spring MVC和Ajax的交互过程中,经常遇到中文乱码的问题。这个问题主要出现在数据从服务器传输到客户端的过程中,由于编码设置不正确,导致中文字符无法正常显示。以下将详细介绍四种解决Spring ...

    java web SpringMVC后端传json数据到前端页面实例代码

    前端通过Ajax调用后端接口并获取返回的JSON数据,然后根据这些数据更新页面上的元素。 5. jQuery处理Ajax请求: jQuery是一个快速、小巧、功能丰富的JavaScript库。它简化了JavaScript编程,可以通过AJAX、事件...

    用ajax传递json到前台中文出现问号乱码问题的解决办法

    在进行Web开发时,使用AJAX技术与服务器进行异步通信,然后将服务器返回的JSON数据展示在前端页面上是一种常见需求。...通过上述方法,可以有效解决使用AJAX传递JSON数据到前台时出现的中文乱码问题。

    SpringMVC+Jquery实现Ajax功能

    SpringMVC会自动将其转换成JSON格式,供jQuery的Ajax请求接收。 3. **处理异常**:可以使用`@ExceptionHandler`注解来捕获并处理异常,返回相应的错误信息。 通过上述步骤,SpringMVC和jQuery可以协同工作,实现...

    springmvc-ajax

    项目介绍 这是一个 springmvc + mybatis ...也配置了转成json解决乱码的问题 &lt;!-- 1、支持HandlerMapper和HandlerAdapter --&gt; &lt;!-- 转成json 为UTF-8 --&gt; &lt;mvc:message-converters register-default

    Springmvc完成ajax功能实例详解

    通过使用`@ResponseBody`注解和Jackson库,我们可以方便地将Java对象转换为JSON,然后通过AJAX发送到客户端。同时,注意设置正确的字符编码,以确保中文字符能正确显示。通过实践这些知识点,你可以在你的项目中轻松...

    基于AJAX结合SpringMVC的信息访问服务模式研究

    【基于AJAX结合SpringMVC的信息访问服务模式研究】 AJAX(Asynchronous JavaScript and XML)是一种在不重新加载整个网页的情况下,能够更新部分网页的技术。它利用JavaScript、XHTML、CSS、DOM、XML、XSLT以及...

    Spring+SpringMVC+MyBatis所需jar包(全部)

    - 解决Ajax中JSON中文乱码问题,通常需要设置Tomcat的字符编码,以及在Servlet容器中配置过滤器,如`CharacterEncodingFilter`,确保请求和响应的编码一致。 5. **jar包说明**: 压缩包中的jar包涵盖了Spring、...

    SpringMVC面试题.pdf

    - 在Ajax请求中,设置请求类型为GET或POST,指定请求URL,然后在成功回调中处理响应的JSON数据。 7. **处理乱码问题**: - 对于请求参数的乱码,可以通过在DispatcherServlet配置中设置`characterEncodingFilter`...

    SpringMVC4.0.3+Mybatis3.2.5+EasyUI1.4.1 Demo

    该项目使用springmvc4.0.3 + Mybatis3.2.5 前端使用easyUI1.4.1 ...1.ajax请求,返回JSON数据,有中文乱码解决方案 2.登陆拦截,未登陆过的用户将跳转到登陆页面 3.邮件发送 4.企业级前端界面 5.前端数据分页、查询

    SpringMVC面试题(2024最新版).docx

    - 与AJAX交互通常通过`@ResponseBody`或JSON处理。 **处理中文乱码**: POST请求通过设置Filter解决,GET请求可以通过设置`CharacterEncodingFilter`。 **异常处理**: 可以自定义异常处理器,比如使用@...

    Spring MVC面试宝典1.pdf

    ##### 3.4 如何解决POST请求中文乱码问题,GET的又如何处理呢? - **POST请求**:在web.xml中配置过滤器CharacterEncodingFilter来设置字符编码。 - **GET请求**:同样可以通过配置过滤器解决,也可以通过修改Tomcat...

    SSM整合_年轻人的第一个增删改查_基础环境搭建.doc

    9. **前后端交互**:使用Ajax发送异步请求,通过JSON传递数据,实现前后端的轻量级分离。 学习SSM整合的过程中,你可能会遇到环境配置、版本冲突等问题,但这些都是成长的一部分。可以通过在线教程,如B站上的视频...

    Java面试重要知识点复习大纲.pdf

    4. **SpringMVC**:学习其工作流程,对比Struts2,解决乱码问题,熟悉组件扩展。 5. **MyBatis**:对比JDBC和Hibernate,理解动态SQL,掌握XML和注解的映射方式。 **四、脚本** 1. **JavaScript**:了解核心对象,...

    Java面试重要知识点复习大纲.docx

    4. **SpringMVC**:了解其工作流程,对比与Struts2的区别,处理乱码问题,熟悉各组件的扩展。 5. **MyBatis**:理解MyBatis与JDBC和Hibernate的区别,熟悉动态SQL和映射文件的配置。 **四、脚本** 1. **JavaScript*...

Global site tag (gtag.js) - Google Analytics