ファイル処理するコードがJSFであっというまにファイルアップロード対応になって驚いた件

ちょっとExcelファイルを処理するコードを書いたんですよ。
まあ、Apache POI使ってこんな感じだったとします。

@Named
public class Importer{
  public void doProcess(InputStream is){
    System.out.println(WorkbookFactory.create(is)
      .getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
  }
  public void doProcessWithFile(File f){
    doProcess(new FileInputStream(f));
  }
}


これを、JSF+PrimeFacesでファイルアップロード対応にするには、こんな感じのコードを付け加えます

    UploadedFile uploaded;
    
    public void doProcessWithUpload() throws Exception{
        if(uploaded == null) return null;
        doImport(uploaded.getInputstream());
    }

    //アクセッサ
    public UploadedFile getUploaded() {
        return uploaded;
    }
    public void setUploaded(UploadedFile uploaded) {
        this.uploaded = uploaded;
    } 

アクセッサがうざいですが、UploadedFileを処理するメソッドを付け加えただけですね。


あとは、UIになるxhtmlを作ります。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>ファイルアップロード</title>
    </h:head>
    <h:body>
        ファイルアップロード
        <h:form id="form" enctype="multipart/form-data">
            <p:fileUpload mode="simple" value="#{importer.uploaded}"/>
            <p:commandButton value="アップロード" action="#{importer.processWithUpload}"/>
        </h:form>
    </h:body>
</html>


こうすると、Excelファイルをアップロードするとサーバーログに左上のセルの内容が表示されます。


すでにJSF+PrimeFacesやファイルアップロードの準備は やってたとはいえ、感覚として処理にUIをかぶせるだけという記述でファイルアップロードに対応できたのが、わかってたことだけど驚きました。


JSF+PrimeFacesでアプリケーションを作っていると、処理に対してUIをかぶせるときにUIになるxhtmlを作ったら、そのUIと処理の差をうめるコードだけを少し書けばいいのですごく楽です。
Ajaxが前提のUIも、Ajaxを意識する必要がほとんどなく作れます。


これは、StrutsRailsなどリクエストベースのフレームワークを使っている開発会社とJSFを使う開発会社で、生産性だけではなくできあがるものにも差が出てくるなと思ってます。
もちろん、JSFが使えるのは業務アプリや管理画面に限るので、一般に公開するようなWebサイトを作るのであればRailsもいいと思います。でもStrutsはダメです。