web-dev-qa-db-ja.com

GET paramsを使用せずに@ViewScoped Bean間でオブジェクトを渡す

私はbrowse.xhtmlを持っています。ここでcarsのリストを閲覧し、[もっと見る]ボタンがクリックされたときにdetails.xhtmlで車の詳細を表示したいと思います。それらのバッキングBeanは@ViewScopedであり、それぞれBrowseBeanおよびDetailsBeanと呼ばれます。

ここで、ユーザー/クライアントがURLに車のIDを表示したくないので、 here および here のように、GET paramsの使用を避けたいと思います。

これを達成する方法はありますか? PrimeFaces 5とOmniFaces 1.8.1でMojarra 2.2.8を使用しています。

16
Chris

リダイレクトを送信するか、単にナビゲートするかによって異なります。

リダイレクトを送信する場合は、Flashスコープに配置します。

Faces.setFlashAttribute("car", car);

これは@PostConstruct次のBeanとして:

Car car = Faces.getFlashAttribute("car");

または、単にナビゲートしている場合は、リクエストスコープに配置します。

Faces.setRequestAttribute("car", car);

これは@PostConstruct次のBeanとして:

Car car = Faces.getRequestAttribute("car");

以下も参照してください。

私はあなたが他のビューなしではなく、他のビューなしでは存在できない(べき等である)2つの完全に独立したビューを持つというデザインの選択について非常によく知っていると思います。条件付きでレンダリングされたコンテンツを含む単一のビュー。また、実際にべき等に(つまり、ブックマーク、共有リンク、サーチボットなどを介して)要求されている場合に、ビューが正確にどのように動作するかをすでに知っていること。そうでない場合は、この質問の回答を注意深く読むことを強くお勧めします: JSF内を移動する方法?URLに現在のページを反映させる方法(前のページではない)


Update:OmniFacesを使用していない場合は、それぞれ以下を使用します。

FacesContext.getCurrentInstance().getExternalContext().getFlash().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("car");
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("car");
39
BalusC