我使用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中的查询字符串,并且您的应用程序应该能够处理。
请记住,一旦可以将页面添加为书签,参数就会成为用户输入,因此,在将它们转换为业务对象之前,它们绝对必须对其进行消毒。没有自动化系统会为您做到这一点。