2012-10-15 11 views
6

मैं निम्नलिखित समग्र घटक है:सशर्त एक समग्र घटक में तत्व की विशेषता प्रस्तुत करना

<?xml version="1.0" encoding="UTF-8"?> 
<ui:component xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute required="true" name="field" /> 
     <composite:attribute required="true" name="value" /> 
     <composite:attribute required="false" name="size"/> 
    </composite:interface> 

    <composite:implementation> 
    ... 
      <div class="wrapper"> 
       <h:inputText value="#{cc.attrs.value}" 
        id="#{field.id}" 
        rendered="#{field.rendered}" 
        size="#{cc.attrs.size}"> 
       </h:inputText> 
       <h:messages for="#{field.id}" styleClass="errorMessage"/> 
      </div> 
    ... 
    </composite:implementation> 
</ui:component> 

समस्या यह है कि जब मैं अपने size विशेषता सेटिंग के बिना इस घटक का उपयोग कर रहा है, यह अभी size=0 के रूप में प्रदान की गई हो जाता है एचटीएमएल इनपुट तत्व।

जो मैं चाहता हूं वह नेस्टेड h:inputText की विशेषता केवल तभी प्रस्तुत करना है जब उसके पास मान्य मान हो (उदाहरण के लिए खाली नहीं)। वैकल्पिक रूप से, मैं नेस्टेड तत्व के सभी विशेषताओं का खुलासा करना चाहता हूं यदि वे स्पष्ट रूप से ओवरराइड नहीं हैं।

यह कैसे संभव होगा?

+0

कृपया टैगिंग के साथ सावधान रहना, एक समग्र घटक एक कस्टम घटक नहीं है। यह भी देखें http://stackoverflow.com/questions/5704620/what-is-the-difference-between-custom-components-and-composite-components – BalusC

+0

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

उत्तर

10

आप JSTL <c:if> उपयोग कर सकते हैं सशर्त और <f:attribute> दृश्य का निर्माण करने के लिए अलग से एक विशेषता निर्दिष्ट करने के लिए:

<h:inputText ...> 
    <c:if test="#{not empty cc.attrs.size}"> 
     <f:attribute name="size" value="#{cc.attrs.size}" /> 
    </c:if> 
</h:inputText> 

एक वैकल्पिक समग्र घटक विशेषता के लिए एक डिफ़ॉल्ट निर्दिष्ट करने के लिए है:

<cc:attribute name="size" required="false" default="10" /> 
+0

धन्यवाद! यह काम करता है लेकिन यह मेरे लिए अजीब बात है कि अगर मैं सीधे \t 'f: विशेषता नाम =" आकार "मान =" 20 "/>' या '' मुझे 'javax.servlet.ServletException: तर्क प्रकार मिलान' मिलता है और यदि मैं ' 'मुझे' ओपन कोट को विशेषता" मान "के लिए अपेक्षित है। –

+0

इसे 'इंटीजर' होना चाहिए, न कि 'स्ट्रिंग'। – BalusC

+0

हां, लेकिन 'मान' विशेषता में 'इंटीजर' कैसे जोड़ें? उद्धरण के साथ इसे 'स्ट्रिंग' के रूप में व्याख्या किया जाता है, उद्धरण के बिना अपवाद अलग होता है। –

1

अतिरिक्त बलुससी के पोस्ट के लिए:

आपको

का उपयोग करना होगा

प्रकार = "पूर्णांक" सीसी में: विशेषता टैग:

सीसी: विशेषता नाम = "maxlength" type = "पूर्णांक"

0

मेरा मानना ​​है कि वहाँ विशेषताओं तक पहुँचने के लिए एक वैकल्पिक तरीका है। जावा जावा आरक्षित कीवर्ड नामक एक विशेषता का उपयोग करते समय मैंने इसका उपयोग जेएसएफ 2 के साथ किया है।

{cc.attrs [ 'आकार']}