2011-06-22 10 views
21

2つのSelectOneMenuコントロールの実装に問題があります.2つ目のSelectOneMenuコントロールのデータは、最初の選択に応じて異なります。 primeFacesショーケースのこの例は、実装したいものとほぼ同じです。http://www.primefaces.org/showcase-labs/ui/pprSelect.jsfPrimeface 3.0.M2の問題SelectOneMenu Ajaxの振る舞い

ただし、データベースからデータを取得する必要があります。

上記の例は、同じプロジェクトで正しく動作しています。私はGlassFish 3.1とPrimeFaces 3.0.M2でNetBeans 7.0を使用しています。これは最新のドロップ(2011年6月20日)です。

JSFページのソースコードとマネージドBeanが添付されています。

<?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); 
    } 
} 

}

デバッグを、IはupdateCityMapメソッドが呼び出されることを確認できなくSelectedStateArray変数がヌルです。バインドされたCityMap変数の値を強制的に変更しても、selectCityドロップダウンは更新されません。

あなたが推測しているだろうと、私はJSFに新しいですが、問題は、私は、タグライブラリの開発バージョンではまだ使用していたという事実によって配合されています...

+0

これは、あなたの問題の一部であってもよいが、あなたの更新の属性があなたの街に直接言及しています'update =" selectCity "'この問題は、JSFでは、デフォルトで ''がそのidを子要素に付加することになります。あなたの ''に次の属性を指定し、問題が修正されているかどうかを確認してください。 'prependId =" false "' –

+1

@maple_shaft:これは私が見たすべての例で更新属性が使われる方法です...試しましたprependIdを無効にしても問題は解決しないようです。 – agileai

+0

したがって、p:ajaxにevent = "valueChange"属性を追加して、エラーが発生しました。j_idt8:selectState:検証エラー:値が無効です 検証エラーを調べると、問題。一般的なJSFとPrimeFacesの具体的な内容: 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-PrimeFace-Validation-Error-Value 私はviewscopedにスコープを変更しようとしましたが、それは私のためにトリックをやっていません... – agileai

答えて

0

私は状態をやりました - >あなたのやり方と同じように私のjsfプロジェクトで都市を選択してください。私が見つけた唯一の相違点は次のとおりです。

  • は私のp:ajaxchangeイベントがあります:<p:ajax event="change" update="city" listener="#{contatoMB.filterCities}" />
  • 私のp:ajaxは、f:selectItemsの後に続きますが、これは問題ではありません。
  • 私のf:selectItemsリストは都市の選択はList<javax.faces.model.SelectItem>で、Map<String, City>ではなく、地図の代わりにSelectItemを使ってみましたか?
  • 私のフォームはidとprependId falseを返します<h:form id="contact-form" prependId="false">、これも問題ではありません。
  • 私のh:selectOneMenup:panelの中にありますが、いくつかのPrimeFacesコンポーネントは、他のコンポーネントの内部または外部で異常な動作をします。

このいずれも動作しない場合は、使用しているPrimeFacesのバージョンが問題になる可能性があります。私のPrimeFacesのバージョンは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

Primefacesは何か難しいものを試しています。どうしてか分かりません。まず、これらのリリースが安定していないことを知っておく必要があります。 アナリストが火かき棒でコードを作成すると、これが押されます。 最初のコンボ都市を修正したときに国と都市のIDが2つあるコンボを仮定しますが、都市のコンボのIDの変更はcities_inputに変更され、_inputプレフィックスが追加されます。私は、アナライザがソースコードをプライムします。_inputや_panelを追加して変更IDを訪れた場合は、ツリーを横切るようなコードがあります。したがって、2回目にコンボを変更した場合。あなたは都市を更新すると言った以外はすべて完璧に動作しますが、新しいID cities_inputがあるので、ID都市を持つコンポーネントはありません。だからあなたのajaxは正しく動作しません。しかし、3.0m4以降でこのバグを修正しています。

これは問題です。この問題のもう1つの例は、誰かがこれに対してjiraを開いてしまうバグです。 春のセキュリティj_usernameでログインを使用している場合、j_passwordはj_username_input j_password_inputに変更されます。だから、これはstandartを破るし、コードは2番目のajax要求で動作しません。 ほしいと思っています。

は、ライオンハーツの言葉に注意してください。 3.m4のページで変更された素朴な名前空間はこれを使用します。 xmlns:p = "http://primefaces.org/ui"

0

おそらく、その素数バージョンですが、Beanの更新メソッドはかなり複雑に見えます。

なぜ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"/>を使用し、状態が異なる場合は都市を更新するためにactionListenerを使用しています。

<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

あなただけのPに

event="change" 

を追加する必要がありますAJAX IDでコンポーネントをドロップダウン