2011-06-22 11 views
21

मुझे दो सिलेक्टऑनमेनू नियंत्रणों को लागू करने में समस्या हो रही है, जहां दूसरे में डेटा पहले किए गए चयन पर निर्भर करता है। प्राइमफेस शोकेस पर यह उदाहरण लगभग वही है जैसा मैं कार्यान्वित करना चाहता हूं: http://www.primefaces.org/showcase-labs/ui/pprSelect.jsfप्राइमफेस 3.0 के साथ समस्या। एम 2 सिलेक्टऑनमेनू अजाक्स व्यवहार

सिवाय इसके कि मुझे डेटाबेस से डेटा प्राप्त करना है।

उपरोक्त उदाहरण एक ही प्रोजेक्ट में सही तरीके से काम कर रहा है। मैं ग्लासफ़िश 3.1 और प्राइमफेस 3.0.एम 2 के साथ नेटबीन्स 7.0 का उपयोग कर रहा हूं, नवीनतम ड्रॉप (20 जून 2011)।

जेएसएफ पृष्ठ और प्रबंधित बीन का स्रोत कोड संलग्न है।

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.prime.com.tr/ui" 
    xmlns:f="http://java.sun.com/jsf/core"> 
<h:head><title>Facelet Title</title></h:head> 
<h:body> 
<p:log /> 
    <center> 
     <h:form> 
      <h:outputText value="State: "/> 
      <p:selectOneMenu id="selectState" value="#{stateCityBean.selectedStateArray}"> 
       <f:selectItem itemLabel="Select Any" itemValue="Empty String"/> 
       <p:ajax update="selectCity" listener="#{stateCityBean.updateCityMap}"/> 
       <f:selectItems value="#{stateCityBean.stateMap}" /> 
      </p:selectOneMenu> 
      <p></p> 
      <h:outputText value="City: "/> 
      <p:selectOneMenu id="selectCity" value="#{stateCityBean.selectedCityArray}"> 
       <f:selectItem itemLabel="Select Any" itemValue="Empty String"/> 
       <f:selectItems value="#{stateCityBean.cityMap}"/> 
      </p:selectOneMenu> 
     </h:form> 
    </center> 
</h:body> 

StateCityBean.java

package com.xyz.mbeans; 
import com.iwizability.priceinfo.dao.*; 
import com.iwizability.priceinfo.pojo.*; 
import java.util.LinkedHashMap; 
import java.util.Map; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.context.FacesContext; 
import javax.faces.context.Flash; 
import javax.faces.event.ValueChangeEvent; 

@ManagedBean 
@SessionScoped 
public class StateCityBean { 
private String selectedStateArray; 
private Map<String, State> StateMap; 
private Map<String, City> CityMap; 
private String selectedCityArray; 

public StateCityBean() { 
    System.out.println("Inside.............. "); 
    StateMap = new LinkedHashMap<String, State>(); 
    CityMap = new LinkedHashMap<String, City>(); 
} 

public String getSelectedStateArray() {return selectedStateArray;} 

public void setSelectedStateArray(String selectedStateArray) {this.selectedStateArray = selectedStateArray;} 

public Map<String, State> getStateMap() { 
    StateDaoImpl stateObj = new StateDaoImpl(); 
    StateMap = stateObj.getState(); 
    return StateMap; 
} 

public void setStateMap(Map<String, State> stateArray) {this.StateMap = stateArray;} 

public String getSelectedCityArray() {return selectedCityArray;} 

public void setSelectedCityArray(String selectedCityArray) {this.selectedCityArray = selectedCityArray;} 

public Map<String, City> getCityMap() { 
    CityDaoImpl cityObj = new CityDaoImpl(); 
    int stateId = 0; 
    if (selectedStateArray != null && !selectedStateArray.equals("")) { 
     stateId = StateMap.get(selectedStateArray).getId(); 
    } 
    CityMap = cityObj.getCity(stateId); 
    return CityMap; 
} 

public void setCityMap(Map<String, City> CityArray) { 
    this.CityMap = CityArray; 
} 

public void updateCityMap() { 
    CityDaoImpl cityObj = new CityDaoImpl(); 
    int stateId = 0; 
    if (selectedStateArray != null && !selectedStateArray.equals("")) { 
     stateId = StateMap.get(selectedStateArray).getId(); 
     this.CityMap = cityObj.getCity(stateId); 
    } 
} 

}

डिबगिंग पर, मैं देख सकता हूँ कि updateCityMap विधि शुरू हो जाती है लेकिन SelectedStateArray चर रिक्त है। बाध्य CityMap चर के मान को बदलने के बल भी चुनिंदासिटी ड्रॉप डाउन को अपडेट नहीं करते हैं।

कि आप समझ गए हैं के रूप में, मैं JSF के लिए नया हूँ, लेकिन समस्या यह तथ्य यह है कि मैं टैग पुस्तकालय के विकास के संस्करण में एक अभी भी उपयोग कर रहा हूँ का संयोजन होता है ...

+0

यह केवल आपकी समस्या का हिस्सा हो सकता है, लेकिन अपने अद्यतन विशेषता अपने शहर के लिए सीधे बात कर रहा है आईडी द्वारा घटक ड्रॉप डाउन 'अद्यतन =" selectCity "'। इसके साथ समस्या यह है कि जेएसएफ में ' 'डिफ़ॉल्ट रूप से बाल तत्वों को अपनी आईडी प्रीपेड करेगा। निम्नलिखित विशेषता को अपने ' 'पर निर्दिष्ट करने का प्रयास करें और देखें कि क्या यह आपकी समस्या को हल करता है,' prependId =" false "' –

+1

@maple_shaft: इस तरह से मैंने देखा है कि सभी उदाहरणों में अद्यतन विशेषता का उपयोग किया गया है ... मैंने कोशिश की preendId अक्षम करना लेकिन यह समस्या को हल करने के लिए प्रतीत नहीं होता है। – agileai

+0

तो, मैंने एक घटना = "valueChange" विशेषता को पी: AJAX में जोड़ा है और अब एक त्रुटि हो रही है: j_idt8: selectState: प्रमाणीकरण त्रुटि: मान वैध नहीं है सत्यापन त्रुटि को देखने पर, ऐसा लगता है कि वेब इस से भरा है मुसीबत। जेएसएफ सामान्य रूप से और प्राइमफेस के साथ विशेष रूप से: http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=6947 http://www.java.net/blogs/lamine_ba http : //www.coderanch.com/t/501774/JSF/java/JSF- प्राइमफ़ेस- प्रमाणीकरण- त्रुटि- वैल्यू मैंने विचारों के दायरे को बदलने की कोशिश की, हालांकि, यह मेरे लिए चाल नहीं कर रहा है ... – agileai

उत्तर

0

मैं एक राज्य था -> मेरे जेएसएफ प्रोजेक्ट में शहर का चयन उसी तरह किया गया है। अंतर केवल मैंने पाया हैं:

  • मेरी p:ajax एक change घटना है: <p:ajax event="change" update="city" listener="#{contatoMB.filterCities}" />
  • मेरा p:ajaxf:selectItems के बाद आखिरी बार आता है लेकिन यह समस्या नहीं होनी चाहिए।
  • शहर में चयनित f:selectItems सूची List<javax.faces.model.SelectItem> है और Map<String, City> नहीं है, क्या आपने अपने मानचित्र के बजाय SelectItem एस का उपयोग करने का प्रयास किया है?
  • मेरे फॉर्म में एक आईडी है और प्रीपेन्ड आईडी झूठी <h:form id="contact-form" prependId="false">, फिर से, यह समस्या नहीं होनी चाहिए।
  • मेरा h:selectOneMenup:panel के अंदर है, कुछ प्राइमफ़ेस घटक कुछ अन्य घटकों के अंदर या बाहर जब एक अजीब तरीके से व्यवहार करते हैं।

यदि इनमें से कोई भी काम नहीं करता है तो समस्या यह है कि आप प्राइमफ़ेस संस्करण का उपयोग कर रहे हैं। मेरा प्राइमफेस संस्करण 2.2.1 है।

0

मैं PrimeFaces नामस्थान साथ 3.0.M4 का उपयोग करें:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 

यह ठीक से काम करने लगता है।

1

प्राइमफेस कुछ अलग करने की कोशिश कर रहा है। मुझे नहीं पता क्यों। सबसे पहले आपको पता होना चाहिए कि ये रिलीज स्थिर नहीं हैं। जब आप फायरबग के साथ कोड को एनालिस करते हैं तो आप इसे फेंक देंगे। आइए दो कॉम्बो मानें जिनके पास ids देश और शहर हैं जब आपने पहले कॉम्बो शहरों को सही तरीके से अपडेट किया था, लेकिन शहर कॉम्बो 'आईडी शहरों_इनपुट में बदल गया, तो वे _input उपसर्ग जोड़ते हैं। जब मैं प्राइमफेस स्रोत कोड analys।यदि _input या _panel जोड़कर परिवर्तन आईडी का दौरा किया जाता है तो ट्रैवर्स पेड़ की तरह कुछ कोड होते हैं। तो अगर आप दूसरी बार कॉम्बो बदलते हैं। सबकुछ सही काम करता है सिवाय इसके कि आपने अपडेट शहरों को कहा है लेकिन वहां कोई घटक नहीं है जिसके पास आईडी शहर हैं क्योंकि इसमें नए आईडी शहरों_इनपुट हैं। तो आपका AJAX सही ढंग से काम नहीं करता है। लेकिन वे 3.0m4 या रिलीज़ के बाद इस बग को सही करते हैं।

यह समस्या है। इस समस्या का एक और उदाहरण यह है कि किसी के लिए यह जिरा खुला है। यदि आप वसंत सुरक्षा j_username के साथ लॉगिन का उपयोग कर रहे हैं, j_password j_username_input j_password_input में बदलें। तो यह स्टैंडअर्ट तोड़ता है और कोड दूसरे AJAX अनुरोधों में काम नहीं करता है। उम्मीद है कि यह मदद करता है ..

शेरहार्ट शब्दों पर ध्यान देना। पृष्ठों में 3.m4 में प्राइमफ़ेस नेमस्पेस बदलते हैं। xmlns: p = "http://primefaces.org/ui"

0

शायद इसका प्राइमफ़ेस संस्करण हो सकता है लेकिन आपकी बीन में आपकी अपडेट विधि बहुत जटिल लगती है।

AJAX ईवेंट से चयन का ऑब्जेक्ट पुनर्प्राप्त क्यों नहीं करें? इस तरह आपको उस चर को परिभाषित करने की आवश्यकता नहीं है।

public void update(AjaxBehaviorEvent event) 
{ 
    Object selectOneMenuObject = ((UIOutput)event.getSource()).getValue(); 

    //String selectedStateArray = (String)((UIOutput)event... 
    //update temporary collection of second SelectOneMenu 
} 

पता नहीं है कि इससे आपकी मदद मिलेगी, लेकिन यह वही तरीका है जो मैं करता हूं।

2

मैंने आपके प्रोजेक्ट में वर्णित सटीक स्थिति के लिए एक डेमो बनाया है। मेरे पृष्ठ पर मेरे पास एक राज्य और शहर <p:selectOneMenu/> तत्व हैं। आप एक राज्य का चयन करते हैं, और शहरों को अद्यतन करते हैं। यदि एक अलग राज्य का चयन किया जाता है, तो शहर मिटा दिया जाता है क्योंकि यह राज्य में मौजूद नहीं हो सकता है।

अंतर यह है कि मैं तत्वों को अद्यतन करने के लिए <p:ajax event="change" update="cities, cs"/> का उपयोग करता हूं, और एक कार्यसूची शहर को अद्यतन करने के लिए शहर को अद्यतन करने के लिए उपयोग करती है।

<p:selectOneMenu id="states" value="#{dataBean.selectedState}" 
    valueChangeListener="#{dataBean.stateChangeListener(event)}" 
    style="width: 150px;"> 
    <f:selectItem itemLabel="" itemValue=""/> 
    <f:selectItems value="#{dataBean.states}"/> 
    <p:ajax event="change" update="cities, cs"/> 
</p:selectOneMenu> 
<h:outputLabel value="City:" for="cities"/> 
<p:selectOneMenu id="cities" 
    value="#{dataBean.selectedCity}" 
    style="width: 150px;"> 
    <f:selectItem itemLabel="" itemValue=""/> 
    <f:selectItems value="#{dataBean.cities}"/> 
    <p:ajax event="change" update="cs" /> 
</p:selectOneMenu> 

पूरे प्रोजेक्ट और डेमो कोड को मेरे ब्लॉग पर पाया जा सकता है। मैंने इस पोस्ट को देखा और मेरी परियोजना पोस्ट करने का फैसला किया। [ब्लॉग]: http://javaevangelist.blogspot.com/2012/07/primefaces-ajax-enabled.html

0

तुम सिर्फ पी में जोड़ना चाहिए

event="change" 

: ajax

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