2010-08-24 9 views
6

मैं संभव के रूप में संक्षिप्त होने की कोशिश करेंगे, यहाँ मेरे साथ रहना कृपयाक्या कोई बटन क्लिक करते समय एक संपूर्ण वेब फ़ॉर्म नहीं भेजने का कोई तरीका है?

"A.jsf" -> प्रबंधित सेम: सेम "# {bean.list}": हमें ले जाएगा

B.jsf को
 <p:growl id="msgs" showDetail="true"/> 
     <h:form id="myform1" enctype="multipart/form-data"> 
      <p:panel header="Upload" style="font-size: 11px;"> 
       <h:panelGrid columns="2" cellpadding="10"> 
        <h:outputLabel value="Drawing:" /> 
        <p:fileUpload fileUploadListener="#{bean.handleFileUpload}" update="msgs" allowTypes="*.*;"/>       
       </h:panelGrid> 
       <p:commandButton ajax="false" immediate="true" id="back" value="Back" action="#{bean.list}"/> 
       <p:commandButton ajax="false" id="persist" value="Persist" action="#{bean.handleRevision}" /> 
      </p:panel> 
     </h:form> 

फिर handleFileUpload()

 if(!upload){ 
      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "You do not have permission to upload."); 
      FacesContext.getCurrentInstance().addMessage(null, msg); 
     } 
     ... 

"B.jsf" -> प्रबंधित सेम:

... 
<p:growl id="msgs" showDetail="true"/> 
... 
bean2 10

जब मैं अपलोड पर क्लिक करता हूं, तो यह मुझे एक उग्र त्रुटि संदेश देता है "आपको अपलोड करने की अनुमति नहीं है।", जो अच्छा है। लेकिन फिर जब मैं "बैक" पर क्लिक करता हूं, जो मुझे बीजेएसएफ ले जाएगा, तो मुझे उभरने वाला संदेश दिखाई देता है "आपको अपलोड करने की अनुमति नहीं है।" फिर। ऐसा प्रतीत होता है कि जब मैं "बैक" पर क्लिक करता हूं, तो मैं अपलोड करने के लिए अन्य फॉर्म अनुरोध भेजता हूं, जिसके बाद उसी त्रुटि संदेश उत्पन्न होता है, जिसे बीजेएसएफ पर प्रदर्शित किया जाता है। "बैक" बटन को खाली फॉर्म में डालने के अलावा, इसे ठीक करने का कोई तरीका है, क्योंकि अब मेरे पास एक-दूसरे के शीर्ष पर एक दूसरे के शीर्ष पर खड़े दो बटन हैं। मैं यह करने के लिए प्रयास करें:

FacesContext.getCurrentInstance().addMessage("tom", msg); 

उम्मीद है कि यह है, तो उसके बाद के गुर्राने आईडी = msgs साथ आईडी = "टॉम" के साथ घटक को भेजना होगा, लोड प्राप्त नहीं होता है, लेकिन कोई किस्मत। जब मैं Back बटन पर क्लिक करता हूं तो upload ध्वज को चालू करने का प्रयास करता हूं, लेकिन back नेविगेशन को संभालने वाली विधि से पहले वेब फ़ॉर्म से अनुरोध किया जाता है। एक उत्कृष्ट समाधान की तरह लगता है डी

उत्तर

5
एक खाली के रूप में "वापस" बटन डाल बगल में

, क्योंकि अब मैं एक दूसरे के शीर्ष पर खड़े दो बटन है

एचटीएमएल <form> डिफ़ॉल्ट एक block element कर रहा है। एचटीएमएल ब्लॉक तत्व डिफ़ॉल्ट रूप से एक नई लाइन में रखा गया है। आप वास्तव में इसे inline element बनाना चाहते हैं। आप सीएसएस में display: inline; का उपयोग कर ऐसा कर सकते हैं।

वास्तविक समस्या पर वापस, मुझे आश्चर्य है कि fileUploadListener विधि immediate="true" के बावजूद p:commandButton में विधि कहा जाता है। मैंने इसे पुन: उत्पन्न करने की कोशिश की और मैं इसकी पुष्टि कर सकता हूं। लेकिन मैं ऐसा होने की उम्मीद नहीं करता।आम तौर पर बटन पर "पूरे" फ़ॉर्म को सबमिट करने के लिए समाधान छोड़ने का समाधान है (कम से कम, इस विशेषता के बिना UIInput घटकों को छोड़ दें)। आगे की जांच ने मुझे सीखा कि p:fileUploadUIInput घटक नहीं है और श्रोता को मान्यताओं के बजाय लागू अनुरोध मान चरण के दौरान निकाल दिया गया है या मॉडल मूल्य चरण अपडेट किया गया है। तो यह व्यवहार पूरी तरह से अनुमानित है, लेकिन अभी भी डिजाइन में एक निरीक्षण है।

p:fileUpload के बाद से p:commandButton घटक पर ajax="false" की आवश्यकता है, तो आप दूसरे हाथ पर भी बस इसे वापस बटन से निकाल सकते हैं इतना है कि यह एक ajaxical अनुरोध आग और इसके द्वारा fileUploadListener बुलाया जा रहा है छोड़ देता है।

+0

'पीजे' बटन पर 'AJAX = "false" 'को लेना' बैक 'बटन के' कमांड बटन 'को' fileUploadListener' को कॉल करने से रोकता है, हालांकि 'नेविगेशन प्रवाह' को भी रोकता है। नतीजतन, 'बैक' बटन मुझे कोई जगह नहीं लेता है, हालांकि, 'डिस्प्ले: इनलाइन' बहुत अच्छा काम करता है, इस पर बिताने के लिए बहुत बहुत धन्यवाद, बलुस –

+0

आपका स्वागत है। – BalusC

2

वास्तव में, एक अलग रूप में बटन डाल:

यह रूप में संक्षिप्त रूप में मैं इसे होना चाहता हूँ नहीं है, इसलिए मैं इसके लिए माफी माँगता हूँ चाहता हूँ। बटन अब और संरेखित नहीं होने का कारण यह है कि नया प्रारंभ <form> तत्व अपनी लाइन पर शुरू होता है। आप अपनी सीएसएस फ़ाइल में form { display: inline; } जोड़कर इसे रोकने में सक्षम होना चाहिए।

उस ने कहा, यदि आपके पास कुछ बचे हुए त्रुटि संदेश हैं जिन्हें आप छुटकारा पाने के लिए चाहते हैं, तो आप इसे अपने बैकिंग बीन (यदि आपके पास है) की प्रारंभिक विधि में ऐसा कर सकते हैं। peachily निम्नलिखित काम करता है:

public void clearErrorMessages() { 
    //it may get messy to debug why messages are swallowed 
    logger.debug("clearing messages, coming from " + new Exception().getStackTrace()[1]); 

    Iterator iter = FacesContext.getCurrentInstance().getMessages(); 
    while (iter.hasNext()) { 
     FacesMessage msg = (FacesMessage) iter.next(); 
     logger.debug("clearing message: " + msg.getDetail()); 
     iter.remove(); 
    } 
} 

नुकसान है कि यहाँ किसी भी त्रुटि है कि पर्चे को जमा करने और लक्ष्य पृष्ठ के समर्थन सेम आरंभ के बीच होते हैं भी निगल लिया है।

+0

धन्यवाद। मैं यह कोशिश करता हूं ' सबमिट करें बटन बैक बटन', मेरे पास अभी भी एक दूसरे के शीर्ष पर दो खड़े हैं। विधि 'clearErrorMessages() ', आपने कहा कि इसे लक्ष्य प्रबंधित बीन की विधि को प्रारंभ करने में डाला गया है, साथ ही मेरे लक्षित प्रबंधित बीन में' सत्र स्कोप्ड 'है, इसलिए कन्स्ट्रक्टर को केवल एक बार कॉल किया जाएगा जब एप्लिकेशन पहले लोड हो, जब तक कि कुछ न हों पेज रीलोड करते समय पता लगाने के लिए एनोटेशन की तरह। –

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

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