1

我已经使用http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc实现了内容协商。

我有一个控制器 ProviderController 并且该控制器中的所有视图都在 web.xml 中附加了 .action

<servlet-mapping>
    <servlet-name>provider</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

如果需要在 html 中呈现任何视图,我使用格式查询参数(例如:renderHtml.action?format=html)。如何在不使用格式查询参数的情况下以另一种格式呈现页面?

PS:我使用的是spring 3.0。我不能使用产生注释。

谢谢

编辑 :

provider-servlet.xml 中的 viewresolver 配置

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="favorParameter" value="true" />
    <property name="parameterName" value="format" />
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="application/json" />
    <property name="favorPathExtension" value="false" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="html" value="text/html" />
        </map>
    </property>

    <property name="viewResolvers">
        <list>
            <bean
                class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/provider/" />
                <property name="suffix" value=".jsp" />
            </bean>
        </list>
    </property>

    <property name="defaultViews">
        <list>
            <bean
                class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        </list>
    </property>
</bean>

网页.xml:

<servlet>
    <servlet-name>provider</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>\WEB-INF\provider-servlet.xml</param-value>
    </init-param>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
    </init-param>       
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>provider</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

控制器 :

//The below one returns token.jsp if directly opened in browswer as http://localhost/provider/setToken.action?format=html
@RequestMapping("/provider/setToken")
public String setToken(WebRequest webRequest, Model model, HttpServletRequest request) {
    return "token";
}

//The below one returns json if directly opened in browswer as http://localhost/provider/main.action if format=html is not provided.
@RequestMapping("/provider/main")
public String main(WebRequest webRequest, Model model, HttpServletRequest request) {
    return "main";
}
4

1 回答 1

0

它在链接中说,PPA(路径,参数,接受)策略

  • 路径 - 你正在使用 .action 所以它不适用
  • 参数 - 你想远离这个
  • 接受标头 - 所以您剩下的就是在您的请求中使用 Accept 标头

确保在 ContentNegtiationViewResolverBean 中的 ignoreAcceptHeader 未设置为 true

想最简单的控制器方法

@RequestMapping(value = "/post", method = RequestMethod.POST)
public String post() {
    return "main";
}

如果您发送两个具有不同接受标头的 ajax 请求,例如。jQuery

    $.ajax({
        headers: {
            Accept: "application/json"
        },
        url: 'http://localhost:8091/post',
        type: 'POST',
        contentType: 'application/json',
        success: function () {
            console.log('success json');
        },
        error: function () {
            console.log('error');
        }
    });

    $.ajax({
        headers: {
            Accept: "text/html;charset=UTF-8"
        },
        url: 'http://localhost:8091/post',
        type: 'POST',
        contentType: 'text/html',
        success: function () {
            console.log('success');
        },
        error: function () {
            console.log('error');
        }
    })

假设您有一个 main.jsp,并且您在 conf 中也添加了 JsonView 解析器

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
   <property name="order" value="1"/>
   <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json"/>
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
        </list>
    </property>
</bean>

这两种方法的响应首先是 JSON,其次是 text/html

于 2014-10-27T10:46:20.887 回答