只有在复制页面之前对页面执行了某些Ajax操作时,Wicket才会抛出StalePageException。
示例wicket项目可以在上找到,以及重现异常的步骤。
https://github.com/rjngshn/java-wicket-testing/tree/main
有没有办法确保这个异常不会抛出?
谢谢
拉贾尼
发布于 2021-08-12 12:19:33
Wicket中提供的默认行为是在AJAX请求进入时将其过于排队。假设您有一个带有回调的按钮,当单击它并更新UI时,它会执行一些工作。这意味着如果连续三次快速单击该按钮,则最后两个请求将被排队,并在第一个请求完成后进行处理。
一个简单的解决方案是将AjaxChannel的行为从排队更改为活动。这意味着,如果在处理活动(未完成)请求时接收到任何AJAX请求,则这些请求将被忽略。
那么,我们如何在一个地方覆盖Wicket的默认行为,并确保所有AjaxChannel都被修改呢?我们使用自定义的AjaxRequestTarget.IListener。
public class ActiveAjaxListener implements AjaxRequestTarget.IListener {
private static final AjaxChannel ACTIVE_CHANNEL = new AjaxChannel(AjaxChannel.DEFAULT_NAME, AjaxChannel.Type.ACTIVE);
@Override
public void updateAjaxAttributes(AbstractDefaultAjaxBehavior behavior, AjaxRequestAttributes attributes) {
attributes.setChannel(ACTIVE_CHANNEL);
}
}我们的ActiveAjaxListener类将修改每个AJAX行为,并确保它使用活动通道。要注册它,我们只需将以下行插入到我们的WebApplication init()方法中:
getAjaxRequestTargetListeners().add(new ActiveAjaxListener());(我从https://www.coderdreams.com/wicket-quick-tip-4-change-default-ajaxchannel-to-active/抄袭了这个解释)
另一种方法是使用面纱,通过JS/CSS防止双击。有关此方法的更多详细信息,请访问JavaScript / Wicket : How to display an overlay which prevents user interaction
https://stackoverflow.com/questions/68755844
复制相似问题