2009-12-08 28 views
10

Bahar Version User-Agent dayalı görünümü çözme: 2.5.6Bahar MVC:

Ben User-Agent başlığının değerine göre belirli hız dosyasına görünümünü çözmek istiyoruz.

Şu anki düşünme tarzım, UrlBasedViewResolver benzeri bir uygulama olup, kullanıcı-aracı değeri, düzenli bir ifadeyle (anahtar) eşleşen, belirli bir dizine (değer) göre Map'd (bağlam aracılığıyla) olacaktır.

Daha kolay bir yol olduğu neredeyse kesin.

Benzer bir soru

önceden User-Agent dayalı Tema belirlenmesine ilişkin gönderilmiş. Ancak benim anlayışım, Temaların asıl yanıt yapısını (HTML, XML, vb.) Işlediği değil, daha çok statik (css, js) içerikle ilişkilendirmesidir.

+1

Özel bir görünüm çözümleyici oldukça kolay olurdu, bundan daha basit bir şekilde elde edeceğinizi sanmıyorum. – skaffman

+0

Evet, sadece belli bir şeyle ilgilenmediğime emin oldum. –

cevap

1

Özel bir görünüm resolverli gidiyorum. (Ve Bahar 3.0.0 benim app yükseltme)

+3

UPDATE: Spring 3.0, yeni ContentNegotiatingViewResolver kullanarak bir kutudan çıkmış bir çözüm sunar. –

1

sonra koşullu olarak aşağıdaki gibi bir şey vardır alt dosyaları ayrıştırma, bir üst düzey Hız dosyasını içerebilir bir ViewResolver yapılandırmayı gerektirmez bir alternatif.

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

Ancak, yeni bir uygulamaya veya mevcut ViewResolver oldukça basit bir çözümdür ve ben gelirdim yol olacaktır uzanan. Yorum önerilen olarak

+0

Bu, 1) tam anlamıyla on binlerce kullanıcı aracısı olmadığı durumlarda işe yarar. 2) kullanıcı aracısı taklit edilemezdi. Genelde, kullanıcı aracısını bulmak istiyorsanız, büyük olasılıkla zaten yanlış bir şey yapıyorsunuz demektir. – Esko

+0

@Esko "büyük olasılıkla zaten yanlış bir şey yapıyor"? Orada çok fazla gereksinim var ve bunların hepsi on bin kullanıcı aracısını içermiyor. –

+1

Bazen bazı şeyleri belirli tarayıcılarla çalışmak için fedakarlık yapmak zorundasınız. * öksürük * Internet Explorer * öksürük * –

2

birkaç ay tekrar aynı problem vardı! Mobil projede

bizim SimpleUrlHandler ile önleme kullanarak sona erdi (Bahar 2.5.6 kullanarak). Bu, gelen tüm istekleri yakaladı ve herhangi bir mobil istemi sonuna -m.jsp ekledi.

1) standart URL Eşleyici'ye bir önleme ilan:

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

ve 2) Interceptor uygulanması, Kullanıcı tarafından sözcüğünün 'Mobil' aradık

İki adım yer ajan.

public class MultiViewController extends HandlerInterceptorAdapter { 

I (mobil web geliştirme yeni heyecan verici dünyası hakkında) blogumda daha ayrıntılı olarak bu konuda konuşmak mesaj: http://plumnash.com/it/iphone-web-development-using-spring/

2

Ben genişletme giderilmiş Ancak bir diğer seçenek

here önerdi yoktur ContentNegotiatingViewResolver ve çözümViewName yöntemini geçersiz kılar, ViewResolver HttpHeaderParamViewResolver'u aradım. genişletilmiş yöntem şöyle görünür:

@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); 
} 

Nerede headerParam = "User-Agent" (veya benzeri başka herhangi bir HTTP başlık parametresi, bu fasulye xml tanımlanır), bundan sonra bunu değerlendirip viewName değerini belirleyin. Benim durumda HttpHeaderParamViewResolver anahtar bir önek gerçek VIEWNAME eklenecek ve değer başlık param değerini değerlendirmek için kullanılacak bir RegExp olduğu bir harita ile yapılandırılabilir.Bu Uygulama Bağlam XML şöyle görünür:

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

O yol benim denetleyicisi bir görünüm userDetails denilen ve ilk desen onu fiksatörleri bir IPhone ile uygulamayı erişen çağırır ve Mobil platforma ekler eğer webkit, şimdi görünüm mobile-webkit-userDetails ve daha sonra gerçek görünümü oluşturan fayansViewResolver geçirilir.

Çok fazla olasılık keşfettim ve bunun en kolay ve en esnek olduğunu düşündüm. Bu durumda farklı bir görünümü seçebilme kabiliyeti kritikti çünkü WAP'tan IPhone 4'e ve WebKit özellikli mobil cihazlara kadar çok çeşitli kullanıcı aracılarını destekliyoruz, böylece kullanıcılar kullanıcı aracısından kullanıcı temsilcisine önemli ölçüde değişiyor. Diğer avantajı ise, görüntülemeyi istediğiniz gibi uzmanlaştığınız için artık bu konuyla ilgilenmeniz gerekmemektedir. Diğer parlak tarafı ise, ContentNegotiatingViewResolver görüntülemesini, tanımladığınız belirli dizideki diğer görüntü çözümleyicilerine devretme yeteneğine sahip olduğundan, halihazırda sahip olduğunuz görüntü çözümleyicilerini kaldırmanıza veya değiştirmenize gerek kalmadan bunu kolayca gerçekleştirebilirsiniz.

Aşağı tarafı, görünümleri uzmanlaştırmak ve uygulamaya bir korunabilir kabus oluşturan bir ton görüntü dosyaları ile sonuçlandırmak isteyebilirsiniz.

Yardım etmekte fayda var.

+1

Bu, önceki sürümlerde ContentNegotiatingViewResolver olmadığı için yalnızca ilkbahar 3.0'da çalışır – Chepech