4

我使用 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 将类似于 searchresults?5

我希望能够将搜索参数编码为用户可以添加书签以供以后参考的 URL。

我知道我可以使用 PageParameters 映射并将我的对象手动映射到该结构。但我正在寻找更优雅的解决方案。

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

谢谢。

4

1 回答 1

2

我会做的是这样的:

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 中的查询字符串,您的应用程序应该能够处理它。

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

于 2012-10-24T19:30:52.987 回答