【问题标题】:Dynamic Form in GWTGWT 中的动态表单
【发布时间】:2012-03-22 20:52:43
【问题描述】:

我正在 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);
              }
           }
       }
    }

这是伪代码的要点,但我不确定如何在此之后检索值。

我想序列化表单(获取HTML)并用DOM解析它,但是GWT产生无效的XHTML(输入标签没有终止,导致解析失败)。

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

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

【问题讨论】:

    标签: java gwt


    【解决方案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

    【讨论】:

    • 希望有人阅读此评论而不是那个“答案”。经验教训:不要显式操作 DOM,使用容器小部件,并存储对问题小部件的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多