agi*_*eai 21 ajax facelets primefaces jsf-2
我在实现两个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的源代码.
<?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>
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
}
在调试时,我可以看到调用updateCityMap方法但是SelectedStateArray变量为null.即使强制更改绑定的CityMap变量的值也不会更新selectCity下拉列表.
正如您所猜测的那样,我是JSF的新手,但问题因为我正在使用标签库的开发版本而更加复杂......
我按照您的方式在 jsf 项目中选择了州 -> 城市。我发现的唯一区别是:
p:ajax
有一个change
事件:<p:ajax event="change" update="city" listener="#{contatoMB.filterCities}" />
.p:ajax
在 the 之后排在最后f:selectItems
,但这不应该是问题。f:selectItems
在城市选择中的列表是List<javax.faces.model.SelectItem>
而不是 a Map<String, City>
,您是否尝试过使用SelectItem
s 而不是地图?<h:form id="contact-form" prependId="false">
,同样,这不应该是问题。h:selectOneMenu
在 a 内部p:panel
,一些 PrimeFaces 组件在其他组件内部或外部时表现得很奇怪。如果这些都不起作用,则问题可能出在您使用的 PrimeFaces 版本上。我的 PrimeFaces 版本是 2.2.1。
归档时间: |
|
查看次数: |
16631 次 |
最近记录: |