2012-02-16 5 views
1

StreamedContentプロパティのオブジェクトのリストがあり、<p:graphicImage>コンポーネントに表示する必要があります。ui:repeat/h:dataTable/p:dataTableの内部でStreamedContentを使用してp:graphicImageを使用する方法

<ui:repeat value="#{testuser.answers}" var="imageanswers"> 
    <p:graphicImage value="#{imageanswers.imageAnswer}" alt="Image" width="200" height="100" /> 
    <br /> 
</ui:repeat> 

しかしこれは表示されていません。代わりに代替テキストが表示されます。私はこの他のポストUse of p:graphicImage in ui:repeat or p:dataTableを見ましたが、私はgetImages()メソッドを理解していません。

答えて

3

私は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> 

繰り返しgraphicImagevalue属性は、管理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())); 
} 
+2

+1をgraphicImageはを使用しようとする場合、それは問題です:)唯一の違いは、Iでありますまた、 'getImage()'はビュースコープのBeanでは機能しません。 Beanは実際にリクエスト/セッション/アプリケーションスコープでなければなりません。完全に別のアプリケーションスコープのBeanが最適です。 – BalusC

+1

@BalusCあなたの時間を無駄にしてうれしいです:)私は 'getImage'がViewScoped Beanで動作しないことに気付かず、なぜですか?また、私は常にプロジェクトで別々のRequestScoped Beanを使用していますが、なぜこのケースではApplicationScopedが優れていますか? –

+2

ビュースコープ付きBeanは、ビューに固有です。リソース要求には、ビューの概念はありません。リクエストスコープBeanは、1回のリクエストごとに再作成されます。しかし、Beanインスタンスは実際にはリクエストスコープの状態を保持しません。すべての仕事は、代わりにゲッターで行われます。 – BalusC

0

あなたは私の10分を無駄にしては非常に類似した答えを投稿するため...だけでなく、複合コンポーネント内

関連する問題