2013-02-05 17 views
5

मेरे पास एक ऐसा पृष्ठ है जिसे उपयोगकर्ता एंड्रॉइड, आईफ़ोन, ब्लैकबेरी या किसी अज्ञात ब्राउज़र के माध्यम से एक्सेस कर सकता है। मेरे पास 4 rich:panel एस है, प्रत्येक प्लेटफॉर्म के लिए एक और बाद वाला एक सामान्य है।केवल एक घटक प्रस्तुत करने के लिए कैसे करें यदि कोई अन्य घटक प्रस्तुत नहीं किया जाता है?

कोड:

<rich:panel id="dlAndroid" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}"> 
    ... 
</rich:panel> 

<rich:panel id="dlIphone" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'iPhone')}"> 
    ... 
</rich:panel> 

<rich:panel id="dlBlackberry" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'BlackBerry')}"> 
    ... 
</rich:panel> 

<rich:panel id="dlGeneric" rendered="#{ ---> WHAT TO WRITE HERE? <--- }"> 

मैं कैसे प्रदान कर सकते हैं पिछले rich:panel केवल अगर दूसरों से कोई भी गाया गया है?

+1

क्या आपने सबसे उग्र समाधान की कोशिश की है? 'rendered =" # {not (fn: includeIgnoreCase (request.getHeader ('user-Agent'), 'एंड्रॉइड') या fn: includeIgnoreCase (request.getHeader ('user-Agent'), 'iPhone') या fn: IgnoreCase (request.getHeader ('उपयोगकर्ता-एजेंट'), 'ब्लैकबेरी'))} "'? –

+0

@ लुइगी मैन्डोज़ा मैंने कुछ ऐसा करने की कोशिश की, लेकिन इस तरह से नहीं, क्योंकि मैं कोड की इस पंक्ति को दोहराने की कोशिश नहीं कर रहा था। लेकिन बदसूरत होने के बावजूद, आपका समाधान काम करता है। –

उत्तर

3

बिंदु करने के लिए टुकड़ा, आपके सवाल के रूप में शीर्षक में कहा गया है वस्तुतः कर सकते हैं

: इस विशेष मामले में यह शायद बेहतर होता है <c:set> के साथ उन घना भाव अन्य नाम पर में

<rich:panel binding="#{panel1}" ...> 
    ... 
</rich:panel> 
<rich:panel binding="#{panel2}" ...> 
    ... 
</rich:panel> 
<rich:panel binding="#{panel3}" ...> 
    ... 
</rich:panel> 
<rich:panel ... rendered="#{not panel1.rendered and not panel2.rendered and not panel3.rendered}"> 
    ... 
</rich:panel> 

हालांकि, के रूप में उत्तर दिया जाना

ध्यान दें कि निहित #{header} मानचित्र द्वारा अनुरोध शीर्षलेख प्राप्त करने का एक छोटा रास्ता है।

+0

। इस तरह के वक्तव्यों का उपयोग करके हम फिर से दृश्य और व्यापार तर्क जोड़ रहे हैं जो एमवीसी की अवधारणा का उल्लंघन करता है। आप इसे कैसे औचित्य देते हैं? –

+0

@ कृष्ण: क्या यह (पुनः) व्यापार तर्क में कहीं भी उपयोग किया जाता है? फिर इसे वहां रखें। क्या यह विशेष रूप से दृश्य में उपयोग किया जाता है? फिर यह इसे ध्यान में रखने के लिए नुकसान नहीं पहुंचाता है। – BalusC

0

आप एक प्रबंधित बीन विधि पर यह सत्यापन लिख सकते हैं, इसलिए यह सत्यापित करेगा कि उपयोगकर्ता-एजेंट चौथा विकल्प फिट बैठता है या नहीं। उदाहरण:

public boolean userAgentUnknownBrowser() { 
// Verify if contains the user-agent String 
} 

और अपने पृष्ठ पर, आप बस विधि का उपयोग करेंगे:

<rich:panel id="dlGeneric" rendered="#{myBean.userAgentUnknownBrowser()}"> 
+0

आपको व्यवसाय तर्क को संभालने के लिए गेटर का उपयोग नहीं करना चाहिए। –

+0

ओह, क्षमा करें। विधि का दूसरा नाम भी हो सकता है। –

0

आप

<c:choose> 
<c:when test="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}"> 
<rich:panel id="dlAndroid"> 
... 
</rich:panel> 
</c:when> 
<c:when test="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'iPhone')}"> 
<rich:panel id="dlIphone"> 
... 
</rich:panel> 
</c:when> 
<c:otherwise> 
<rich:panel id="dlGeneric"> 
    ... 
</rich:panel> 
</c:otherwise> 
<c:choose> 

उपयोग कर सकते हैं मैं तुम्हें एक तर्क का उपयोग कर रहे निर्धारित करने के लिए लगता है ब्राउज़र प्रकार जो एक ही पृष्ठ पर POSTS के बीच नहीं बदलेगा, इसलिए यहां जेएसटीएल टैग का उपयोग करने के लिए मुझे सुरक्षित लगता है। जेएसटीएल टैग पृष्ठ के लिए दृश्य दृश्य के दौरान केवल एक बार निष्पादित होगा।

हालांकि आप कुछ मॉडल चर पर हालत का परीक्षण कर रहे हैं तो यह बेहतर ui में पैनलों में से प्रत्येक रैप करने के लिए है: जैसे

<ui:fragment rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}"> 
    <rich:panel id="dlAndroid"> 
    ... 
    </rich:panel> 
<ui:fragment> 
संबंधित मुद्दे