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 でレンダリングする必要がある場合は、format クエリ パラメーターを使用します (例: renderHtml.action?format=html)。format クエリ パラメータを使用せずにページを別の形式でレンダリングするにはどうすればよいですか?

PS: 私は春 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>

web.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 ヘッダー - 残っているのは、リクエストで Accept ヘッダーを使用することです

ContentNegtiationViewResolverBean で ignoreAcceptHeader が true に設定されていないことを確認してください

最も単純なコントローラーの方法を考える

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

たとえば、異なるacceptヘッダーを持つ2つの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 があり、JsonView リゾルバーも conf に追加したとします。

<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>

2 つのメソッドの応答は、最初に JSON、2 番目に text/html になります。

于 2014-10-27T10:46:20.887 に答える