我有一个预览按钮。当用户按下预览时,表单将在新选项卡上提交,以显示pdf文件中包含数据的形式。 我使用自定义SubmitLink来做到这一点 的 SubmitResourceLink
public abstract class SubmitResourceLink extends SubmitLink implements IResourceListener {
private final IResource resource;
@Override
public final void onResourceRequested() {
Attributes a = new Attributes(RequestCycle.get().getRequest(), RequestCycle.get().getResponse(), null);
resource.respond(a);
}
在表单上实施
new SubmitResourceLink("previewBtn", form, new JasperReportsResource() {
private static final long serialVersionUID = -2596569027102924489L;
@Override
public byte[] getData(Attributes attributes) {
return control.getExportPreviewByteStream(estimateModel.getObject());
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected String getTriggerJavaScript() {
String js = super.getTriggerJavaScript();
js = "document.getElementById('" + form.getMarkupId() + "').target='_blank';" + js;
return js;
}
@Override
public void onSubmit() {
form.add(AttributeModifier.append("target", Model.of("_blank")));
processInputs(form);
onResourceRequested();
}
}.setDefaultFormProcessing(false);
当我按下预览时,会打开一个新标签页。但是当我输入任何ajax组件(例如:AutoCompleteTextField)时,ajax响应数据xml:<ajax-response><redirect>....</redirect></ajax-response>
和刷新页面。
现在,我希望在按下预览后,我仍然使用当前形式的规范。
感谢。
答案 0 :(得分:1)
这是由过时页面保护引起的&#34;在Wicket。
第一次单击会在新选项卡/窗口中打开同一页面实例。这会增加页面的renderCount
计数器,即它显示&#34;此页面已呈现N次&#34;。
Wicket中的链接看起来像?2-1.ILinkListener-component~path
。这里&#39; 2&#39;是页面ID和&#39; 1&#39;是页面渲染计数。
因此,tab1中的链接具有renderCount&#39; N&#39;以及tab2中的链接 - &#39; N + 1&#39;。
单击tab1中的链接将失败,StalePageException告诉Wicket&#34;用户正在尝试使用过时的页面版本。请渲染最新版本的页面,以便用户再次尝试&#34;。
需要这种保护,因为用户可以在tab3中执行许多操作,例如替换用于替换/隐藏用户要在tab1中单击的链接的面板。如果没有这样的保护,Wicket将会失败 尝试单击链接时出现ComponentNotFoundException,如果链接/按钮位于转发器中并且转发器已更改其在tab2中的项目,则可能会执行错误操作。
要解决您的问题,您应该在tab2中打开一个新页面 instance ,即它提交表单但在onSubmit()
中执行setResponsePage(getPage().getClass())
之类的操作。这样,它就不会重新渲染当前页面实例N + 1次。