公式ドキュメントの内容じゃないです。
公式ドキュメントは P.240 当たりに動的な画像のお話しが載ってます。
ソースコードさらっと見てのメモ。
primefaces/GraphicImageRenderer.java at 907f0a6d49ae50223cc98074b55b5d10d80c8764 · primefaces/primefaces · GitHub
primefaces/DynamicResourceBuilder.java at 907f0a6d49ae50223cc98074b55b5d10d80c8764 · primefaces/primefaces · GitHub
GraphicImage の cache を false に設定しないと、URL が同じになる。
普通毎回 Image を GET したくないので cache = true は設定する。
設定しなくてもデフォルト が true。
この場合、GraphicImage でとってくる画像を変更したくても、URL が変わらないと実際にサーバーにまで取ってきてくれない。
URL は graphicimage内 の param タグの値によっても変わるので、param の値が変更されるとサーバーに画像を取りに行く。
前回のサンプル sample/azurewebapps_jsf at master · OdaShinsuke/sample · GitHub だと param は name というキーにファイル名を渡す形にしているので、ファイル名が同じだけど、実際の画像が異なる場合はうまく動かない。*1
例:ファイルアップロード機能を付けて、ファイル名はユーザーが上げたファイル名そのままで保存した場合に、前の画像が表示されてしまう。
さくっと防ぐには、param を増やしてファイルが変わるたびに UUID.randomUUID() でもつけといたら回避できる。
ファイルアップロードがされるたびに 新しい UUID 生成するとか。
ザクッと適当なコード
前回のサンプルと組み合わせたら雰囲気伝わる?
@ViewScoped @Named class Bean implements Serializable { ... private String imageUUID; public String getImageUUID() { return imageUUID; } @postConstruct void postConstruct() { imageUUID = UUID.randomUUID().toString(); } public void ファイルアップロードとか取ってくるファイルを変えたい時() { ... imageUUID = UUID.randomUUID().toString(); } }
<p:graphicImage ...> <p:param ...> <p:param value="uuid" value="#{bean.imageUUID}/> </p:graphicImage>
*1:Azure にデプロイしてるwarでは cache=false にしてたので、毎回 URL が変わってるけど