12

春バージョン:2.5.6

User-Agentヘッダーの値に基づいて、ビューを特定の速度ファイルに解決したいと思います。

私の現在の考え方は、UrlBasedViewResolverに似た実装であり、ユーザーエージェントの値は、正規表現(キー)の一致に基づいて特定のディレクトリ(値)に(コンテキストを介して)マップされます。

もっと簡単な方法があると私はほぼ確信しています。

User-Agentに基づくテーマの決定に関しても同様の質問が以前に投稿されました。ただし、私の理解では、テーマは静的(css、js)コンテンツに関連しており、実際の応答構造(HTML、XMLなど)を処理するファイルではありません。

4

4 に答える 4

3

ここで提案されている他のオプションがあります

ただし、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には、定義した特定の順序で他のビューリゾルバーにビュー呼び出しを委任できるため、既に持っているビューリゾルバーを削除または変更しなくても、これを非常に簡単に実装できることです。

欠点は、ビューを過度に専門化し、アプリを保守可能な悪夢にする大量のビューファイルになってしまう可能性があることです。

お役に立てば幸いです。

于 2010-09-16T16:38:04.840 に答える
2

私は数ヶ月前に同じ問題を抱えていました!

モバイルプロジェクト(Spring 2.5.6を使用)では、SimpleUrlHandlerでインターセプターを使用することになりました。これにより、すべての着信リクエストがキャッチされ、モバイルリクエストの最後に-m.jspが追加されます。

これには2つのステップが含まれます。

1)標準のURLマッパーへのインターセプターを宣言します。

 <bean id="handlerMapping"
 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 <!--   This interceptor catches all
 requests and redirects them to portal
 or mobile html content.
 --> 
<property name="interceptors">    <list>
      <ref bean="MultiViewController"/>    </list> </property>

2)ユーザーエージェントで「モバイル」という単語を検索するインターセプターを実装します。

public class MultiViewController extends HandlerInterceptorAdapter {

私は自分のブログ(モバイルWeb開発の新しいエキサイティングな世界について)の投稿でそれについてより詳細に話します:http://plumnash.com/it/iphone-web-development-using-spring/

于 2010-02-07T23:24:40.263 に答える
1

コメントで提案されているように、カスタムビューリゾルバーを使用します。(そして私のアプリをSpring 3.0.0にアップグレードします)

于 2009-12-23T18:36:11.870 に答える
1

ViewResolverでの構成を必要としない別の方法では、トップレベルのVelocityファイルを使用してから、次のようなサブファイルを条件付きで解析する場合があります。

#if ($userAgent1)
  #parse ("user-agent-1.vm")
#elseif ($userAgent2)
  #parse ("user-agent-2.vm")
#end

ただし、新しいViewResolverを実装するか、既存のViewResolverを拡張することは、非常に単純なソリューションであり、私が行う方法です。

于 2009-12-08T21:02:32.337 に答える