JavaEE 7 Servlet 3.1の新機能

Servlet 3.1は非同期などまぁとっつきが悪いのが目玉です。
しかし、お手軽かつシンプルによくなったものが追加されています。


それはPartです。


え?Part自体はすでにあるって?
http://d.hatena.ne.jp/shin/20090723/p1
たしかに、ちょうど4年くらい前に紹介してますね。もう4年もたってるんですね。そりゃJavaEE 6はかれた旧世代の環境だわー。誰もが知っていて当たり前の技術だわー。


ですが、当時からパワーアップしているのですよ、こいつも!

サーブレットかくのたるいので、UPLOADが対応したJSF 2.2を使います。すごいらくちんにかけますよ。

テンプレート

昨日のエントリをすこしいだけいじります。今回は先にテンプレートから。

<?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:jsf="http://xmlns.jcp.org/jsf">
    <head jsf:id="head">
        <title>JSF 2.2ですね</title>
    </head>
    <body jsf:id="body">
        <form jsf:id="form" enctype="multipart/form-data" >
            <input type="file" jsf:value="#{hoge.part}" />
            #{hoge.text}
            <hr/>
            <input type="submit" value="送信" jsf:action="#{hoge.action1}" />
        </form>
    </body>
</html>

はい、普通のXHTMLですね。inputFileという新しいタグの存在を知る必要はありません。ふつうにinputタグのtype属性にfileを設定してjsf:valueでバインドしたいプロパティを設定します。実はこちらの方が覚えるものが少ないかもしれないという。

コード

こちらも前回のに少し手を加えます。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.servlet.http.Part;

@ManagedBean
@RequestScoped
public class Hoge {
    String text = "初期値";
    private Part part;

    public Part getPart() {
        return part;
    }

    public void setPart(Part part){
        this.part = part;
        text = part.getSubmittedFileName();//ココ!
    }
    public String action1(){
        return null;
    }

    public String getText() {
        return text;
    }
    
}

setPartメソッドをみてください。なんとアップロードしたファイル名が取得できます。

・・・え?

はい、Servlet 3.0のときはなかったのです。たしかみんなヘッダからパースしていたと思います。


3.1というわけではないですが、JSFの場合サーブレット用のアノテーションであるマルチパートコンフィグは使えませんから、ファイルアップロード制限はweb.xmlに書くとよいでしょう。javax.faces.webapp.FacesServletはfinalですので継承してアノテーションをつけるというわけにはいきません。

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <multipart-config>
            <max-file-size>50</max-file-size>
        </multipart-config>
    </servlet>

個別設定にはvalidatorを利用することが可能です。


JSF 2.2 Uploadについての基本的な設定や動きはこちらを参照するとよいでしょう。
http://den2sn.hatenablog.com/entry/2013/06/18/235018
特に文字コードのところ大事です。


はい、今回はタイトル詐欺でお届けしました。