Java GWT中的动态表单

Java GWT中的动态表单,java,gwt,Java,Gwt,我正在GWT中构建动态表单,但我不确定如何在提交时动态检索这些值 我正在从数据库中读取有问题的数据,并手动构建添加到FormPanel中的元素: @UiField FormPanel formPanel; @Override protected void onLoad() { service.getFields(AysncCallbak<Fields> callback) { public v

我正在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);
              }
           }
       }
    }
@UiField
模板模板模板;
@凌驾
受保护的void onLoad()
{
service.getFields(AysncCallbak回调)
{
成功时公共无效(字段结果)
{
for(对象yo:fields.stuff())
{
Element div=DOM.createDiv();
div.appendChild(DOM.createInputText());
formPanel.getElement().appendChild(div);
}
}
}
}
这是psuedocode中的要点,但我不确定在这一点之后如何检索值

我想序列化表单(获取HTML)并用DOM解析它,但GWT生成无效的XHTML(输入标记未终止,导致解析失败)

我可以将数据发送到Servlet,但是我需要更多的东西(其他隐藏的输入字段,等等)


大多数GWT表单示例都非常简单,或者声明了显式字段。我应该看看第三方图书馆吗?如何获取动态值?

GWT不是JSP。不是PHP

使用FormPanel是为了初学者,或者为了与现有的表单处理servlet兼容,或者为了快速而肮脏的任务。我不得不承认,我可能忘记了如何使用模板

一旦您能够快速使用表单,您可能希望转到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);
      }
    }
  }
}
我不明白为什么在将表单发送到服务器之前需要访问这些小部件。如果需要添加字段验证器,则应在mkFormWidget中实例化时将其添加到表单小部件


但是,如果您希望对表单小部件具有位置和哈希键访问权限,您可以按照此问题的答案进行操作:。

希望有人阅读此注释而不是“答案”。经验教训:不要显式地操作DOM,使用容器小部件,并存储对问题小部件的引用。
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);