Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

GlassFishのリソース管理下にない画像を表示したい

通常、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;

    //setter getterはLombokがおススメだけど今回不使用
    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}" />

だけ指定すれば

f:id:kikutaro777:20130415231151j:plain

画像がちゃんとでました!

シンプルでいい感じですが、BackingBeanがデータを抱えるのでメモリとか気を付けないといけないのかな…?とも思ったり(^^;さてさて、どうするか。。

追記:上記を利用する際、スコープは注意が必要なようです
ViewScopeで実装したら、上手く画像が表示されませんでした。
これはPrimeFacesのユーザマニュアル(自分が確認したのはVer3.5の)のDataTableの章の最後(p.209)に注意書きがありました。うーむ。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村