GlassFishの商用乗り換え先について(補足)

昨日のJava EE Advent Calendarの続きなんですが、前回はWebLogicをターゲットにしたんですけど、それだけだとちょっと物足りない感じもするし、何だかOracleの回し者のような気もする(笑)ので、とりあえず他の会社のも簡単に補足しておきたいと思います。

※「補足」の字が間違ってました(笑) 疲れてますねー (2013/12/09 09:35)
※ Interstageの選択について誤ったメッセージが伝わるといけないので、更に補足を追加しました(2013/12/09 14:39)

その他の会社のJava EE商用サーバー群について

今年の楽天テックカンファレンス2013でも語ったのですが、Java EEにはそれぞれ対応バージョンがあり、各社から下記のような形で出ています。

※英語のWikipediaでもかなりいい加減だったので、各社の発表やドキュメントを開き、必死に調べました(笑)

で、今回の商用製品(商用サポート付き)としてのGlassFishからの乗り換え先としては、繰り返しになりますがJava EE 7対応は残念ながらまだ出ていないです。恐らくJBossのオープンソース版であるWildFly(改名)が最初に出るのではないかな、とは思いますが、現時点では何とも言えませんね。

Java EE 6以前に関しては、概ね選り取り見取りと思ってもらっていいでしょう。最新版さえ選べば、対応しています。ベンダーによっては、最新版の提供は勧めない変な所もありますが、そういったところは品質に問題を抱えているか、もしくはサポート部隊が心許なくクレームを恐れているか、どちらかかなと思ってもらってもいいですし、何て石橋を叩いて渡る顧客思いの会社なんだ、と思ってもらっても良いと思います(笑)。

もちろん、個人的にはサポートライフサイクルが最長である最新版を選択することをお勧めしたいですが、まあそこはご自身で総合的に判断してもらった方が良いでしょう。

何を基準に決めればいいのか

さて、Java EEの商用サーバーシェアについては、いろんな調査会社があれこれ出しており、しかも会社によってバラバラの順位だったりするので眉に唾を付けて見る方がいいでしょうが(笑)、国際的にはWebLogic、WebSphereが二強、プラスJBossの三つ巴の戦いと考えてもらえれば良いかなと思います。国内を見た場合には、これに富士通のInterstageやCosminexus辺りがドカーンと参戦している形かなと思います。

わたし自身は過去これらのサーバーをだいたい使ったことがあるのですが、残念ながら最近のCosminexusを知らないというのと、WebOTXだけは実物を一度も見たことが無い、という制約はあります。

※使った(苦労した)or知ってるけど消えてしまったJava商用サーバーも多いです。Netscape Application Server (iPlanet AS)とかSilverstreamとかJRunとかOracle iAS (OC4J)とか・・・J2EE前後でかなりの興亡がありましたね・・・

で、このなかのどれがお勧めか、と問われると、どうかなぁ、と。どれも一長一短あり、なかには絶対使いたく無いものもありますが、そんなものをここで明け透けに発表したところで私自身には何の得も無いため、まあそこはオブラートに包むとしても、評価基準は幾つか持っておいた方が良いでしょう。

基準のひとつとして個人としてお勧めなのは、サポート力です。これは国内にどれだけのサポート部隊を抱えているか、バグなどが発覚した場合に、どのくらいのリードタイムでパッチ等を提供してもらえそうか、営業さんがどれだけ熱心に対応してくれるか、などなど、ここだけ見てもチェックすべき所は多数あります。これは勿論国内ベンダーが強い面もありますし、そうでない所もあります。

でも何が何でもGlassFishを商用サポート付きで使いたいたいんだ!という場合

さて、最終手段というか究極の話なんですが、でもGlassFishを愛してやまない、何とかして商用で使いたいんだ、という場合の話なんですけど、選択肢が無くは無いです。

実は、上記の製品のなかに、GlassFish互換品が含まれているんです。どれだと思いますか?

何と、富士通のInterstageの最新版なんです。Interstageといえば昔のバージョンはTomcatベースだったんですが、Java EE 5対応以降(つまり9.2以降辺り)で、GlassFish 2.xを丸ごと取り込みました。その後GlassFish 3系も取り込んだんですが、しばらく「本番用途サポート不可」という謎のステータスを経て、最新版でようやく正式に対応したようです。

勿論、GlassFish 4系ではなく3系なのでJava EE 6対応になってしまいますが、基本エンジン部分はだいたい同じであり、サーバーの乗り換えに際しての挙動変更を嫌う場合、実は良い選択肢かも知れません。

が、違う箇所もかなりあり、サポートOSの縛りがあるとか、インストーラーが独自すぎてわけわからんとか、管理コンソールとがGlassFishのと違うとか、周辺ライブラリーがごっそり違うとか、過去の遺産を引きずっているところも多分にあります。

まあ、なので勿論、決める前に実際に試用版を使ってみることをお勧めします。何とWindows XPや7などクライアントOSが非対応だったりするので、いきなり詰まる気もしますが(笑)、テスト用のWindows ServerやLinuxなどを用意してもらえれば良いかと思います。

※念のため更に補足しておきますが、Interstageが将来GlassFish 4.x系をそもそも採用するかどうか、また仮に採用したとしてもそれはいつなのか、というのは全く不明なので、もし気になる方は富士通の営業さんに実際に問い合わせてみましょう。ただ、富士通の場合、国内ベンダーらしく、サポート終了までの数年間は、ひたすら延々と黙々とサポートを続けてくれると思います。もちろん、GlassFish側も現時点では2.x系および3.x系のサポートについては一応続けています。なので、将来を見据えての乗り換え先としてはそもそも微妙でもありますし、とにかく「最終手段」です。

実は情報が少ないJava EEサーバーの選択

とまあ、一般に結構珍しいのではと思う観点でEE商用サーバーを私の視点で軽くまとめてみましたが、この辺りは意外にも公平な情報に欠ける点が多く、営業さんの営業力や技術者の趣味とか、はたまたお偉いさんによる星取表で決まってしまいがちな所でもありますけど、まあ何せプラットフォーム(土台)でもありますので、ちゃんと頭を使って選んだ方が良いですよ、という当たり前の話としてまとめておきましょう。

個人的には、どれが一番好きかって? うーん、一長一短だなぁ・・・(笑)

WebLogicをGlassFishの商用版として使う方法

※ WebLogicだけ書いておくのも何なので、その他の商用Java EEサーバーもこちらでまとめてみました(2013/12/08 22:20)
http://www.mushagaeshi.com/2013/12/08/from-glassfish-to-other-commercial/
※ GlassFish2系・3系のサポート継続について言葉が足りなかったので、念のため補足を入れました(2013/12/09 14:46)

こんにちは。Advent Calendarな時期になりましたね。この記事はJava EE Advent Calendar 2013の12/7の担当回です。12/6の回はwaritohutsuさんの http://d.hatena.ne.jp/waritohutsu/20131206 になります。

Java EE Advent Calendar 2013
http://www.adventar.org/calendars/152

ところで、先日Java EE界隈でプチ騒動が起きました。何とGlassFishの商用サポートが切られてしまったのです。大変残念な話です。

Java EE and GlassFish Server Roadmap Update (打ち切りの話が出てます)
https://blogs.oracle.com/theaquarium/entry/java_ee_and_glassfish_server

何故残念なのか? どうすればいいのか? そういった話を以下つらつらと続けてみます。Java EEは企業用途であり、商売が直接絡む話でもあって、こういった話はソフトウェア発売元もしづらいと思います。一方、困ってる所も結構多いと思いますので、ベンダー各社と全く無関係な筆者が私見をまとめてみました。

何故GlassFish商用版が必要だったのか?

この辺りに詳しくない方に一応説明だけしておきましょう。GlassFishは過去2.x系より「商用サポート」というSunおよびその買収会社であるOracleによって提供されてきた「パッチ」が存在します。Community Editionという一般公開版が3.1, 3.1.1, 3.1.2, 3.1.2.2, 4.0とバージョンを重ねてきましたが、この「商用サポート」には、何と、例えば3.1.2.2と4.0の間のバージョン、および4.0公開後に修正された一般未公開のバージョンが存在するのです。

これまでは、これを購入する場合にはOracleの営業さんに話をして、商用サポート権を購入していた訳ですね。知ってた人は知ってた話ですが、あんまり知らない人は全然知らないという系の話でしょう。

この辺りを見れば掲載されています。3系の最新版(最終版?)は何と3.1.2.6なんですね。
https://blogs.oracle.com/GlassFishForBusiness/

※念のため補足しますと、2.x系および3.x系のサポートについては、まだ一応継続しています。あくまで、将来のバージョンのサポートが無くなるという話になります。

商用サポートは何故必要だったのでしょうか? 特定の機能がちゃんと動かないとか、緊急の脆弱性が発見された場合に、その一般未公開バージョンがリリースされ、契約者はそれを適用して動作させていたのです。Java EEを利用するメインターゲットはEnterprise Editionの名前の通りEnterprise (企業)であり、何が何でも安定運用することが使命付けられたサイトやシステムに使われる事が大前提となっているから、ですね。

例えば、脆弱性があるからって放置してたり、バグで落ちまくる有名サイトがあったら利用者は困るでしょ? 金融系だと、さらに厳しくて、サービスによっては監督省庁に報告せねばならなかったりします。お金のやりとりが止まったら困りますよね? だから、企業はお金を払って、バグ修正版をもらう権利を買っていたわけです。

自分で修正すればいいじゃないかって? まあ、それはそうですが、修正したことで他の正常に動いていた機能が動かなくなったらヤバいですよね。どうやって修正が正しいことを証明するのか? それと、その次の修正版が出た場合、自分で修正した内容と異なる対処がされていたらどうでしょう? 延々と新しいバージョンが出るたびに、自分が修正した差分を適用していく必要が出てきてしまいます。ここらへんはGitやSubversionのbranchの関係を考えてもらえれば良いでしょう。つまり、公式の修正版を買った方が安い・早い・安全なのです。

ここらへんはEnterprise Systemの独特な所なので責めないで下さいね。世界中どこでも、大規模サイト、特に金融系など落ちたら大変なことになる所は、同じ事をやっています。オープンソースだからと自前で改変して独自バージョンをひたすらメンテナンスしているところは、現実の世界では実は多くはありません。

GlassFishが使えなければ、WebLogicがあるじゃないか

さて、話を元に戻しましょう。GlassFishが商用サポートの未来が無くなってしまったということは、別の商用サポートされているJava EE準拠アプリケーションサーバーを選択する必要が出てくるでしょう。幸いJava EEはMicrosoftの.NET Frameworkとは異なり、多数のベンダーが多数のアプリケーションサーバーとその商用サポートを提供しています。

そしてGlassFishの開発元であるOracleは、商用版Java EE準拠サーバーとして、WebLogic (ウェブロジック)を販売し続けています。古くからJ2EEを触ってきた人にはご存じのサーバーであり、Java EEサーバーの世界シェアNo.1、デファクトスタンダードと言われているものです。

一応言い訳をしておくと、筆者はJ2EE仕様準拠前よりWebLogicを使い続けているので、最も詳しいということがあるので、この記事ではWebLogicとしているだけです。勿論、他にもWebSphere、JBoss、Interstage、Cosminexus、WebOTX等、商用サポートが提供されているJava EE 6準拠サーバーはありますので、よりどりみどりです。

※こちらにWebLogic以外のサーバーを補足しました。
http://www.mushagaeshi.com/2013/12/08/from-glassfish-to-other-commercial/

が、最近GlassFishからJava EE世代になって入ってきた人にとってJava EEはさておき、その元ネタであるWebLogicは馴染みが薄いと思いますので、こちらも簡単に説明しておきましょう。

WebLogicの過去・未来

WebLogicは1997年頃に誕生した、元々WebLogic Inc.という会社が開発していたJava上で動くアプリケーションサーバーでした。当時はアプリケーションサーバーという名前もあるのかないのか、微妙な時代でした。名前も一時期Tengah (テンガー)というものでした。勿論、J2EE仕様なんてものもありませんでしたし、その前の暫定仕様であるProject JPE (Java Professional Edition)よりもさらに前の話です。

WebLogicはT3というプロトコルを持ち、それを土台としたEJBという独自仕様を持っていました。これはCORBAのモデルを忠実に移植したものであり、現在のEJBとほぼ同じものでした。CORBAは当時、特に金融系のデファクト・スタンダードとして、Object Brokerと呼ばれる製品と一緒に利用されていました。有名なところとしてはTuxedoやOpenJP1などがあります。トランザクション処理が可能なリモート通信を既に実現していたんですね。

これを買収した会社がTuxedoをも買収していたBEA(ビー・イー・エー)というところで、BEA WebLogic Serverという名前になり、トランザクション処理が更に強化されていきました。もはや知らない人も多いかも知れないので、読み方も補足しておきます(笑)

その後、Sunが1998年のProject JPEを経て1999年末にJ2EE仕様の初版(1.2)を出し、そこにWebLogicからEJBが持ち込まれたという経緯があります。つまり、WebLogicはJ2EEよりも古い、恐らくJavaで現存する最古の歴史を持つアプリケーションサーバーとなります。勿論、Apahce Jakarta Tomcatの登場よりもずっと前です。まだApache JServとか別の名前でした。

その後2000年代にWebLogicが一世を風靡した後、J2EE仕様が普及するにつれ圧倒的な優位性を失い、2008年頃にOracleに買収され、現在Oracle WebLogic Serverとして販売されている現状となります。

2013年末現在、このWebLogicの最新版は12c R2 (12.1.2)であり、これはJava EE 6準拠となります。残念ながらJava EE 7には現状未対応です。筆者の予測としては、来年辺りにはJava EE 7対応をしてくるのでは、と見立ててますが、残念ながら私はOracleの人ではないため、あくまで単なる推測になります。気になる方はOracleの営業さん辺りに聞いてみましょう。

GlassFish 2系・3系からWebLogicへ移行する

さて、またもや話が逸れてしまったので元に戻り、実際にWebLogicへGlassFishから移行するパターンを考えてみましょう。

まず、Java EEの対応バージョンです。WebLogicの最新版はEE 6対応なので、動作可能なアプリケーション仕様はEE 6, EE 5, J2EE 1.4の三つです。GlassFishはEE 5以降の仕様に準拠しているので、これは問題ありません。

次に、開発環境です。Java EEを開発する場合にはEclipseではなく是非NetBeansを使って頂きたいと日頃から言い続けている筆者ですが、NetBeansは幸いWebLogicにも当然ながら対応しています。サーバーのタブからWebLogicを追加すれば、GlassFishと全く同じように開発ができます。

更に有り難い話としては、WebLogicにはFaceletだけではなく、Backing BeanやEJBなどが、再配備せずとも自動的に画面に反映してくれる「Fast Swap」があります。例えば画面を書き換える場合、JSF Faceletを書き換えて、Backing Beanやその他Javaのファイルも書き換えると思うんですが、GlassFishの場合、Facelet以外を反映するためには再配備が必要になります。ところが、WebLogicのFast Swapはこれが必要ないんですね。NetBeansで書き換えて保存して再実行したら即時反映してくれます。実際の開発作業はこれが無いと結構やってられないので、現実の近代的なエンタープライズ開発現場には必須の機能です。GlassFishには残念ながらこういうプロ仕様の機能は無いので、ここはさすがに商用製品になります。

じゃあ開発にもコストがかかるか、というと、何と先日WebLogicの開発作業のためのライセンス費用が無料になりました。つまり、GlassFishと同じように、誰でもいつでもじゃんじゃん使えるわけです。但し、商用サポート締結時に入手可能な膨大なるパッチの入手はできませんので、まあそういう風に割り切って、ですね。

[WLS] WebLogic Application Server: free for developers!
http://orablogs-jp.blogspot.jp/2012/10/weblogic-application-server-free-for.html

勿論、入手はWebから普通にダウンロードできます。

http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html?ssSourceSiteId=ocomen

スクリーンショット 2013-11-17 21.30.55

インストーラーは、ダウンロードしたJARファイルを「java -jar wls_121200.jar」と実行するだけです。下記のようなビジュアルなインストーラーが出てきますので、これを進めるだけです(多少面倒なところあり)。無論、CUI版でもOKですので、Xが起動できない現実の本番サーバーでも普通に作業可能です。

スクリーンショット 2013-11-17 21.52.01

開発環境は是非NetBeansを使いましょう。GlassFishと同じく、サービスタブから追加します。

スクリーンショット 2013-11-17 22.10.41

サーバーを追加したら、プロジェクトでWebLogic Serverに指定を切り替えます。

Screen Shot 2013-12-06 at 10.25.36 PM

あとは普通通りアプリケーションを「実行」すると、WebLogicが起動してWeb画面が表示されます。

何だ、環境的にはほぼGlassFishと同じじゃん!!!

プログラムの修正は必要か?

基本的にWebLogicは、特に最近のものは、内部のコンポーネントがオープンソース主体にどんどんシフトしてきています。GlassFishと比較しても、特に新しい仕様であるJSF2は同じMojarraが使われていますし、JPAもEclipseLinkです。設定ファイルもJava EE仕様のweb.xmlなどの標準がそのまま動きますので、WARを作成して配備して終わり、だったりします。

では非互換面はあるのか、と問われると、残念ながら、はい、あります。同じにしてよ!! と言いたいところですが・・・

設定ファイルとしては、Web系の設定ファイルがGlsssFish側は「WEB-INF/glassfish-web.xml」、WebLogic側は「WEB-INF/weblogic.xml」、EJB系がGlassFishが「META-INF/glassfish-ejb-jar.xml」でWebLogicが「META-INF/weblogic-ejb-jar.xml」とファイル名も中身の構成も全く違います。元々の出自が違うのでしょうがない面もありますね。

※一応最新版でどっちでも動くようになってますが、そもそも設定できる項目自体が色々違うので、あくまで暫定利用目的と思った方が良いです。

挙動的な非互換面としては、古い系のものがあります。特に違うのが、EJB周りです。WebLogicのEJB周りの仕様は2001年-2004年辺りで実装されたものが延々と使われ続けている経緯があり、初期化タイミングからリモートインタフェースの挙動、あとはWebLogic独自の(WebLogicのWebLogicたる所以でもある)T3プロトコル周りまで含めて、結構GlassFishと異なります。なので、この辺りをGlassFishの挙動をアテにしていたら、結構裏切られることが多く、最悪プログラムの修正も必要でしょう。

サーバー内部の実装もOSGI準拠の近代的な後発のGlassFishと比較して、WebLogicはいかにも重厚で巨大であり、何とも古くさい感じがします。現バージョン12cのオリジナルが2001年初頭頃登場(だったと思う)のWebLogic 6.0であり、そこからディレクトリー構成、設定ファイルを含めあんまり変わってない所も、イケてないところとよく非難される所ではあります。

まあ、とはいえアプリを作る側からすると、ちゃんと動いてくれればぶっちゃけどっちでもいい話でもあるかもしれません。

ただ、これらはかなり細かい面でもあるので、「だいたいそのまま動くよ、但し追加の独自設定ファイル(weblogic.xmlやweblogic-ejb-jar.xml)が必要だよ(特に本番目的だと)」と憶えておいてもらえればと思います。

運用にあたっての違い

GlassFishの運用も結構細かい知識が必要ですが、WebLogicの運用知識はGlassFishのものとはかなり異なります。最も違う特徴的な面は、Production Redeploymentという、古いアプリを動かしながら新しいバージョンのアプリを再配備するという、アクロバティックな機能です。これは24時間ノンストップ運用のために必須でありますが、結構きわい挙動もたまにあり、常に安定して動作させるためには現場の知見の蓄積が必要です。無視すればまあ、GlassFishのようにも使えます(笑)

またWebLogicにはかなり多くのパッチが提供されており、定期的にマイナーアップデートも出ます。商用サポートに入っていれば専用サイトで提供されていますので、それらを定期的に適用していく作業も必要になります。つまり、専任の技術者を育てる必要があります。まあ、GlassFishについても本番運用する場合は同じ話ではありますが、WebLogicの方がより多くの(数倍の)項目を設定できるため、そこは注意が必要でしょう。

なので、まあ内部実装の古くささ等もまるっと含めて、オープンソースでドラスティックに改良を続けるMySQL・Maria DB辺りに対する、商用の王道・互換性命のOracle Databaseの関係みたいなもんだと思ってもらえれば良いかなと思います。WebLogicも最初から徹頭徹尾、商用製品なんですよね。

GlassFish 4系からWebLogicに移行する

さて、GlassFish 3系以前からの移行については上記の通り、やることをやればだいたい問題ないと思います。では4系はどうか? 前述の通りですが、残念ながらWebLogic 12cのEE 7対応待ちになります。いつ出るのか? 繰り返しになりますが、オラクルの営業さんに聞いて下さい(笑)。私も残念ながら正確なところは知りません。

では他社の場合どうか? 残念ながらEE 7対応の商用アプリケーションサーバーはどこからも出てません。つまり、移行先はこの2013年度末時点で、無いのです。2014年は? 出るといいなぁ。出してね!!

まとめ

凄く面白くないまとめになってしまいますが、当たり前のことはそれはそれで重要なので、まとめておきます。

  • GlssFish 3系の移行先は、Java EE 6対応アプリケーションサーバーになります。
  • Oracle社の場合、商用版Java EE 6対応アプリケーションサーバーはWebLogic Serverになります。(今はFusion Middlewareという分類になっているようです)
  • Java EE 6に準拠していれば、(当たり前ですが)基本的なところは互換性があり、動きます。
  • 但し互換性のないところもあり、特にEJB周りと設定ファイル周りは注意が必要です。
  • 更に本番運用に際しては便利な機能も多い判面、パッチ適用も含め注意の必要な箇所も多いため、専門の技術者を揃える方が賢明でしょう。
  • GlassFish 4系の移行先は、2013年末時点では、ありません

さてJava EE Advent Calendarの次回(明日)はNorito Agetsumaさんの回です。宜しくお願いします!

JSFのConversation Scopedを改めて試してみた

Java EE 7+JSF 2.2に行きたい所は山々なのだが、現在EE 5やら6から逃れられない全国のエンプラ開発現場の方々お疲れ様です。

さてJSF 2.2からはCDIにFlow Scopedという便利なものが付き、開始・終了が自動になったのであるが、現在EE 6の場合、そんなもの使えないのである。しょうがないので、どうしても類似のことがやりたければ、JSF 2.1でも動作するCDI+Conversation Scopedで誤魔化すしか無いのである。

Conversation Scopedは会話(Conversation)の開始・終了を明示的に行わないといけないので、結構めんどくさいということと、どうやれば綺麗に開始・終了できるのかイマイチ成功例がわからなかったのであるが、やっぱり避けられなくなったので改めて何パターンか試してみた。これが一番綺麗かな? というのが見つかったので、メモ代わりに紹介しておく。これが使いこなせれば、継承とアノテーションを駆使してCDI上でViewScopedと似たことがJSF 2.1でも実現できるかも知れない。いやーさすがにこれは無駄な努力かなぁ・・・

※ちなみに本例ではFaceletをJSF 2.2仕様で書いているが、2.1仕様であればjsfc=”h:inputText”とかで書き換える必要がある。

※JSFの基本的な作り方については、先週発表のスライドにまとめてあるので、そっちば参照してはいよ。
http://www.slideshare.net/iwasakihirofumi/java-ee-7-jsf-22

とりあえず、ポイントは一体どこで会話をスタートさせるのか、だ。JSFの場合、Phase Listenerで制御が一応できるので、Pre Render Viewで引っかけて強引に呼ぶ例をWebで見つけた。他にもGetterメソッドを作ってFaceletの先頭で表示させるついでに#{bean.property}で強引に呼び出す方法もあるが、こっちの方がスマートかも知れないし、タイミングは早いから安全ではある。f:eventを書くのめんどくさいけど。

注意点としては、開始と終了の書き方はほとんど固定で、下記のように書くしかなさそう、という点だ。また、間違って2回conversation.start()が呼ばれると、前に格納されていた値は全消去されてしまうので、あくまで最初に1回だけ呼んでやる必要がある。ここを間違えると「?」な挙動になるので注意するべしである。

遷移画面(3画面)

index.xhtml –> confirm.xhtml –> completed.xhtml

Backing Bean (CDI)

[java]
package com.mushagaeshi.jsftest;

import java.io.Serializable;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@ConversationScoped
public class ConversationBean implements Serializable {

private static final long serialVersionUID = 5792114893614101597L;

// 会話制御のためのオブジェクトを挿入する
@Inject
private Conversation conversation;

private String id;

private String password;

// 会話の開始メソッド。1頁目の先頭でf:eventにて強制的に呼び出す。
public void initConversation() {
// ポストバックでなくて、且つ、会話が開始されてなかったら開始する。
if (!FacesContext.getCurrentInstance().isPostback()
&& this.conversation.isTransient()) {
this.conversation.begin();
}
}

/**
* Creates a new instance of ConversationBean
*/
public ConversationBean() {
}

// 1画面目でボタンが押された際のメソッド。書かなくても行けるけど念のため。
public String clickNext() {
return "confirm?faces-redirect=true";
}

// 2画面目でボタンが押された際のメソッド。書かなくても行けるけど念のため。
public String clickConfirm() {
return "completed?faces-redirect=true";
}

// 3画面目でボタンが押された際のメソッド。会話を完了させて遷移する。これで状態が消える。
public String clickCompleted() {
// 会話が開始されてたら終了する。
if (!this.conversation.isTransient()) {
this.conversation.end();
}
return "index?faces-redirect=true";
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

}
[/java]

1画面目 (index.xhtml)

[html]
<?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"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!– 強制的に会話開始をここで呼び出す –>
<f:event type="preRenderView" listener="#{conversationBean.initConversation()}"/>
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<form jsf:id="form">
<input type="text" jsf:value="#{conversationBean.id}"/>
<input type="password" jsf:value="#{conversationBean.password}"/>
<input type="submit" jsf:action="#{conversationBean.clickNext()}" valuie="submit"/>
</form>
</h:body>
</html>
[/html]

2画面目 (confirm.xhtml)

[html]
<?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"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h1>Confirm</h1>
<p>#{conversationBean.id}</p>
<p>#{conversationBean.password}</p>
<form jsf:id="form">
<input type="submit" jsf:action="#{conversationBean.clickConfirm()}" value="confirm"/>
</form>
</h:body>
</html>
[/html]

3画面目 (completed.xhtml)

[html]
<?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"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h1>Completed</h1>
<p>Thank you, #{conversationBean.id}!</p>
<form jsf:id="form">
<input type="submit" jsf:action="#{conversationBean.clickCompleted()}" value="completed"/>
</form>
</h:body>
</html>
[/html]

実行結果

1画面目。入力してみる。
Screen Shot 2013-11-18 at 10.54.04 PM

2画面目。確認画面。ちゃんと入力された値が表示されている。
Screen Shot 2013-11-18 at 10.54.15 PM

3画面目。完了画面。まだ入力された値は生き残ってる。下のボタンを押すと会話が完了し値が消え、1画面目に戻る。
Screen Shot 2013-11-18 at 10.54.26 PM

戻った1画面目。Conversationが再度startされているので、値は消えて再度状態が開始されている(つまり空っぽ)。
Screen Shot 2013-11-18 at 10.54.36 PM

こんな感じですね。これであればBacking BeanJava EE 6でも動くし、EE 7が出てもそのまま持って行ける。ただ、繰り返しになるがHTML friendly style tagsだけは違うので、やっぱりEE 7への移行の際には画面に影響があるのである。返す返すも無念である。

Java EE座談会に出ます

すっかりBlog更新するのを億劫がって放置してしまったのであるが、明日東京のOracleに呼ばれ、Java EE 6の座談会に出ることになった。これで3回目である。福岡より飛行機で行きます。

最新のJavaを3時間で知る!Java解説セミナー (受付終了)
http://www.oracle.com/webapps/events/ns/EventsDetail.jsp?p_eventId=170343&src=7863984&src=7863984&Act=31

この座談会のセミナーは既に受け付け終了してしまっているのだが、講演の様子は後日記事になるらしく、そこで參照していただければと。私も告知を知らなかったので案内出來ませんでしたことよ(×_×)

ちなみに前回・前々回のものは既にWeb記事になっているので、そちらを参照して頂きたい。

「Java EE 6導入を推進するうえでのポイントと導入効果」(前回のもの)
http://builder.japan.zdnet.com/sp_oracle/weblogic_2013/35036674/

なお今回はJavaOne 2013に参加した事や、Java EE 7ネタを入れたので前回と少し違う方向性になるのではと思う。思うだけなのでどうなるかは不明であるのだが、大筋はあまり変わらない予定である。

GlassFishの商用サポートが打ち切られるという衝撃的な発表が先日行われたが、その後に控えている多くのJava EE商用製品のEE 7対応版がいよいよ来年より登場してくると考えている。そろそろ手を付けても罰は当たらない(投資が無駄にならない)頃かなと思っているのだが、どうだろうか。大量なので一朝一夕に追いかけられないため、徐々にキャッチアップしていくのが賢い戦略であろう、と思う次第である。