java - Wicket 1.5 Servlet API 依赖项

标签 java servlets wicket wicket-1.5

我们现在将一些古老的项目从 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,我仍然可以获得我的页面。 我开始寻找有关此类行为的一些信息,但一无所获。每篇文章都说它应该开箱即用。我花了很多时间研究映射器、处理程序和/或渲染策略。在这里我可以注意到,对于 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 :

This Wicket version requires at least the following Servlet API version: Servlet API 2.5 or newer. This is provided by your container, please see the documentation of your container to see which version of the Servlet specification is supported.

所以问题是 - 我是否错过了一些东西,或者 Wicket 真的只需要 Servlet API 3.1 和(可能)更新版本?

P.S. 是的,我知道 1.5.X 版本现在已经过时了。这只是我们升级到第七步的一步。

最佳答案

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。

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

关于java - Wicket 1.5 Servlet API 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58837063/

相关文章:

java - JFace TableViewer - 如何在调用 setInput(...) 后正确触发SelectionChanged()?

java - 获取servlet中posted数组的值

apache - tomcat JndiRealm表单认证如何实现 "remember me"?

java - Apache Wicket 口 : Disabling validators on onCancel within a Wizard

java - 将多行文本写入表格单元格时遇到问题

java - 在 Wicket 口文本字段中只允许整数

java - RemoteWebDriver - 调试 headless Docker 容器

java - SWT - PrintDialog 打印表/表查看器的内容

java - 查找 Mockito 构造的导入静态语句

java - 如何使用JSP翻页保留参数