我有一个Map (Integer, List),我想从JSF页面填充它。我只使用JSF,没有使用Primefaces之类的。
在我的JSF页面上有一个selectOneMenu,它显示我的Map的每个键,还有一个selectManyBox,它为每个键选择值。
我希望能够在提交整个Map之前保存每个状态。
看我的豆子:
@ManagedBean(name="myBean")
@SessionScoped
public class MyBean implements Serializable {
(...)
public void refresh(ValueChangeEvent e)
{
if (idRole==-1){ //to check if its just the first selection
setKey((int)e.getNewValue());
}
else{
myObject.getMap().put(key,listOfValuesSelected); //put current manycheckbox values in last selected key
setKey((int)e.getNewValue()); //get new key
listOfValuesSelected=MyObject.getMap().get(Key); //refresh the
//selectManyCheckbox for the newly selected key
}
}
My JSF Page
<h:selectOneMenu id="idRole" value="#{myBean.key}" onchange="submit()" valueChangeListener="#{myBean.refresh}" render="checkbox"> >
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{myBean.listKeys}" />
</h:selectOneMenu>
<fieldset id="checkbox">
<h:selectManyCheckbox value="#{myBean.listOfValuesSelected}">
<f:selectItems value="#{myBean.listeOfValues}" var="n"
itemLabel="#{n.title}" itemValue="#{n.key}"/>
</h:selectManyCheckbox>
</fieldset>
我的实际代码有点乱,我重新安排了一下,以适应我的问题的需要,但如果需要的话,我可以给你真实的代码。
我的问题是selectmany复选框根本没有"反应"。当我处于调试模式时,我看到listOfValuesSelected被修改。
您是否在某处使用AJAX ?你用的是哪种形式?
与"不反应",你的意思是它不重新渲染,或者什么都没有发生,当你选择一个或多个项目在它?
如果您使用AJAX,那么对于给定的代码,select many复选框将确实不会重新呈现(刷新)。原因是SelectOneMenu没有一个属性"render",它会导致一些东西被重新渲染。第三方组件通常有这样的功能,但标准组件只能通过f:ajax标记实现。此外,您不能使用非组件ID作为重新呈现目标。字段集不是组件。
参见http://docs.oracle.com/javaee/6/tutorial/doc/gkabr.html关于如何使用f:ajax