zoukankan      html  css  js  c++  java
  • springmvc 自定义view支持json和jsonp格式数据返回

    1.如果controlloer上用@ResponseBody注解,则用<mvc:message-converter>里面配置的json解析器进行解析

    <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
                    <property name="features">
                        <array>
                            <value>WriteMapNullValue</value>
                            <value>WriteNullStringAsEmpty</value>
                        </array>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    

     

    2.如果希望自定义View进行解析,则不能在controller上加 @ResponseBody注解,理由看一.

    自定义View进行json和jsonp格式的自动判断并返回相应的json格式

    public class JsonView implements View {
    
        private static final String CONTENT_TYPE = "application/json";
        private static final String RESULT = "result";
    
        @Override
        public String getContentType() {
            return CONTENT_TYPE;
        }
    
        @Override
        public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
            if(model != null && model.containsKey(RESULT)){
                Result result = (Result)model.get(RESULT);
                if(result != null){
                    ResultUtils.render(result, request, response);
                }
            }
        }
    }
    

      

    配置ContentNegotiatingViewResolver,进行json解析器选择

    <bean id="contentNegotiationManager"
              class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
            <property name="favorPathExtension" value="true" />
            <property name="favorParameter" value="true" />
            <property name="ignoreAcceptHeader" value="true" />
            <property name="ignoreUnknownPathExtensions" value="false" />
            <property name="mediaTypes">
                <map>
                    <entry key="json" value="application/json"></entry>
                    <entry key="xml" value="application/xml"></entry>
                    <entry key="html" value="text/html"></entry>
                </map>
            </property>
        </bean>
    
        <bean id="contentNegotiatingViewResolver"
              class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
            <property name="order" value="0" />
            <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
    
            <property name="useNotAcceptableStatusCode" value="false"/>
            <!-- 设置默认视图 -->
            <property name="defaultViews">
                <list>
                    <bean class="com.tools.util.JsonView"></bean>
                    <bean class="com.tools.util.JsonpView"></bean>
                </list>
            </property>
    
            <!-- 设置视图解析器 -->
            <property name="viewResolvers">
                <list>
                    <ref bean="viewResolver"/>
                </list>
            </property>
        </bean>
    

      

    order:如果存在多个viewResolver则order值小的被使用,如果没有合适的viewResolver则会使用另外的;

    favorPathExtension:是否支持扩展名,默认为true(支持),扩展名指的xxx.json、xxx.xml等形式

    favorParameter:是否启用参数支持,默认为true(支持),即xxx?format=json、xxx?format=xml等形式,这里的参数名默认为format,可以通过配置改变。

    ignoreAcceptHeader:是否忽略accept header,默认是false(不忽略),即请求时指定的contentType:application/json等,由于我这里要使用扩展名的形式返回,所以把另外两项都关闭了,可视不同情况,使用不同设置;

    mediaTypes:配置扩展名到mimeType的映射,这里配置了json和xml的映射;

    defaultViews:配置视图,这里配置了json和xml的视图,json使用的jackson;

    这样就可以实现不同的文件扩展名用不同的View解析器进行解析

  • 相关阅读:
    HDU 1863 畅通工程(Kruskal)
    HDU 1879 继续畅通工程(Kruskra)
    HDU 1102 Constructing Roads(Kruskal)
    POJ 3150 Cellular Automaton(矩阵快速幂)
    POJ 3070 Fibonacci(矩阵快速幂)
    ZOJ 1648 Circuit Board(计算几何)
    ZOJ 3498 Javabeans
    ZOJ 3490 String Successor(模拟)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
  • 原文地址:https://www.cnblogs.com/sidesky/p/7985836.html
Copyright © 2011-2022 走看看