我有一个预览按钮.当用户按下预览时,表单将在新选项卡上提交,以显示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);
}
Run Code Online (Sandbox Code Playgroud)
在表格上实施
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);
Run Code Online (Sandbox Code Playgroud)
当我按下预览时,会打开一个新选项卡.但是当我输入任何ajax组件(例如:AutoCompleteTextField)时,ajax响应数据xml:<ajax-response><redirect>....</redirect></ajax-response>和刷新页面.现在,我希望在按下预览后,我仍然使用当前形式的规范.谢谢.
这是由 Wicket 中的“陈旧页面保护”引起的。第一次单击会在新选项卡/窗口中打开同一页面实例。这会增加页面的renderCount计数器,即它表示“此页面已被渲染 N 次”。
Wicket 中的链接看起来像?2-1.ILinkListener-component~path。这里“2”是页面 ID,“1”是页面渲染计数。因此 tab1 中的链接的 renderCount 为“N”,tab2 中的链接为“N+1”。
单击 tab1 中的链接将失败,并出现 StalePageException,该异常告诉 Wicket“用户正在尝试使用该页面的过时版本。请呈现该页面的最新版本,以便用户可以重试”。
需要这种保护是因为用户可能在 tab3 中执行许多操作,例如替换面板,该面板替换/隐藏用户想要在 tab1 中单击的链接。如果没有这样的保护,Wicket 在尝试单击链接时将失败并出现 ComponentNotFoundException,或者更糟糕的是,如果链接/按钮位于中继器中并且中继器已更改其在 tab2 中的项目,则更糟糕的是可能会执行错误的操作。
为了解决您的问题,您应该在 tab2 中打开一个新页面实例,即它提交表单,但onSubmit()会执行类似setResponsePage(getPage().getClass()). 这样就不会重新渲染当前页面实例 N+1 次。
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |