我需要做一个应用程序,允许最终用户创建自己的表单(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中,然后我可以重新创建表单,但后来我不知道如何从每个元素中检索提交的值。
答案 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())
获取行动方法中的提交值。