ここで提案されている他のオプションがあります
ただし、ContentNegotiatingViewResolverの拡張とresolveViewNameメソッドのオーバーライドを解決し、ViewResolverHttpHeaderParamViewResolverを呼び出しました。拡張メソッドは次のようになります。
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
//Get the HTTP Header param "User-Agent"
String headerParamValue = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getHeader(headerParam);
viewName = setViewName(viewName, headerParamValue);
return super.resolveViewName(viewName, locale);
}
headerParam = "User-Agent"(または他の任意のHTTpヘッダーパラメーター、これはBean xmlで定義されます)の場合、それを評価してviewNameを決定します。私の場合、HttpHeaderParamViewResolverは、キーが実際のviewNameに追加されるプレフィックスであり、値がヘッダーパラメーターの値を評価するために使用されるRegExpであるMapで構成できます。AppContextXMLでは次のようになります。
<bean id="HttpHeaderViewResolver" class="com.application.viewresolver.HttpHeaderParamViewResolver">
<property name="viewResolvers">
<list>
<ref bean="tilesViewResolver"/>
</list>
</property>
<property name="headerParam" value="User-Agent"/>
<property name="viewPrefixPattern">
<map>
<entry>
<key>
<value>mobile-webkit</value>
</key>
<value>iPhone.*Apple.*Mobile.*Safari</value>
</entry>
<entry>
<key>
<value>mobile-bb</value>
</key>
<value>BlackBerry([0-9]{0,4})([a-zA-Z])?</value>
</entry>
</map>
</property>
</bean>
そうすれば、コントローラーがuserDetailsというビューを呼び出し、iPhoneでアプリケーションにアクセスしている場合、最初のパターンがそれをキャッチしてmobile-webkitサフィックスを追加するため、ビューはmobile-webkit-userDetailsになり、tilesViewResolverに渡されます。実際のビュー。
私は多くの可能性を探求しました、そしてこれは私が思いついた最も簡単で最も柔軟だと思います。この場合、WAPからIPhone 4やWebKit対応のモバイルまで、さまざまなユーザーエージェントをサポートしているため、まったく異なるビューを選択できることが重要でした。そのため、ビューはユーザーエージェントごとに劇的に変化します。他の利点は、ビューを好きなだけ特殊化できるため、ビューでこの問題を処理する必要がなくなることです。もう1つの優れた点は、 ContentNegotiatingViewResolverには、定義した特定の順序で他のビューリゾルバーにビュー呼び出しを委任できるため、既に持っているビューリゾルバーを削除または変更しなくても、これを非常に簡単に実装できることです。
欠点は、ビューを過度に専門化し、アプリを保守可能な悪夢にする大量のビューファイルになってしまう可能性があることです。
お役に立てば幸いです。