与Primefaces 3.0.M2的麻烦SelectOneMenu Ajax行为

前端之家收集整理的这篇文章主要介绍了与Primefaces 3.0.M2的麻烦SelectOneMenu Ajax行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我执行两个SelectOneMenu控件时遇到麻烦,其中第二个选择的数据取决于第一个选择。在PrimeFaces展示的这个例子与我想要实现的几乎相同: http://www.primefaces.org/showcase-labs/ui/pprSelect.jsf

除了我必须从数据库获取数据。

上述示例在同一个项目中正常工作。我正在使用NetBeans 7.0与GlassFish 3.1和PrimeFaces 3.0.M2,最新的下降(2011年6月20日)。

JSF页面的源代码和被管理的bean被附加。

  1. <?xml version='1.0' encoding='UTF-8' ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml"
  4. xmlns:h="http://java.sun.com/jsf/html"
  5. xmlns:p="http://primefaces.prime.com.tr/ui"
  6. xmlns:f="http://java.sun.com/jsf/core">
  7. <h:head><title>Facelet Title</title></h:head>
  8. <h:body>
  9. <p:log />
  10. <center>
  11. <h:form>
  12. <h:outputText value="State: "/>
  13. <p:selectOneMenu id="selectState" value="#{stateCityBean.selectedStateArray}">
  14. <f:selectItem itemLabel="Select Any" itemValue="Empty String"/>
  15. <p:ajax update="selectCity" listener="#{stateCityBean.updateCityMap}"/>
  16. <f:selectItems value="#{stateCityBean.stateMap}" />
  17. </p:selectOneMenu>
  18. <p></p>
  19. <h:outputText value="City: "/>
  20. <p:selectOneMenu id="selectCity" value="#{stateCityBean.selectedCityArray}">
  21. <f:selectItem itemLabel="Select Any" itemValue="Empty String"/>
  22. <f:selectItems value="#{stateCityBean.cityMap}"/>
  23. </p:selectOneMenu>
  24. </h:form>
  25. </center>
  26. </h:body>

StateCityBean.java

  1. package com.xyz.mbeans;
  2. import com.iwizability.priceinfo.dao.*;
  3. import com.iwizability.priceinfo.pojo.*;
  4. import java.util.LinkedHashMap;
  5. import java.util.Map;
  6. import javax.faces.bean.ManagedBean;
  7. import javax.faces.bean.SessionScoped;
  8. import javax.faces.context.FacesContext;
  9. import javax.faces.context.Flash;
  10. import javax.faces.event.ValueChangeEvent;
  11.  
  12. @ManagedBean
  13. @SessionScoped
  14. public class StateCityBean {
  15. private String selectedStateArray;
  16. private Map<String,State> StateMap;
  17. private Map<String,City> CityMap;
  18. private String selectedCityArray;
  19.  
  20. public StateCityBean() {
  21. System.out.println("Inside.............. ");
  22. StateMap = new LinkedHashMap<String,State>();
  23. CityMap = new LinkedHashMap<String,City>();
  24. }
  25.  
  26. public String getSelectedStateArray() {return selectedStateArray;}
  27.  
  28. public void setSelectedStateArray(String selectedStateArray) {this.selectedStateArray = selectedStateArray;}
  29.  
  30. public Map<String,State> getStateMap() {
  31. StateDaoImpl stateObj = new StateDaoImpl();
  32. StateMap = stateObj.getState();
  33. return StateMap;
  34. }
  35.  
  36. public void setStateMap(Map<String,State> stateArray) {this.StateMap = stateArray;}
  37.  
  38. public String getSelectedCityArray() {return selectedCityArray;}
  39.  
  40. public void setSelectedCityArray(String selectedCityArray) {this.selectedCityArray = selectedCityArray;}
  41.  
  42. public Map<String,City> getCityMap() {
  43. CityDaoImpl cityObj = new CityDaoImpl();
  44. int stateId = 0;
  45. if (selectedStateArray != null && !selectedStateArray.equals("")) {
  46. stateId = StateMap.get(selectedStateArray).getId();
  47. }
  48. CityMap = cityObj.getCity(stateId);
  49. return CityMap;
  50. }
  51.  
  52. public void setCityMap(Map<String,City> CityArray) {
  53. this.CityMap = CityArray;
  54. }
  55.  
  56. public void updateCityMap() {
  57. CityDaoImpl cityObj = new CityDaoImpl();
  58. int stateId = 0;
  59. if (selectedStateArray != null && !selectedStateArray.equals("")) {
  60. stateId = StateMap.get(selectedStateArray).getId();
  61. this.CityMap = cityObj.getCity(stateId);
  62. }
  63. }

}

调试时,我可以看到updateCityMap方法调用,但是SelectedStateArray变量是空的。即使强制更改绑定的CityMap变量的值也不会更新selectCity下拉列表。

正如你所猜到的,我是JSF的新手,但是由于我正在使用标签库的开发版本,所以问题更加复杂

我为您在项目中描述的完全相同的情况创建了一个演示。我有一个州和城市< p:selectOneMenu />我的页面上的元素您选择一个州,并更新城市。如果选择了不同的状态,城市将被删除,因为该状态可能不存在。

区别在于我使用< p:ajax event =“change”update =“cities,cs”/>更新元素,以及一个actionListener来更新城市,如果状态不同。

  1. <p:selectOneMenu id="states" value="#{dataBean.selectedState}"
  2. valueChangeListener="#{dataBean.stateChangeListener(event)}"
  3. style="width: 150px;">
  4. <f:selectItem itemLabel="" itemValue=""/>
  5. <f:selectItems value="#{dataBean.states}"/>
  6. <p:ajax event="change" update="cities,cs"/>
  7. </p:selectOneMenu>
  8. <h:outputLabel value="City:" for="cities"/>
  9. <p:selectOneMenu id="cities"
  10. value="#{dataBean.selectedCity}"
  11. style="width: 150px;">
  12. <f:selectItem itemLabel="" itemValue=""/>
  13. <f:selectItems value="#{dataBean.cities}"/>
  14. <p:ajax event="change" update="cs" />
  15. </p:selectOneMenu>

整个项目和演示代码可以在我的博客上找到。我看到这个帖子,决定发布我的项目。 [博客]:http://javaevangelist.blogspot.com/2012/07/primefaces-ajax-enabled.html

猜你在找的Ajax相关文章