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 は searchresult?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 に答える