JSF2.2のステートレスビュー

JSF2.2のビックチケットの1つとしてステートレスビューという機能が導入されています。
これは今まで常識だったJSFはステートフルという概念を覆す機能です。


今までJSFでは初回リクエストから次のリクエストまでの間に
画面のコンポーネントツリーをセッションスコープもしくは
クライアントのhiddenに保持する必要がありました。


しかし今回導入されたステートレスビューでは
サーバに再リクエストが来た際にコンポーネントツリーを再作成するという方法で
コンポーネントツリーを保有する必要がなくなっています。
そのためサーバメモリーをまったく使用せずにJSFを利用することができるようになりました。


ステートレスビューを有効にするには画面全体を
transient="true"属性を付けたf:viewタグで囲むだけです。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <f:view transient="true">
        <h:head>
            <title>title</title>
        </h:head>
        <h:body>
            <h1>JSF Stateless mode</h1>
        </h:body>
    </f:view>
</html>


生成されるHTML内のViewState値には「stateless」という固定の文言が出力されるようになります。

<input type="hidden" name="javax.faces.ViewState" value="stateless" />


マネージドビーンをステートフルに設計してしまうと結局
サーバのセッションを使用してしまう事になるので、
完全にサーバをステートフルに保つということは難しいかもしれませんが、
コンポーネントツリーだけでもステートレスになる意味は少なくないかと思います。


今までJSFはステートフルが必須だったために
サーバをステートレスに保ちたい人たちに嫌われる傾向がありましたが
この機能の導入によりそれが解消されていくかもしれません。


パフォーマンスの面からみても向上するような結果が出ているようです。


・Stateless JSF ? high performance, zero per request memory overhead
http://www.industrieit.com/blog/2011/11/stateless-jsf-high-performance-zero-per-request-memory-overhead/


ただし注意点として、ステートを保有するようなコンポーネントが使用できなくなってしまったり
マネージドビーンの@ViewScopedが使用できなくなってしまうという弊害があるようなので
利用には十分注意が必要です。