2009-12-08 11 views
10

स्प्रिंग संस्करण आधारित समाधान करना: 2.5.6वसंत MVC: देखने उपयोगकर्ता-एजेंट पर

मैं उपयोगकर्ता-एजेंट हैडर के मूल्य पर आधारित एक विशिष्ट वेग फाइल करने के लिए दृश्य को हल करना चाहते हैं।

मेरी वर्तमान सोच की सोच urlBasedViewResolver के समान कार्यान्वयन है जैसे उपयोगकर्ता-एजेंट मान नियमित रूप से अभिव्यक्ति (कुंजी) से मेल खाने के आधार पर एक विशिष्ट निर्देशिका (मान) पर Map'd (संदर्भ के माध्यम से) है।

मुझे लगभग निश्चित है कि एक आसान तरीका है।

एक समान प्रश्न पहले उपयोगकर्ता-एजेंट के आधार पर थीम निर्धारण के संबंध में पोस्ट किया गया था। हालांकि, मेरी समझ यह है कि थीम्स स्थिर (सीएसएस, जेएस) सामग्री से अधिक संबंधित हैं, न कि कौन सी फ़ाइल वास्तविक प्रतिक्रिया निर्माण (एचटीएमएल, एक्सएमएल, आदि) को संभालती है।

+1

एक कस्टम व्यू रिज़ॉल्यूशन बहुत आसान होगा, मुझे नहीं लगता कि आपको उससे कहीं अधिक सरल मिलेगा। – skaffman

+0

हाँ, बस यह सुनिश्चित कर लें कि मैं कुछ स्पष्ट नहीं दिख रहा था। –

उत्तर

1

मैं टिप्पणियों में सुझाए गए कस्टम व्यू रिज़ॉल्वर के साथ जा रहा हूं। (और मेरे ऐप को स्प्रिंग 3.0.0 में अपग्रेड करना)

+3

अपडेट: स्प्रिंग 3.0 नई ContentNegotiatingViewResolver का उपयोग करके आउट ऑफ़ बॉक्स समाधान प्रदान करता है। –

1

एक विकल्प जिसे व्यूअरोलॉल्वर में कॉन्फ़िगरेशन की आवश्यकता नहीं होती है, में शीर्ष-स्तरीय वेग फ़ाइल शामिल हो सकती है, फिर सशर्त रूप से उप-फाइलों को पार्स कर सकती है जिसमें निम्न की तरह कुछ है।

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

हालांकि, एक नया लागू करने या विस्तार के लिए एक मौजूदा ViewResolver एक बहुत सरल उपाय है और जिस तरह से मैं के साथ जाना चाहते हैं होगा।

+0

यह काम करेगा यदि वहां 1) सचमुच वहां हजारों उपयोगकर्ता एजेंट नहीं थे 2) उपयोगकर्ता एजेंट को धोखा नहीं दिया जा सका। आम तौर पर, यदि आप उपयोगकर्ता एजेंट का पता लगाना चाहते हैं, तो आप शायद कुछ गलत कर रहे हैं। – Esko

+0

@Esko "सबसे पहले से ही कुछ गलत कर रहा है"? वहां बहुत सारी आवश्यकताएं हैं, और उनमें से सभी में सभी ~ दस हजार उपयोगकर्ता-एजेंट शामिल नहीं हैं। –

+1

कभी-कभी आपको कुछ ब्राउज़रों के साथ काम करने के लिए बलिदान देना होता है। * खांसी * इंटरनेट एक्सप्लोरर * खांसी * –

2

मुझे कुछ महीने पहले भी यही समस्या थी!

हमारे मोबाइल प्रोजेक्ट (स्प्रिंग 2.5.6 का उपयोग करके) हम अपने SimpleUrlHandler के साथ एक इंटरसेप्टर का उपयोग करके समाप्त हो गए। इसने सभी आने वाले अनुरोधों और add-m.jsp को मोबाइल अनुरोधों के अंत तक पकड़ा।

1) हमारे मानक यूआरएल मैपर के लिए एक इंटरसेप्टर की घोषणा:

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

2

वहाँ एक अन्य विकल्प का सुझाव दिया here

हालांकि मैं विस्तार संकल्प लिया है ContentNegotiatingViewResolver और संकल्प ViewName विधि को ओवरराइड करना, मैंने अपना व्यू रीसोलवर एचटीपीएचडर पैराम व्यूसेवर कहा। विस्तारित विधि इस तरह दिखता है:

@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 = "उपयोगकर्ता-एजेंट" (या किसी अन्य HTTP शीर्ष लेख पैरामीटर आप चाहें, तो इस सेम एक्सएमएल में परिभाषित किया गया है), उसके बाद आप इसे का मूल्यांकन करें और viewName निर्धारित करें। मेरे मामले में HttpHeaderParamViewResolver को मानचित्र के साथ कॉन्फ़िगर किया जा सकता है जहां कुंजी वास्तविक दृश्य नाम में एक उपसर्ग है और मान एक RegExp है जिसका उपयोग हेडर पैरा के मान का मूल्यांकन करने के लिए किया जाएगा।यह ऐप प्रसंग एक्सएमएल में इस तरह दिखता है:

<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 पहले पैटर्न यह catchs साथ आवेदन तक पहुँच रहा है कॉल और मोबाइल के संलग्न कर देता है, तो webkit प्रत्यय इसलिए दृश्य अब मोबाइल-वेबकिट-उपयोगकर्ता विवरण और उसके बाद टाइल्स व्यू रीसोलवर पर भेजा गया जो वास्तविक दृश्य उत्पन्न करता है।

मैंने कई संभावनाओं की खोज की और मुझे लगता है कि यह सबसे आसान और सबसे लचीला है जिसके साथ मैं आने में सक्षम था। इस मामले में एक संपूर्ण अलग-अलग दृश्य चुनने की क्षमता महत्वपूर्ण थी क्योंकि हम डब्ल्यूएपी से आईफोन 4 और वेबकिट सक्षम मोबाइल से विभिन्न प्रकार के उपयोगकर्ता एजेंटों का समर्थन करते हैं, इसलिए विचार उपयोगकर्ता एजेंट से उपयोगकर्ता एजेंट में नाटकीय रूप से बदलते हैं। अन्य लाभ यह है कि अब आपको इस मुद्दे को इस दृश्य को संभालने की आवश्यकता नहीं है क्योंकि आप जितनी चाहें उतनी विशेषताओं को देख सकते हैं। अन्य उज्ज्वल पक्ष यह है कि आप सामग्री दृश्यगोष ViewResolver के बाद दृश्य दृश्यों को हटाने या बदलने के बिना इसे आसानी से कार्यान्वित कर सकते हैं, जो आपके द्वारा परिभाषित विशिष्ट अनुक्रम में अन्य दृश्य रिज़ॉल्यूवर को दृश्य कॉल को प्रतिनिधि करने की क्षमता है।

नीचे की ओर यह है कि आप विचारों को विशेषज्ञ बनाने के लिए लुभाने और ऐप को एक सतत दुःस्वप्न प्रदान करने वाली एक टन दृश्य फ़ाइलों के साथ समाप्त हो सकते हैं।

आशा है कि यह सहायक होगा।

+1

यह केवल स्प्रिंग 3.0 पर काम करता है क्योंकि पिछले संस्करणों में कोई ContentNegotiatingViewResolver नहीं है – Chepech