springmvc 自定義view支持json和jsonp格式數據返回

1.若是controlloer上用@ResponseBody註解,則用<mvc:message-converter>裏面配置的json解析器進行解析html

<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註解,理由看一.java

自定義View進行json和jsonp格式的自動判斷並返回相應的json格式web

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解析器選擇spring

<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則會使用另外的;json

favorPathExtension:是否支持擴展名,默認爲true(支持),擴展名指的xxx.json、xxx.xml等形式mvc

favorParameter:是否啓用參數支持,默認爲true(支持),即xxx?format=json、xxx?format=xml等形式,這裏的參數名默認爲format,能夠經過配置改變。app

ignoreAcceptHeader:是否忽略accept header,默認是false(不忽略),即請求時指定的contentType:application/json等,因爲我這裏要使用擴展名的形式返回,因此把另外兩項都關閉了,可視不一樣狀況,使用不一樣設置;ide

mediaTypes:配置擴展名到mimeType的映射,這裏配置了json和xml的映射;jsonp

defaultViews:配置視圖,這裏配置了json和xml的視圖,json使用的jackson;orm

 

這樣就能夠實現不一樣的文件擴展名用不一樣的View解析器進行解析

相關文章
相關標籤/搜索