2012-01-08 18 views
5

नामक एक पेज/मेरा फली अपने preRenderView घटना प्रत्येक पोस्टबैक, जहां n (वर्तमान मिलाकर) Postbacks की संख्या घटित हो चुके है के लिए तो पहले पृष्ठ लोड पर दो बार गोली चलाई 2 + n बार है।JSF preRenderView कई बार

यहां कुछ अन्य पोस्ट पढ़ने के बाद, मैंने <f:metadata/> के बाहर स्थानांतरित कर दिया और इससे preRenderView कॉल की संख्या कम हो गई। यही है, इसे एक बार पूर्ण पृष्ठ लोड पर और प्रत्येक पोस्टबैक के लिए 1 + n बार कहा जाता है। मैंने <f:view/> के बाहर <f:event/> टैग को स्थानांतरित करने का भी प्रयास किया, लेकिन इसका कोई प्रभाव नहीं पड़ा।

मुझे यकीन है कि अगर यह प्रासंगिक है नहीं कर रहा हूँ:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <f:view contentType="text/html"> 
     <ui:insert name="metadata"/> 
     <h:head> 
      <!-- Some stuff here --> 
      <ui:insert name="content"/> 
      <!-- More stuff here --> 
     </h:head> 
     <h:body> 
     </h:body> 
    </f:view> 
</html> 

और पेज के प्रासंगिक बिट:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <title></title> 
    </h:head> 
    <h:body> 
     <ui:composition template="/WEB-INF/templates/myLayout.xhtml"> 
      <ui:define name="windowTitle">My Page</ui:define> 
      <ui:define name="metadata"> 
       <f:event type="preRenderView" listener="#{myBean.preRenderView}"/> 
      </ui:define> 
      <ui:define name="content"> 
       <!-- Some content here --> 
       <h:panelGroup id="reRenderable" layout="block"> 
        <!-- More content here --> 
        <h:form prependId="false"> 
         <h:outputLabel for="mySelector" value="Item:"/> 
         <h:selectOneMenu id="mySelector" 
             value="#{myBean.item}" 
             converter="#{myConverter}" 
             validator="#{itemActiveValidator.validate}"> 
          <f:selectItems value="#{myBean.myItems}"/> 
          <f:ajax render=":reRenderable"/> 
         </h:selectOneMenu> 
        </h:form> 
        <!-- More content here --> 
       </h:panelGroup> 
       <!-- More content here --> 
      </ui:define> 
     </ui:composition> 
    </h:body> 
</html> 

उत्तर

5

यह अभी तक एक और Mojarra बग की तरह लग रहा पेज एक टेम्पलेट का उपयोग करता है: JAVASERVERFACES-2162

मैं इस प्रकार वैकल्पिक हल आवेदन किया है और यह काम करता है:

<ui:define name="metadata"> 
    <f:metadata> 
     <f:viewParam name="dummy"/> 
     <f:event type="preRenderView" listener="#{myRecordsBean.preRenderView}"/> 
    </f:metadata> 
</ui:define> 

जो कुछ भी करने के लिए बाकी है, वह इस फ़ाइल से मुक्त पृष्ठों को रखने के लिए टेम्पलेट तक dummy पुश पर पुश करें।

+3

यह एक बुरा बग है :(आप, या कोई और, इस से परेशान हैं, तो बग लिए वोट करें। –

+1

पहले से ही किया था। मैं आवृत्ति हाल ही में वृद्धि के साथ चमक से स्पष्ट Mojarra कीड़े भर में आ रहा हूँ। यह नहीं है जैसे कि मैं ढांचे में विदेशी डिजाइनों और अजीब उपयोग के मामलों को shoehorn करने की कोशिश कर रहा हूं। –

+3

आप सही हैं, हालांकि ईमानदार होने के लिए मैं अपने द्वारा उपयोग किए जाने वाले सॉफ़्टवेयर के हर टुकड़े में चमकदार रूप से स्पष्ट बग का सामना कर रहा हूं (हाइबरनेट, फ़ायरफ़ॉक्स, आपका नाम यह) :( –

-1

कोशिश

@ManagedBean 
@XScoped --sessionScope,viewScope 
Public class MyRecordsBean{ 
public void preRenderView(){ 
if (!FacesContext.getCurrentInstance().isPostback(){ 
//put initView codes here 
} 

}

+0

मुझे लगता है कि आपको ठोस समस्या को समझ में नहीं आया। – BalusC

+0

@ बाल्लूसी सही है। यह समस्या पोस्टबैक के साथ होती है इसलिए आपकी पोस्टबैक चेक प्रत्येक डुप्लिकेट ईवेंट के लिए पास हो जाएगी। आप समाधान * ए * समस्या का जवाब देते हैं, बस यह नहीं। -1 –

+0

ठीक है। तुम सही हो। मुझे प्रत्येक पोस्टबैक भाग के लिए 2 + एन बार पढ़ने की याद आती है। –

-1

इस प्रयास करें। मुझे आपके कोड और नीचे के बीच तकनीकी अंतर नहीं पता है। मैंने <ui:insert name="content"/> हेड टैग से बॉडी टैग के बीच स्थान बदल दिया। और f:metadata जोड़ें। लेकिन जब मैं इस तरह उपयोग करता हूं तो यह दो बार कॉल नहीं करता है। ठीक काम करता है। यह पृष्ठ संरचना के बारे में हो सकता है। शायद दो बार एचटीएमएल टैग का उपयोग करने के बारे में। तुमको एक चाहिए। लेकिन भागों को गायब करने वाले पूर्ण पृष्ठ, केवल रचना ब्लॉक वाले हिस्सों को याद करते हैं।

<!DOCTYPE html> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:fb="http://www.facebook.com/2008/fbml"> 

    <f:view contentType="text/html"> 
     <f:metadata> 
      <ui:insert name="metadata"/> 
      </f:metadata> 


     <h:body> 
       <!-- Some stuff here --> 
       <ui:insert name="content"/> 
       <!-- More stuff here --> 
     </h:body> 
    </f:view> 
    </html> 




<?xml version="1.0" encoding="UTF-8"?> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
      xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       template="/WEB-INF/templates/myLayout.xhtml"> 




     <ui:define name="windowTitle">My Page</ui:define> 
     <ui:define name="metadata"> 
      <f:event type="preRenderView" listener="#{myBean.preRenderView}"/> 
     </ui:define> 
     <ui:define name="content"> 
      <!-- Some content here --> 
      <h:panelGroup id="reRenderable" layout="block"> 
       <!-- More content here --> 
       <h:form prependId="false"> 
        <h:outputLabel for="mySelector" value="Item:"/> 
        <h:selectOneMenu id="mySelector" 
            value="#{myBean.item}" 
            converter="#{myConverter}" 
            validator="#{itemActiveValidator.validate}"> 
         <f:selectItems value="#{myBean.myItems}"/> 
         <f:ajax render=":reRenderable"/> 
        </h:selectOneMenu> 
       </h:form> 
       <!-- More content here --> 
      </h:panelGroup> 
      <!-- More content here --> 
     </ui:define> 
    </ui:composition> 
+0

इसमें टेम्पलेट और पेज का उपयोग करने वाले पेज दोनों में एचटीएमएल टैग शामिल करने के लिए कुछ भी नहीं है। ' 'के बाहर सब कुछ अनदेखा किया जाता है। –

+0

चीजें मैंने यूई के बारे में कहा: comp मुद्दा के बारे में हो सकता है। लेकिन यदि आप ध्यान से देखते हैं तो मैंने कोड में वास्तविक परिवर्तन किया है। मैंने आपके '' f में: मेटाडाटा टैग डाला और अपनी सामग्री को सिर से शरीर में ले जाया।यह मामला मामले में सही काम करता है। मैं बात यह एफ के बारे में है: मेटाडाटा। क्या आप इसे आजमा सकते है? अगर यह काम नहीं करता है तो मैं कुछ भी वचन नहीं लिखता :-) –

+0

दुर्भाग्यवश, आप टेम्पलेट में '' नहीं डाल सकते हैं। कल्पना उतनी ही बताती है और मैं आपको पहले हाथ के अनुभव से बता सकता हूं (इस प्रश्न के उत्तर की खोज के हिस्से के रूप में) यह सिर्फ मोजाररा में काम नहीं करता है। अन्यथा मैं निश्चित रूप से ऐसा करता हूं और टेम्पलेट में वर्कअराउंड ('डमी 'व्यू पैरामीटर) डालता हूं। –

संबंधित मुद्दे