zoukankan      html  css  js  c++  java
  • ajax请求返回乱码

    1,web.xml中有如下配置:

    <!-- 编码过滤器 -->
    <filter>
      <filter-name>encodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <async-supported>true</async-supported>
      <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    View Code

    2.Controller

     @RequestMapping("/test")
        @ResponseBody
        public String test(HttpServletResponse re){
            JSONObject json=new JSONObject();
            json.put("msg", "测试");
    
       re.setHeader("Charset", "UTF-8");
    
       re.setContentType("application/x-www-form-urlencoded; charset=utf-8");
            return json.toString();
        }
    View Code

    3.ajax

    $.ajax({
                    type : "GET",
                    url : "../cart/test",
                   data:{},
                    datatype : "json",
                    scriptCharset: 'UTF-8',
                    success : function(result) {
                        var data = JSON.parse(result);
                    },
                    error : function(result) {
                        var data = JSON.parse(result);
                    }
    View Code

    仍旧乱码,另外jsp页面、tomcat、项目、General下的Workspace全部设为UTF-8仍旧乱码

    最终发现 <mvc:annotation-driven/>

    这个意思是说注解驱动,@作用:springMVC为@Controllers分发请求所必须的。
    并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。

    @作用:(Springmvc3)

    <!-- 注解请求映射  -->
        <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">        
            <property name="interceptors">
                <list>  
                    <ref bean="logNDCInteceptor"/>   <!-- 日志拦截器,这是你自定义的拦截器 -->
                </list>        
            </property>        
        </bean>      
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">  
                <list>  
                    <ref bean="byteArray_hmc" />  
                    <ref bean="string_hmc" />  
                    <ref bean="resource_hmc" />  
                    <ref bean="source_hmc" />  
                    <ref bean="xmlAwareForm_hmc" />  
                    <ref bean="jaxb2RootElement_hmc" />  
                    <ref bean="jackson_hmc" />  
                </list>  
            </property>  
        </bean>  
        <bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /><!-- 处理.. -->
        <bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter" /><!-- 处理.. -->
        <bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter" /><!-- 处理.. -->
        <bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /><!-- 处理.. -->
        <bean id="xmlAwareForm_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /><!-- 处理.. -->
        <bean id="jaxb2RootElement_hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /><!-- 处理.. -->
        <bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /><!-- 处理json-->
    View Code

    其中StringHttpMessageConverter的作用是

    看源码:

    /*
     * Copyright 2002-2014 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package org.springframework.http.converter;
    
    import java.io.IOException;
    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.util.StreamUtils;
    
    /**
     * Implementation of {@link HttpMessageConverter} that can read and write strings.
     *
     * <p>By default, this converter supports all media types ({@code &#42;&#47;&#42;}),
     * and writes with a {@code Content-Type} of {@code text/plain}. This can be overridden
     * by setting the {@link #setSupportedMediaTypes supportedMediaTypes} property.
     *
     * @author Arjen Poutsma
     * @since 3.0
     */
    public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
    
        public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
    
    
        private final Charset defaultCharset;
    
        private final List<Charset> availableCharsets;
    
        private boolean writeAcceptCharset = true;
    
    
        /**
         * A default constructor that uses {@code "ISO-8859-1"} as the default charset.
         * @see #StringHttpMessageConverter(Charset)
         */
        public StringHttpMessageConverter() {
            this(DEFAULT_CHARSET);
        }
    
        /**
         * A constructor accepting a default charset to use if the requested content
         * type does not specify one.
         */
        public StringHttpMessageConverter(Charset defaultCharset) {
            super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
            this.defaultCharset = defaultCharset;
            this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
        }
    
    
        /**
         * Indicates whether the {@code Accept-Charset} should be written to any outgoing request.
         * <p>Default is {@code true}.
         */
        public void setWriteAcceptCharset(boolean writeAcceptCharset) {
            this.writeAcceptCharset = writeAcceptCharset;
        }
    
    
        @Override
        public boolean supports(Class<?> clazz) {
            return String.class == clazz;
        }
    
        @Override
        protected String readInternal(Class<? extends String> clazz, HttpInputMessage inputMessage) throws IOException {
            Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType());
            return StreamUtils.copyToString(inputMessage.getBody(), charset);
        }
    
        @Override
        protected Long getContentLength(String str, MediaType contentType) {
            Charset charset = getContentTypeCharset(contentType);
            try {
                return (long) str.getBytes(charset.name()).length;
            }
            catch (UnsupportedEncodingException ex) {
                // should not occur
                throw new IllegalStateException(ex);
            }
        }
    
        @Override
        protected void writeInternal(String str, HttpOutputMessage outputMessage) throws IOException {
            if (this.writeAcceptCharset) {
                outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
            }
            Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType());
            StreamUtils.copy(str, charset, outputMessage.getBody());
        }
    
    
        /**
         * Return the list of supported {@link Charset}s.
         * <p>By default, returns {@link Charset#availableCharsets()}.
         * Can be overridden in subclasses.
         * @return the list of accepted charsets
         */
        protected List<Charset> getAcceptedCharsets() {
            return this.availableCharsets;
        }
    
        private Charset getContentTypeCharset(MediaType contentType) {
            if (contentType != null && contentType.getCharSet() != null) {
                return contentType.getCharSet();
            }
            else {
                return this.defaultCharset;
            }
        }
    
    }
    View Code

    方法writeInternal将字符串指定编码输出为响应信息,而这个编码默认的是

    public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

    所以需要显示的指定编码private final Charset defaultCharset;

    因此在<mvc:annotation-driven/>中指定如下:

    <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">  
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
              <constructor-arg value="UTF-8" />  
            </bean>  
          </mvc:message-converters>  
        </mvc:annotation-driven>
    View Code

    此时乱码问题解决

    另外,也可在@RequestMapping中加入produces="text/html;charset=UTF-8",如 

      @RequestMapping(value="/test",,produces="text/html;charset=UTF-8")
        @ResponseBody
        public String test(HttpServletResponse re){
            JSONObject json=new JSONObject();
            json.put("msg", "测试");
    
       return json.toString();
        }
    View Code
    
    
  • 相关阅读:
    20145105 《Java程序设计》第4周学习总结
    调查问卷
    20145105 《Java程序设计》第3周学习总结
    20145105 《Java程序设计》实验一总结
    20145105 《Java程序设计》第5周学习总结
    【linux配置】VMware安装Redhat6.5
    【eclipse】解决:eclipse或STS运行maven工程出现Missing artifact jdk.tools:jdk.tools:jar:1.7问题
    【linux配置】在VMware中为Redhat HAT配置本地yum源
    【linux配置】虚拟机配置静态IP地址
    【linux配置】Linux系统下安装rz/sz命令以及使用说明
  • 原文地址:https://www.cnblogs.com/yanan7890/p/7011384.html
Copyright © 2011-2022 走看看