我正在GWT中构建动态表单,但我不确定如何在提交时动态检索值。
我正在从数据库中读取问题数据并手动构建添加到FormPanel
的元素:
@UiField
FormPanel formPanel;
@Override
protected void onLoad()
{
service.getFields(AysncCallbak<Fields> callback)
{
public void onSuccess(Fields result)
{
for(Object yo : fields.stuff())
{
Element div = DOM.createDiv();
div.appendChild(DOM.createInputText());
formPanel.getElement().appendChild(div);
}
}
}
}
这是psuedocode的要点,但我不确定如何在此之后检索值。
我想序列化表单(获取HTML)并使用DOM解析它,但GWT生成无效的XHTML(输入标记未终止,导致解析失败)。
我可以将数据发送到Servlet,但是我需要更多东西(其他隐藏的输入字段等)。
大多数GWT表单示例非常简单,或者声明了显式字段。我应该看看第三方图书馆吗?如何获得动态值?
答案 0 :(得分:1)
GWT不是JSP。不是PHP。
使用FormPanel适用于初学者或与现有表单处理servlet的兼容性,或用于快速和脏任务。我不得不承认,我可能忘记了如何使用表格面板。
一旦您熟悉Forms,您可能希望转移到RPC,RequestBuilder或RES以将数据提交到服务器。
首先,在GWT中你应该避免获取小部件的元素,除非绝对必要(例如调整JSNI的行为)。
以下是一些可能不太精确的代码,但它可以解决这个问题。
protected void onLoad() {
HashMap<String, Widget> formWidgetHash = new HashMap<String, Widget>();
FlexTable table = new FlexTable();
FormPanel form = new FormPanel();
form.setWidget(table);
service.getFields(AysncCallbak<Fields> callback) {
public void onSuccess(Fields result) {
int i = 0;
for(Object yo : fields.stuff()) {
mkFormWidget(formWidgetHash, table, i++, yo);
}
}
}
}
您可以在HashMap中记住表单。您可以通过HashMap的调步来查看值。
但你不必这样做。只需提交表格即可。表单将解析字段。
private void mkFormWidget(
HashMap formWidgetHash, FlexTable table, int row, Object yo) {
// LHS of table is field prompt
String prompt = resolvePrompt(yo);
table.setText(row, 0, prompt);
Widget formWidget;
if (yo instanceof Boolean){
formWidget = new CheckBox();
}
else { ...
}
else { ...
}
else {
formWidget = new TextBox();
}
table.setWidget(row, 1, w);
formWidgetHash.put(prompt, w);
}
abstract protected String resolvePrompt(Object o);
在将表单发送到服务器之前,我不明白为什么需要访问小部件。如果需要添加字段验证器,则应在mkFormWidget中实例化时将其添加到表单窗口小部件。
但是,如果您希望对表单小部件具有位置和散列键访问权限,则可以按照此问题中的答案进行操作:Maps (collection) that maintains insertion Order in java。