Java 让Wicket AjaxButton与浏览器自动完成一起工作

Java 让Wicket AjaxButton与浏览器自动完成一起工作,java,ajax,wicket,Java,Ajax,Wicket,我有一个带有输入字段、标签和ajax按钮的表单。我想根据ajax请求更改标签的值,并希望textfield通过浏览器自动完成来记住输入的值。基本结构基于 我实现了这两个目标,表单工作良好,无论是通过Enter还是通过按钮提交。我甚至可以更改textfield值并再次提交。 只有在不更改文本字段值的情况下第二次提交表单时,才会得到org.apache.wicket.core.request.mapper.StalePageException。无论第一次还是第二次提交都是通过Enter或按钮进行的。

我有一个带有输入字段、标签和ajax按钮的表单。我想根据ajax请求更改标签的值,并希望textfield通过浏览器自动完成来记住输入的值。基本结构基于

我实现了这两个目标,表单工作良好,无论是通过Enter还是通过按钮提交。我甚至可以更改textfield值并再次提交。 只有在不更改文本字段值的情况下第二次提交表单时,才会得到
org.apache.wicket.core.request.mapper.StalePageException
。无论第一次还是第二次提交都是通过Enter或按钮进行的。只要文本字段值不更改,任何组合都会导致过时的渲染计数。“未更改”包括再次输入相同的值。这也导致了例外

我不太清楚在文本字段中输入新值如何改变wicket处理页面的方式。欢迎任何帮助

HTML:

苏切 Java代码:

public class TestseitePage extends WebPage {

  private final Form w_form = new Form("w_form");

  @Override
  protected void onInitialize() {
    super.onInitialize();
    final TextField<String> w_input = new TextField<String>("w_input", new Model<String>(""));
    final Model m = new Model<String>("Test");
    final Label w_label = new Label("w_label", m);
    w_label.setOutputMarkupId(true);
    add(w_form);
    w_form.add(w_label);
    w_form.add(w_input);
    final AjaxButton w_button = new AjaxButton("w_button") {
      @Override
      protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
        try {
          Thread.sleep(2000);
        } catch (final InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        m.setObject("Button " + new Date().getTime());
        target.add(w_label);
      }
    };
    w_form.add(w_button);
  }
}
public类TestseitePage扩展网页{
私人最终表格w_表格=新表格(“w_表格”);
@凌驾
受保护的void onInitialize(){
super.onInitialize();
最终文本字段w_输入=新文本字段(“w_输入”,新模型(“”);
最终模型m=新模型(“试验”);
最终标签w_标签=新标签(“w_标签”,m);
w_label.setOutputMarkupId(真);
添加(w_表格);
w_表格添加(w_标签);
w_表单添加(w_输入);
最终AjaxButton w_按钮=新AjaxButton(“w_按钮”){
@凌驾
提交时受保护的void(最终AjaxRequestTarget目标,最终表单){
试一试{
《睡眠》(2000年);
}捕获(最终中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
m、 setObject(“按钮”+新日期().getTime());
添加(w_标签);
}
};
w_表单添加(w_按钮);
}
}

从按钮的标记中删除
onclick=“myform.submit();”
。在我看来,这将触发表单的非Ajax提交,这将导致整个页面重新呈现,从而更改
页面35; renderCount

如果我删除它,浏览器将不再记得哪些值已插入文本字段(浏览器自动完成)。浏览器只记得表单提交时,对浏览器不知道像Wicket这样的不同框架是如何进行Ajax表单提交的,因此它无法插入其中。要实现这一点,您必须应用诸如(指向iframe的自定义表单操作)之类的技巧。如果这是一个选项,也可以在应用程序中使用非Ajax提交。非Ajax提交不是一个选项,因为我需要更新页面的部分内容。我确实将隐藏的iframe作为表单的目标。我的按钮提交表单并执行其ajax代码。除了触发表单提交的第二个按钮之外,我看不出有什么区别。即使使用第二个按钮,问题仍然存在:在不更改textfield值的情况下进行第二次提交会导致
org.apache.wicket.core.request.mapper.StalePageException
public class TestseitePage extends WebPage {

  private final Form w_form = new Form("w_form");

  @Override
  protected void onInitialize() {
    super.onInitialize();
    final TextField<String> w_input = new TextField<String>("w_input", new Model<String>(""));
    final Model m = new Model<String>("Test");
    final Label w_label = new Label("w_label", m);
    w_label.setOutputMarkupId(true);
    add(w_form);
    w_form.add(w_label);
    w_form.add(w_input);
    final AjaxButton w_button = new AjaxButton("w_button") {
      @Override
      protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
        try {
          Thread.sleep(2000);
        } catch (final InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        m.setObject("Button " + new Date().getTime());
        target.add(w_label);
      }
    };
    w_form.add(w_button);
  }
}