かんたんかんたんJSF

先日登壇したセミナー参加者のアンケートでは、皆さんJSFにあまり興味が無い感じでした。発表的にはJSFの内部的な話のつもりだったのでJSFを知らない人にはちょっとわかりにくかったかなと思います。


そこで、初心者がJSFって簡単にアプリ開発が出来るんだなってわかりやすいようなスライドを作ってみました。



JSFStrutsやSpring MVC等のアクションベースの開発ではなくコンポーネントベースの開発になるので、URLやHTTPの事をほとんど考えずに、シンプルに画面とロジックの事を考えた開発が可能です。


JSF2.0からはXMLもほとんど不要でこのように開発が出来るので、JavaでWEBアプリケーションを開発する選択肢としてJSFに少しでも興味を持ってもらえればと思います。

今から始めるJava EE 7解説セミナーでJSFの話ししてきた

若干飛び入りな感じでしたが、今日は機会を頂いて
今から始めるJava EE 7解説セミナー
でJSF2.2 & CDI & ELの話をしてきました。


f:id:den2sn:20130822130041j:plain


このセミナーは夏の二大Javaセミナーということで
技術者向けのセミナーとマネージャ向けのセミナーが
平行して開催されるというちょっと面白い開催方法のセミナーでした。


私はもちろん技術者向けの方でお話させて頂いたのですが
170名の応募枠が満員になるほどの盛況でとても緊張しました。


セッションの資料や中身についてはOracleさんの公開範囲におまかせして
今回は特にこういったセミナーで登壇するということのメリットについて
とても感じる事があったのでそのことについて書いてみようかと思います。

登壇する事の意義


こういったセミナーなんかで前で話す事で
もちろん今回だと170名以上の方に私の事を知ってもらえるという
メリットがあるんだと思います。


でもそのメリットって直近では実際そんなに実感出来てはいないんですよね。


じゃあ今回どんな直接的なメリットを感じる事が出来たかというと
やっぱり他の登壇者と交流できるというのがとても大きいんだなと思いました。


こういうセミナーだと複数人の方が登壇される事が多いですが
やっぱり登壇者同士というのは登壇者と参加者という立場より
格段にコミュニケーションをとりやすいんです。


例えば、今回だとNTTコムウェアの上妻さんと
時間がなかったのでコンビニに行って買ったサンドイッチを
一緒に食べながら技術の話が出来たりとか、


セミナー後にお誘い頂いてJavaエバンジェリストの寺田さんや
アリエル・ネットワークの井上さんとお話を頂く機会を得る事が出来たりとか


そういうすごい人たちとお話しさせて頂いていろんなことを
吸収出来る機会が得られるんです。


登壇って私でも出来るくらいなので頑張ればなんとかできるもんなんだと思います。
私とかだとJSFずっと使っているので1/100人くらいの知識を
1つの分野でも頑張って身につければなんとかできる。


でも登壇する人の中には何百ページのJavaの本を書いちゃうような
1/1000人とか1/10000人とか下手すると1/1億みたいなすごい人も
いるわけですよ。


そういった人たちにちょっとでも近づけるというのが
こういったセミナーで登壇する意義というかメリットなんだと思いました。


寺田さんもセミナー内でもこういった場で話してみたい人がいれば言って下さいとおっしゃられていましたが、
みんなもっと勇気出して積極的に前に出て話してすごい人達と話していろんなものを吸収すれば良いんだと思います。

登壇内容の記事

登壇内容が記事になったみたいです。

Java EE 7は何がどう新しくなったのか? 習得の近道は?──先行者からのアドバイス - builder by ZDNet Japan
http://builder.japan.zdnet.com/sp_oracle/weblogic_2013/35037372/

Java EE 7でさらに使いやすく、便利になったJSF 2.2、CDI 1.1、EL 3.0の主な強化ポイント - builder by ZDNet Japan
http://builder.japan.zdnet.com/sp_oracle/weblogic_2013/35037740/

・発表スライド
http://www.oracle.com/technetwork/jp/ondemand/java/whatsnewjsf22-cdi-el-2014283-ja.pdf

Javaのライブラリを作成してからMavenセントラルリポジトリに登録するまで

Cacoo4JというJavaのライブラリを作成したので、オープンソースとして公開してMavenセントラルリポジトリに登録するまで一通りの作業をやってみました。
そこで備忘録的にJavaのライブラリを開発してからMavenセントラルリポジトリに登録するまでに私がやった作業の流れを残しておきたいと思います。

作業の流れ

ライブラリの作成

これをやらないと話が始まりません。私はCacooというサービスのAPIを簡単に呼び出せるJavaのライブラリを作成しました。たしかJava Day Tokyo 2013当たりのツイートでCacoo4J無いよねってのを見たのと、昔CacooのOpenSocialガジェットを作った事があってCacooのAPIの知識があったので簡単に作れるんじゃないかなと思ったのがきっかけです。


作ったライブラリは最終的にMavenのセントラルリポジトリで公開したいのでNetBeansMavenプロジェクトとして作成しました。

ライセンスやコメントの記載

自分で使う分にどんなソースでも良いのですが、オープンソースとしてライブラリを公開するにはライセンスやコメントの整理を行わないといけません。私はオープンソースで公開する時はだいたいMITライセンスを選択するのですが、今回はTwitter4Jに合わせてApache License 2.0.にする事にしました。プロジェクトフォルダにLICENSE.txtを配置してソース全部のヘッダにライセンスの表記を追記しました。


あと本当はJavaDocのコメントとか丁寧に書くんですが、日本語で書くのもあれだなとか英語苦手だなと思っていたら結局何も書いてません。すみません。使い方そんなに難しくないので勘弁して下さい。

GitHubに公開

オープンソースであればほぼ制限無いGitHub素敵ですよね。アカウントは既に持っていたのでcacoo4jのリポジトリを作成してソースをpushして公開完了。


https://github.com/den2sn/cacoo4j

ドメインの購入

ドメインの購入は必須では無いですがライブラリ用のサイトを作成したかったのと、MavenのgroupIdにドメイン名を使いたかったので、ドメイン「cacoo4j.org」を購入する事にしました。お名前.comでドメイン購入。1年間で980円なのでまあ安い買い物です。

GitHub Pagesでサイト作成

GitHubにはGitHub Pagesというものがあって開発者のサイトやリポジトリのサイトのホスティングもやってくれるんですね。素敵すぎます。GitHub PagesのAutomatic Page GeneratorでREADME.mdをまるっとサイト化して購入したcacoo4j.orgドメインを設定しました。


http://cacoo4j.org/

Mavenセントラルリポジトリに登録

ソースも公開してサイトも作成したので最後にMavenセントラルリポジトリへの登録です。Mavenセントラルリポジトリへの登録はいろいろと手順やルールがあってややめんどくさかったですが大まかには以下のような流れで作業しました。


・Sonatypeのアカウントを作成する
・jarファイル署名用にpgpで鍵を作成(pgpMacPortsでインストールしました)
・SonatypeにIssueを作成する(このチケットでリポジトリ作成のやりとりをする)
・Sonatypeにモジュールのデプロイ
・Issueに完了報告
・問題無ければMavenリポジトリに反映される


以下のサイトを参考に試行錯誤しました。


http://samuraism.jp/diary/2012/05/03/1336047480000.html
https://sites.google.com/site/yasuda/maven/appendex-mavensentoraruripojitorini-gong-kaisuru


一番問題になるところはpom.xmlにいろいろと情報や設定を書く必要があるのでその点が苦労するのかなと思います。
私はJavaDocやソースのjarもリリースする必要がある事に気づかずにそのままモジュールだけリリースしそうになりました。maven-source-pluginやmaven-javadoc-pluginを追加してJavaDocとソースもリリースすする必要があります。

参考までにcacoo4jのpom.xml


https://github.com/den2sn/cacoo4j/blob/master/pom.xml


Issueのチケットは


https://issues.sonatype.org/browse/OSSRH-6861


です。

ということで

一度は一通り流れとしてやっておきたかったのでちょうど良い機会になりました。

Cacoo4jをMavenセントラルリポジトリに登録しました

Cacoo4jをMavenセントラルリポジトリに登録しました。
これでMavenを利用しているアプリケーションから簡単にCacoo4jが利用出来るようになりました。
pom.xmlに以下を追加して下さい。


pom.xml

<dependency>
    <groupId>org.cacoo4j</groupId>
    <artifactId>cacoo4j</artifactId>
    <version>1.0.0</version>
</dependency>


JavaからCacooのAPIが簡単に呼び出せるのでCacooのサービスを利用していて興味がある方は使ってみて下さい。


Cacoo4j
http://cacoo4j.org/


Cacoo
https://cacoo.com/

ここがイイヨ!! Java EE 講座でインタビューして頂きました

会社員になってからほとんどJavaの開発をやっている私ですが、ここ1,2年は特にJavaの情報発信やセミナーへ参加するように心がけています。
その活動のおかげでOracle様よりお声掛けいただいてJava EE 講座というWebの特集記事でインタビューをして頂きました。


ここがイイヨ!! Java EE 講座
第3回:アイエックス・ナレッジ株式会社の加藤田益嗣氏に聞くJava EE のおススメ!!
http://www.oracle.com/technetwork/jp/articles/java/ja-topics/java-articles-1981229-ja.html

なかなか自分がいままでやってきたことを振り返る機会は無いのでとても良い機会になりました。


仕事ではJavaに限らず他の言語も使用した開発も行っていますが、一番長くやってきただけにJavaには一段と思い入れがあります。


今後もJavaがさらに良いものになるように、わずかながらでも協力できればと思っています。

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が使用できなくなってしまうという弊害があるようなので
利用には十分注意が必要です。

JSF 2.2ではf:eventのpreRenderViewではなくf:viewActionを使う?

JSF 2.2でf:viewActionというコンポーネントが追加されています。
基本はJSF 2.0で初期画面表示時に処理を動作させる時に使っていた
f:eventのpreRenderViewと同じなのですが微妙に違うところがあります。


まずは単純に呼び出された回数をカウントするバッキングビーンを作ります。

package sample;

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class ViewAction {
    private int count = 0;
    public int getCount() {
        return count;
    }
    public void init() {
        count++;
    }
}


そして画面

<?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">
    <h:head>
        <title>ViewAction Sample</title>
    </h:head>
    <h:body>
        <f:metadata>
            <f:viewAction action="#{viewAction.init()}"/>
        </f:metadata>
        <div>Count: #{viewAction.count}</div>
        <h:form>
            <h:commandButton value="Click" />
        </h:form>
    </h:body>
</html>


f:viewActionのactionでバッキングビーンのinitメソッドを呼び出しています。
では実際に動かしてみます。


画面を表示するとinitメソッドが動作してカウントが1と表示されます。
f:id:den2sn:20130624213717p:plain


ボタンを押してもカウントは増えません。
f:eventのpreRenderViewでは画面表示の度に処理が実行されていましたが
f:viewActionでは初期表示時に1回しか動作しないようになっています。


再表示時に処理を動作させたい場合はonPostbackにtrueを指定します。

<f:viewAction action="#{viewAction.init()}" onPostback="true"/>


するとクリックを押す度にカウントが増えて行きます。
f:id:den2sn:20130624214117p:plain


また、f:viewActionでは処理を実行するフェーズを指定する事ができます。
指定出来るフェーズはフェーズ2から5のAPPLY_REQUEST_VALUES, PROCESS_VALIDATIONS,
UPDATE_MODEL_VALUES, INVOKE_APPLICATIONの4種類です。
たとえばAPPLY_REQUEST_VALUESフェーズで処理を実行させたい場合は

<f:viewAction action="#{viewAction.init()}"  phase="APPLY_REQUEST_VALUES"/>


と指定します。
f:eventのpreRenderViewはRenderer Responseフェーズで動作すると思いますが、
f:viewActionでは指定できないのでもしかすると使い分けが必要になってくるかもしれません。


f:viewActionはアクションというだけあってoutcome値を返すことも出来ます。
バッキングビーンで

public String init() {
    return "actionView";
}


とするとactionViewに遷移します。
f:viewParamと組み合わせることでパラメータによって画面分岐等も行うことができるようになっています。


最後におまけですが実は上記サンプルプログラムは現状のGlassFish4.0では動作させることができません。
実はネームスペースのバグがあって
http://xmlns.jcp.org/jsf/core
とすると動作しないようです。
2015/4/26 追記 GlassFish4.1で修正されました。


http://java.sun.com/jsf/core
を指定するとひとまず動作させる事ができます。