【问题标题】:Wicket 1.5 Servlet API dependencyWicket 1.5 Servlet API 依赖
【发布时间】: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_RENDERONE_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


    【解决方案1】:

    Wicket 1.5 应该可以与 Servlet 2.5 一起正常工作。

    关于你的路径问题:

    1) 如果您使用 mountPage("second", SecondPage.class) 在 YourApplication#init() 中安装您的页面,那么 Wicket 应该重定向到 /second

    2) 如果您没有显式挂载它,那么 Wicket 应该重定向到 /wicket/bookmarkable/com.your.package.SecondPage

    在这两种情况下,如果页面是有状态的(因为您使用 Ajax 组件),那么它将添加 ?123,其中 123 是一个数字 - 页面 ID。

    我没有看到 servlet API 的版本与 Wicket 中的此功能之间存在任何关系。

    【讨论】:

    • 嗨@mar​​tin-g,是的,当页面未安装在Application.init() 中时就是这种情况。无论是使用 3.0 还是 3.1 api 版本,在第二个请求处理结束时 UrlRenderer 类(请参阅我提到的三个步骤)都会重定向到 com.SomePackage.SecondPage?123 但使用 3.0 API 我会重定向到 http...testapp/com.SomePackage.SecondPage?123在响应头中。并且检票口为此返回 404。使用 3.1 API 我在响应标头中已经看到完整路径 http...testapp/wicket/bookmarkable/com.SomePackage.SecondPage?123 并且它可以工作。
    • 我不知道为什么会发生这种情况,对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2012-12-23
    • 2016-09-15
    相关资源
    最近更新 更多