如何检索动态生成的表单的提交值?

时间:2011-02-18 15:45:01

标签: java jsf dynamic-forms

我需要做一个应用程序,允许最终用户创建自己的表单(drop复选框,inputTexts等)保存该表单,然后用户可以打开表单并在表单元素中写入值然后打印表格。我正在使用icefaces,我在托管bean中做了一些事情:

javax.faces.component.UIViewRoot root = FacesContext.getCurrentInstance().getViewRoot();
            // find the form with its clientId.
            UIComponent a = root.findComponent("a");
            UIComponent b = a.findComponent("form");
            UIComponent form = b.findComponent("formulario");
            List children = form.getChildren();

if (tipo.equalsIgnoreCase("text")) {
                HtmlInputText inputText = new HtmlInputText();
                inputText.setId("text" + nro + (indice + 1));
                indice++;
                inputText.setValue("");
                inputText.setSize(tamanio);
                children.add(inputText);
                elemento = new Elemento(tipo, inputText.getId(), inputText.getValue().toString(), inputText.getSize());
            } else if (tipo.equalsIgnoreCase("textarea")) {
                HtmlInputTextarea inputTextArea = new HtmlInputTextarea();
                inputTextArea.setId("textarea" + nro + (indice + 1));
                indice++;
                inputTextArea.setValue("");
                inputTextArea.setCols(ancho);
                inputTextArea.setRows(alto);
                children.add(inputTextArea);
                elemento = new Elemento(tipo, inputTextArea.getId(), inputTextArea.getValue().toString(), (inputTextArea.getRows() * 10) + inputTextArea.getCols());
            } else if (tipo.equalsIgnoreCase("outputText")) {
                HtmlOutputText outputText = new HtmlOutputText();
                outputText.setId("outputText" + nro + (indice + 1));
                indice++;
                outputText.setValue(valor);
                children.add(outputText);
                elemento = new Elemento(tipo, outputText.getId(), outputText.getValue().toString(), 0);
            } else if (tipo.equalsIgnoreCase("table")) {
                HtmlDataTable table = new HtmlDataTable();
                table.setId("table" + nro + (indice + 1));
                indice++;
                // for (int k = 0; k < filas; k++) {
                for (int j = 0; j < columnas; j++) {
                    HtmlColumn column = new HtmlColumn();
                    column.setId("c" + j);
                    for (int i = 0; i < filas; i++) {
                        HtmlInputText inputColumn = new HtmlInputText();
                        inputColumn.setId("f" + i);
                        inputColumn.setValue("");
                        column.getChildren().add(inputColumn);
                    }
                    table.getChildren().add(column);
                }
                // }

                table.setValue("");
                table.setRows(filas);
                table.setColNumber(columnas);
                table.setResizable(true);
                children.add(table);
                elemento = new Elemento(tipo, table.getId(), table.getValue().toString(), (table.getRows() * 10 + table.getColNumber()));
            } else if (tipo.equalsIgnoreCase("checkbox")) {
                HtmlSelectBooleanCheckbox checkbox = new HtmlSelectBooleanCheckbox();
                checkbox.setId("checkbox" + nro + (indice + 1));
                indice++;
                checkbox.setValue("ON");
                children.add(checkbox);
                elemento = new Elemento(tipo, checkbox.getId(), checkbox.getValue().toString(), 0);
            } else if (tipo.equalsIgnoreCase("radio")) {
                HtmlSelectOneRadio radio = new HtmlSelectOneRadio();
                radio.setId("radio" + nro + (indice + 1));
                indice++;
                UISelectItems items = new UISelectItems();
                ArrayList arr = new ArrayList();
                HtmlInputText inputRadio = new HtmlInputText();
                inputRadio.setValue(" ");
                arr.add(new SelectItem(new Integer(0), inputRadio.getValue().toString()));
                items.setValue(arr);
                radio.setValue("ON");
                radio.getChildren().add(items);
                children.add(radio);
                elemento = new Elemento(tipo, radio.getId(), radio.getValue().toString(), 0);
            } else if (tipo.equalsIgnoreCase("panel")) {
                HtmlPanelGrid panel = new HtmlPanelGrid();
                panel.setId("panel" + nro + (indice + 1));
                indice++;
                children.add(panel);
                elemento = new Elemento(tipo, panel.getId(), "", 0);
            }
            elementosFormulario.add(elemento);

我可以在表单中添加元素,然后保存在DB中,然后我可以重新创建表单,但后来我不知道如何从每个元素中检索提交的值。

1 个答案:

答案 0 :(得分:2)

将值绑定到Map<String, Object>属性。

E.g。

private Map<String, Object> values = new HashMap<String, Object>(); // +getter

inputText.setValueExpression("value", createValueExpression("#{bean.values['" + field.getName() + "']}", String.class));

然后,您可以通过values.get(field.getName())获取行动方法中的提交值。

另见: