【发布时间】:2019-11-13 12:23:14
【问题描述】:
我们现在将一些古老的项目从 Wicket 1.3.5 迁移到一些更新的版本。在 1.4.23 版本中,一切都或多或少地清楚了。当我们开始迁移到 1.5.16 时,问题就出现了。最后,我创建了简单的测试应用程序来解决问题。但令我惊讶的是,即使是简单的两页应用程序也没有按照它的设计做 - 它在使用 setResponsePage() 的简单更改页面上向我显示 404。
这是一些测试应用程序代码、我的调试步骤和一些想法。
应用类代码:
public class WicketTestApplication extends WebApplication {
public WicketTestApplication() {
super();
}
public static WicketTestApplication get() {
return (WicketTestApplication) Application.get();
}
@Override
public Class<? extends Page> getHomePage() {
return FirstPage.class;
}
protected void init() {
super.init();
getResourceSettings().getStringResourceLoaders().add(new ComponentStringResourceLoader());
getResourceSettings().getStringResourceLoaders().add(new ClassStringResourceLoader(this.getClass()));
getResourceSettings().setUseDefaultOnMissingResource(true);
getResourceSettings().getLocalizer().setEnableCache(false);
getMarkupSettings().setCompressWhitespace(true);
getMarkupSettings().setStripComments(true);
getMarkupSettings().setStripWicketTags(true);
getDebugSettings().setAjaxDebugModeEnabled(true);
getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
getRequestCycleSettings().setRenderStrategy(RenderStrategy.REDIRECT_TO_BUFFER);
}
}
FirstPage.class 代码:
public class FirstPage extends MainPage {
public FirstPage() {
Form form = new Form("formId");
add(form);
WebMarkupContainer message = new WebMarkupContainer("message");
form.add(message);
AjaxButton nextBtn = new AjaxButton("nextBtn", new CompoundPropertyModel<String>("Next Page")) {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form<?> form) {
RequestCycle.get().setResponsePage(SecondPage.class);
}
};
form.add(nextBtn);
}
}
第二页与第一页完全相同。 MainPage 仅包含几个空面板,因此在这里无关紧要。
关于问题 - 单击按钮调用相应的方法和调用必要的页面构造函数,在这个阶段一切看起来都很好,但浏览器有不同的意见 :) 对他来说是以下树步骤:
第一个请求(btn-onClick,ajax)处理良好并重定向到 "http://localhost:9082/testapp/wicket/bookmarkable/com.SomePackage.SecondPage"
第二个请求也处理得很好并重定向到 "http://localhost:9082/testapp/com.SomePackage.SecondPage?2"
最后对上述地址的第三次请求失败。
但是,如果通过在其中添加“wicket/bookmarkable”结构手动更正 URL,我仍然可以获得我的页面。 我开始寻找有关此类行为的一些信息,但一无所获。每篇文章都说它应该可以开箱即用。我花了很多时间玩 Mappers、Handlers 和/或 RenderStrategies。在这里我可以注意到,对于 RenderStrategy 为 REDIRECT_TO_RENDER 或 ONE_PASS_RENDER 的情况,一切正常。但这并不真正意味着“直接使用”,因为我们知道默认渲染策略是 REDIRECT_TO_BUFFER。
当我感到有些绝望时,我尝试从其中一个“wicket-example-articles”中创建另一个测试项目。这次我复制了包含“web.xml”内容的整个代码,并为它创建了另一个 WebShere Liberty Profice 实例。这一次面临它的工作。 在比较了两个应用程序的每一点之后,我发现只有服务器功能不同,确切地说是在 Servlet API 中。我的问题是因为我使用了旧实例,我们有 jsp-2.2 功能,它假定 Servlet API 3.0 版本。 3.1 一切正常。
官方文档says:
此 Wicket 版本至少需要以下 Servlet API 版本:Servlet API 2.5 或更高版本。这是由您的容器提供的, 请查看您的容器的文档以查看哪个版本 支持 Servlet 规范。
所以问题来了 - 我错过了什么还是 Wicket 真的只需要 Servlet API 3.1 和(也许)更新的?
P.S. 是的,我知道 1.5.X 版本现在已经过时了。这只是我们升级到第七步的一步。
【问题讨论】:
标签: java servlets wicket wicket-1.5