我在jsf中找到了各种各样的例子,人们已经成功地做到了这一点;在这些示例中,该人曾经用于显示动态的复选框列表。
我试图通过使用我的复选框构建一个HtmlPanelGrid,然后在页面上显示该HtmlPanelGrid来做一些稍微不同的事情。复选框显示在屏幕上,就像我使用路径一样。
当我尝试从复选框中捕获值以查看它们是否已被选中时,会出现问题。我已将'responses'数组值初始化为'false'。在我提交表单并选中了几个复选框后,我查看数据库并将所有值保存为false(当应该有一些'true'时)。
希望我的代码片段有助于识别我做错了什么:
来自displayForm.xhtml的片段:
<h:form id="form_selection_test">
<!-- Display the prompt -->
<h3>
<h:outputText id="selection_prompt" value="#{testBean.prompt}"></h:outputText>
</h3>
<!-- Display the selection - the type of selection will vary based on misc criteria -->
<h:panelGrid binding="#{myBean.testSelectionGrid}">
</h:panelGrid>
<br/><br/>
<h:commandButton id="selection_form_submit" type="submit" value="Submit!" action="#{myBean.processSelection}"/>
</h:form>
片段
public HtmlPanelGrid getTestSelectionGrid()
{
myGrid = new HtmlPanelGrid();
myGrid.setColumns(2);
List children = myGrid.getChildren();
// get application from faces context
FacesContext facesInstance = FacesContext.getCurrentInstance();
Application app = facesInstance.getApplication();
ExpressionFactory expFactory = app.getExpressionFactory();
int numChoices=choices.size(); //choices is the array containing the values for each selection option
responses.clear(); //clear any old values out of the array;
//initialize the response array (also a part of myBean) - this is supposed to capture the items the user selects
for(int initAns=0;initAns<numChoices;initAns++)
{
responses.add("false");
}
/*
*
* Other selection types (non-checkbox)
* These other selection types seem to work fine with capturing user responses
*
*/
if (selectionToDisplay =="multipleChoiceCheckbox")
{
HtmlSelectManyCheckbox checkboxPanel = new HtmlSelectManyCheckbox();
checkboxPanel.setLayout("pageDirection");
checkboxPanel.setValue("#{myBean.responses}");
Map<Object,Object> checkChoiceList = new HashMap<Object,Object>();
for (int i=0;i<numChoices;i++)
{
Object choiceValueExpression= expFactory.createValueExpression(facesInstance.getELContext(),"#{question.responses["+i+"]}",String.class).getValue(facesInstance.getELContext());
checkChoiceList.put("TEST["+i+"]"+choices.get(i),"true");//choiceValueExpression);
}
UISelectItems checkboxList = new UISelectItems();
checkboxList.setValue(checkChoiceList);
checkboxPanel.getChildren().add(checkboxList);
children.add(checkboxPanel);
}//end of if that checks if we're supposed to display MultipleChoiceCheckbox
return myGrid;
}
我一直在玩各种各样的排列,但这是我迄今为止最接近的排列。看起来至少现在复选框组正在与我的'respnoses'数组正确关联,但我仍然无法将它复制到相应的数组元素中。
我可以查看或开始的任何建议和/或想法?
提前谢谢!
崖
答案 0 :(得分:0)
每当您在bean中动态创建UIInput
或UICommand
组件时,必须提供您自己的组件ID,而不是让JSF自动生成组件ID。
checkboxPanel.setId("someIdWhichIsUniqueWithinUIForm");
这样JSF就能找到提交的值。此外,您不应该在每次getter调用时重新创建组件。将创建的组件分配给实例变量,并添加if
检查,只有null
时才会创建它。
public HtmlPanelGrid getTestSelectionGrid() {
if (myGrid == null) {
myGrid = new HtmlPanelGrid();
// ...
}
return myGrid;
}
无关,您是否考虑过使用rendered
属性显示/隐藏不同输入类型的标记文件或复合组件?在可重用性和可维护性方面,以编程方式创建组件并不是一个非常好的方法。以下是一些应该提供一些基本想法的链接: