getImagesメソッドを取得できません
メソッドは、の属性として設定されたプロパティgetImages
のゲッターです。images
value
<ui:repeat>
では、なぜそれがStringオブジェクトのリストなのですか?graphicImage
コンポーネントにはStreamedContentである値が必要だと思いましたか?
はい、その値はStreamedContentである必要がありますが、StreamedContentsをループして、ページ上の画像のリストを作成することはできません。その理由は、graphicImage
PrimefacesコンポーネントがHTMLページ上で標準のHTML<img>
タグにレンダリングされるためです。FirebugやFiddler、またはその他のツールのコンソール出力を見ると、JSFページのリクエストに気付くでしょう。次に、ページが参照する各画像リソースの個別のリクエストにも気付くでしょう。これらの画像リソースは、一連の個別のリクエストから1つずつロードする必要があります。それでは、ManagedBeanは、どのリクエストがどの画像にマップされているかをどのように認識しているのでしょうか。
これが、繰り返しコンポーネントが一意の画像IDのリストを反復処理する必要がある理由です。これは、本質的に、graphicImageコンポーネントを構築するときに、idで識別される特定の画像のWebサーバーへの参照を含むHTML画像タグを構築するためです。この一意のIDを送信するために<f:param>
、HTTPリクエストパラメータとして識別される一意のIDを追加するfaceletsタグを使用しています。
<ui:repeat value="#{bean.images}" var="imageID">
<p:graphicImage value="#{bean.image}">
<f:param name="imageID" value="#{imageID}" />
</p:graphicImage>
</ui:repeat>
value
繰り返しの属性はマネージドBeanプロパティゲッターであり、他のすべてのコンポーネントが取得graphicImage
するイメージをロードするための同じメソッドです。graphicImage
違いは、image
プロパティgetterメソッドでは、を使用し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()));
}