JSF - 多选择复选框无法捕获响应

时间:2011-09-03 16:39:06

标签: jsf-2

我在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>




来自myBean.java的

片段

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'数组正确关联,但我仍然无法将它复制到相应的数组元素中。

我可以查看或开始的任何建议和/或想法?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

每当您在bean中动态创建UIInputUICommand组件时,必须提供您自己的组件ID,而不是让JSF自动生成组件ID。

checkboxPanel.setId("someIdWhichIsUniqueWithinUIForm");

这样JSF就能找到提交的值。此外,您不应该在每次getter调用时重新创建组件。将创建的组件分配给实例变量,并添加if检查,只有null时才会创建它。

public HtmlPanelGrid getTestSelectionGrid() {
    if (myGrid == null) {
        myGrid = new HtmlPanelGrid();
        // ...
    }

    return myGrid;
}

对具体问题

无关,您是否考虑过使用rendered属性显示/隐藏不同输入类型的标记文件或复合组件?在可重用性和可维护性方面,以编程方式创建组件并不是一个非常好的方法。以下是一些应该提供一些基本想法的链接: