簡體   English   中英

Spring MVC:基於User-Agent解析視圖

[英]Spring MVC: Resolving the view based on User-Agent

春季版:2.5.6

我想根據User-Agent標頭的值將視圖解析為特定的速度文件。

我目前的思路是類似於UrlBasedViewResolver的實現,使得用戶代理值基於匹配的正則表達式(鍵)映射到(通過上下文)到特定目錄(值)。

我幾乎可以肯定有一種更簡單的方法。

之前發布了一個類似的問題,涉及基於User-Agent的主題確定。 但是,我的理解是主題更多地涉及靜態(css,js)內容,而不是哪個文件處理實際的響應構造(HTML,XML等)。

有建議的其他選擇在這里

但是,我解決了擴展ContentNegotiatingViewResolver並覆蓋resolveViewName方法,我調用了我的ViewResolver HttpHeaderParamViewResolver 擴展方法看起來像這樣:

@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 Header參數,這是在bean xml中定義的),之后您對其進行評估並確定viewName。 在我的情況下,可以使用Map配置HttpHeaderParamViewResolver ,其中鍵是要附加到實際viewName的前綴,值是將用於評估標頭參數值的RegExp。 它在App Context XML中看起來像這樣:

<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的移動設備,因此視圖從用戶代理變為用戶代理。 其他優點是您不再需要在視圖上處理此問題,因為您可以根據需要使用專門的視圖。 另一個好的方面是,您可以非常輕松地實現這一點,而無需刪除或更改您可能已經擁有的視圖解析器,因為ContentNegotiatingViewResolver能夠以您定義的特定順序將視圖調用委托給其他視圖解析器。

不足之處在於,您可能會過度專注於視圖並最終獲得大量視圖文件,從而使應用程序成為可維護的噩夢。

希望它有所幫助。

幾個月前我遇到了同樣的問題!

在我們的移動項目中(使用Spring 2.5.6),我們最終使用了一個帶有SimpleUrlHandler的攔截器。 這捕獲了所有傳入的請求,並將-m.jsp添加到任何移動請求的末尾。

它涉及兩個步驟:

1)向我們的標准URL Mapper聲明一個攔截器:

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

我在我的博客上更詳細地談論它(關於新的令人興奮的移動網絡開發世界)帖子: http//plumnash.com/it/iphone-web-development-using-spring/

在ViewResolver中不需要配置的替代方案可能涉及頂級Velocity文件,然后有條件地解析具有類似以下內容的子文件。

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

但是,實現一個新的或擴展現有的ViewResolver是一個非常簡單的解決方案,並且將是我的方式。

我將按照評論中的建議使用自定義視圖解析器。 (並將我的應用程序升級到Spring 3.0.0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM