GWT中的动态形式

时间:2012-03-22 20:52:44

标签: java gwt

我正在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表单示例非常简单,或者声明了显式字段。我应该看看第三方图书馆吗?如何获得动态值?

1 个答案:

答案 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