通常、Java EE6で画像ファイル等をWeb画面上に表示する場合、Webアプリのルートにあるresourcesに配置するのが多いかと思います。
で、今の開発の中で、かくかくしかじかの理由があって、Webサーバの配下じゃない(例えばC直下のフォルダとか)に画像フォルダなどをまとめているので、そこから参照してほしい、みたいな話がありました。ほむー。
金魚本を見直しても、リソース管理の所ではやはりresourcesフォルダの例でした(見逃してたらすみません…)。
普通に画像ファイルを読み込んで何かすればできるんじゃないの、と思いつつ、ぐぐってみた所、やはり色々ありそうです。
GlassFishのキーワードでそれっぽいのは以下でした。他にもありそうですが。
Tomcatではserver.xmlに
<Context docBase="/path/to/images" path="/images" />
みたいなのを書けた、的な話が出てきてて、GlassFishだとglassfish-web.xmlで
<property name="alternatedocroot_1" value="from=/images/* dir=/path/to" />
みたいに書いたりできるよ、って感じでした。
他には、この辺が詳しそうでした。
Virtual Directories in Glassfish
試してみようと思ったのですが、stackoverflowの中で「PrimeFacesのStreamedContent使ってもできるよ」ってコメントがあって、コードはなかったのですが、こっちを先に試してみました(^^;
お試しサンプルなので、雑ですがコンストラクタで画像を指定して読み込み。
package jp.co.kke.primefacesajaxsample;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
@Named(value = "graphicBean")
@RequestScoped
public class GraphicBean {
private StreamedContent myImage;
public StreamedContent getMyImage() {
return myImage;
}
public void setMyImage(StreamedContent myImage) {
this.myImage = myImage;
}
@PostConstruct
public void init(){
Path imagePath = Paths.get("C:\\temp\\duke.jpg");
try {
myImage = new DefaultStreamedContent(Files.newInputStream(imagePath, StandardOpenOption.READ),"image/jpeg");
} catch (IOException ex) {
}
}
}
JSFのViewは
<p:graphicImage value="#{graphicBean.myImage}" />
だけ指定すれば

画像がちゃんとでました!
シンプルでいい感じですが、BackingBeanがデータを抱えるのでメモリとか気を付けないといけないのかな…?とも思ったり(^^;さてさて、どうするか。。
追記:上記を利用する際、スコープは注意が必要なようです
ViewScopeで実装したら、上手く画像が表示されませんでした。
これはPrimeFacesのユーザマニュアル(自分が確認したのはVer3.5の)のDataTableの章の最後(p.209)に注意書きがありました。うーむ。