Wicket の画像表示コンテンツ

固定画像、普遍的に表示させる場合は、Wicket では Image コンポーネントを使用するか、
SharedResource で、リソースに置いた画像ファイルを参照させるように、SharedResourceReference を作って
mountResource するであろう。
では、動的に画像ファイルを読出し、ファイルシステムとは限らず、DBに蓄積した LOBデータ~バイナリデータ)
を表示する場合どうするか。
表示する画像⇒ byte配列データとして読み込み⇒ByteArrayResource生成
⇒ SharedResource ⇒ SharedResourceReference ⇒ mountResource

となる。

Wicket Image component (固定)

queue(new Image("flower", new PackageResourceReference(SamplePage.class, "flower.jpg")));

SamplePage.html

<img wicket:id="flower" alt="Logo">


File system (固定)を、mountResource

String classesPath = ((WebApplication)getApplication()).getServletContext().getRealPath("WEB-INF/classes");
// Webアプリの CLASSPATH の下、img の下に画像ファイルが存在する場合、、 
getApplication().getSharedResources().add("flower.jpg", new FileSystemResource(new File(classesPath + "/img/flower.jpg").toPath()));
((WebApplication)getApplication()).mountResource("/images/flower.jpg", new SharedResourceReference("flower.jpg"));

HTML

<img src="images/flower.jpg" width="20%" height="20%">


ファイルを読み込んで、(DBから読み込んでもいいはず。。)

String classesPath = ((WebApplication)getApplication()).getServletContext().getRealPath("WEB-INF/classes");
File file = new File(classesPath + "/img/flower.jpg");
try(InputStream in = new FileInputStream(file);ByteArrayOutputStream out = new ByteArrayOutputStream()){
     in.transferTo(out);
     getApplication().getSharedResources().add("flower.jpg", new ByteArrayResource("image/jpeg", out.toByteArray()));
     ((WebApplication)getApplication()).mountResource("flowerImage", new SharedResourceReference("flower.jpg"));
}catch(Exception ex){
     // log
}

Java 10 以降なら、、InputStream の transferTo( OutputStream ) が使えるはずだ。
HTML

<img src="flowerImage" width="20%" height="20%">

Wicket を使用しないで、画像ファイルを読み込んだ結果を返す方法、、
要するに、HTTPレスポンスで、ContentType 指定して画像データバイナリを返せば良いわけで、
サーブレットを作ってもいいけど、手間かかるし。。。
そこで、当初、JSON を返すのが目的だった WebFilter を開発していたもの、それが
実は、JSONテキスト以外のバイナリを返そうと思えば返せるようにしてあったので
これを利用する。。

GitHub - yipuran/jacob: Web Application for JSON response

Jacob で URL Webコンテキスト名="sample" + "/jacob/flowerimage" に対して ImageResponder を定義

import org.jacob.JacobApplication;
import org.jacob.JsonResponder;
import org.jacob.RequestTranslater;
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;

public class LaboJacobApplication extends JacobApplication{
   @Override
   public JsonResponder init(){
   
      final String contextClasspath = getServletContext().getRealPath("WEB-INF/classes");
   
      RequestTranslater translater = getRequestTranslater();
      translater.setModules(new AbstractModule(){
         @Override
         protected void configure(){
            binder().bind(String.class).annotatedWith(Names.named("ROOT_PATH")).toInstance(contextClasspath);
         }
      });
      translater.add("/sample/jacob/flowerimage", ImageResponder.class);
      return translater;
   }
}

ImageResponder

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jacob.JsonResponder;
import org.jacob.Response;

public class ImageResponder implements JsonResponder{
   @Response  private  HttpServletResponse  response;
   @Inject @Named("ROOT_PATH") private String contextClassPath;

   @Override
   public String answer(HttpServletRequest req){

      response.setContentType("image/jpeg");

      File fileCanion = new File(contextClassPath + "/img/flower.jpg");

      try(InputStream in = new FileInputStream(fileCanion); OutputStream out =response.getOutputStream()){
         in.transferTo(out);
      }catch(Exception ex){
      
      }
      return null;
   }
}

HTML

<img src="/sample/jacob/flowerimage" width="50%" height="50%">