私はgetImages方法
getImages
方法は<ui:repeat>
のvalue
属性として設定することを起こるimages
プロパティのゲッターであるを取得するドント。
なぜそれがStringオブジェクトのリストですか? graphicImage
コンポーネントの値がStreamedContentである必要がありますか?
はい、その値はStreamedContentでなければなりませんが、StreamedContentsをループしてページ上の画像のリストを構築することはできません。その理由は、graphicImage
PrimefacesコンポーネントがHTMLページ上で標準のHTML <img>
タグにレンダリングされるためです。 FirebugやFiddlerや他のツール用のコンソール出力を見ると、JSFページのリクエストが通知され、ページが参照する各イメージ・リソースに対して別個のリクエストが行われます。これらのイメージ・リソースは、一連の独立したリクエストから1つずつロードする必要があります。したがって、どのリクエストがどのイメージにマップされているかをManagedBeanがどのように認識していますか?
これは、本質的にgraphicImageコンポーネントを構築するときに、idで識別される特定のイメージのWebサーバーへの参照を含むHTMLイメージタグを構築するため、リピートコンポーネントが一意のイメージIDのリストを反復処理する必要がある理由です。このユニークなIDを送信するには、<f:param>
faceletsタグを使用しています。このタグでは、HTTPリクエストパラメータとして識別された固有のものが追加されます。
<ui:repeat value="#{bean.images}" var="imageID">
<p:graphicImage value="#{bean.image}">
<f:param name="imageID" value="#{imageID}" />
</p:graphicImage>
</ui:repeat>
繰り返しgraphicImage
のvalue
属性は、管理Beanプロパティゲッターであり、それは他のすべてのgraphicImage
成分を取得するイメージをロードするための同じ方法です。違いは、image
プロパティ取得メソッドでは、FacesContext
を使用して、HTTPリクエストパラメータとして渡された独自のimageIDを取得できることです。
public StreamedContent getImage() {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest myRequest = (HttpServletRequest) context.getExternalContext().getRequest();
String imageID = (String) myRequest.getParameter("imageID");
return new DefaultStreamedContent(new ByteArrayInputStream(themeFacade.find(Long.parseLong(imageID)).getImage()));
}
+1をgraphicImageはを使用しようとする場合、それは問題です:)唯一の違いは、Iでありますまた、 'getImage()'はビュースコープのBeanでは機能しません。 Beanは実際にリクエスト/セッション/アプリケーションスコープでなければなりません。完全に別のアプリケーションスコープのBeanが最適です。 – BalusC
@BalusCあなたの時間を無駄にしてうれしいです:)私は 'getImage'がViewScoped Beanで動作しないことに気付かず、なぜですか?また、私は常にプロジェクトで別々のRequestScoped Beanを使用していますが、なぜこのケースではApplicationScopedが優れていますか? –
ビュースコープ付きBeanは、ビューに固有です。リソース要求には、ビューの概念はありません。リクエストスコープBeanは、1回のリクエストごとに再作成されます。しかし、Beanインスタンスは実際にはリクエストスコープの状態を保持しません。すべての仕事は、代わりにゲッターで行われます。 – BalusC