检票口:将类型的安全页面构造函数映射到可读的URL



我使用Wicket 6.1,我试图弄清楚如何使我的页面流更加更好,更多的书签URL。

我经常使用类型的安全构造仪,因此我的代码通常看起来像这样:

class SearchResultsPage extends WebPage {
  public SearchResultsPage(SearchResultsModel model) {
     // display the data in the model
  }
}

要导航到页面,我有这样的代码:

AjaxButton ajaxButton = new IndicatingAjaxButton("ajaxbutton") {
    @Override
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
        SearchResultsModel results = search(kriteriamodel)                
        getRequestCycle().setResponsePage(new SearchResultsPage(results));
    }
    @Override
    protected void onError(AjaxRequestTarget target, Form<?> form) {
        target.add(feedback);
    }
};

现在,当我到达结果页面时,我的URL看起来像搜索搜索?5

我希望能够将搜索参数编码为用户可以为稍后引用的URL编码。

我知道我可以使用pageparameters映射,并从该结构中手动映射我的对象。但是我正在寻找更优雅的解决方案。

  • 我正在寻找一些聪明界面的指针,我的页面或模型应实现,以使页面更加书签。
  • 一个例子也很好。
  • 理想情况下,页面/模型中只有代码应更改。

谢谢。

我要做的就是这样:

class SearchResultsPage extends WebPage {
  public static PageParameters convertModelToParam(SearchResultsModel model) {
     ...
  }
  public static SearchResultModel convertParamToModel( PageParameters param ) {
    //this is for convenience only
    ...
  }
  public SearchResultsPage( PageParameters param ) {
    this( convertParamToModel( param ) );
  }
  private SearchResultsPage(SearchResultsModel model) {
    // display the data in the model
  }
}

以这种方式,您的页面变得可以书签,但是您可以保留类型安全的构造函数。这里明显的缺陷是,一旦您拥有一个接受PageParameters的构造函数,就无法确保它来自适当的转换方法。但是,当您考虑它时,它是现实世界的准确模型:用户可以自由编辑URL中的查询字符串,并且您的应用程序应该能够处理。

请记住,一旦可以将页面添加为书签,参数就会成为用户输入,因此,在将它们转换为业务对象之前,它们绝对必须对其进行消毒。没有自动化系统会为您做到这一点。

最新更新