皇紀二六七三年(平成二十五年)
十一月十五日
岩崎浩文


福岡で某会社の技術管理責任者やってます






元々WebLogic (旧Tengah) Loveです






その延長でJava EE (旧J2EE)推しです

昔いっぱい連載しました




とはいえプログラムできなければ管理できっこないので、
ガンガン書いてます
福岡住みやすいです。が、生まれも育ちも熊本です。

最近は本業変えてすっかりご無沙汰です

JavaOneは2013・2012・2001・2000に行きました。
日本のだと2002に喋りました
http://www.mushagaeshi.com
2
Java EE spec reads
結構有名人達
CDI supports
@Transactional
annotation, and it seems
EJB Session Bean will be
merged to CDI. Correct?

Actually, it should be.
(Antonio Goncalves, the
EJB spec reader, writer of
"beginning Java EE 7)


企業向けのJava標準仕様です。JEEとも。





Microsoft以外の会社が参加してます





Java Platform, Enterprise Edition
その昔J2EEと言ってました。
 Java 2 Platform, Enterprise Edition
 結構恥ずかしい名前なので忘れて下さい
三強がOracle, IBM, Red Hat辺り。
日本だと富士通、日立、NEC辺り。

今年最新版が出ました。EE 7です。
5
J2EE
1.2
(1999)

誕生!

J2EE
1.3
(2001)

J2EE
1.4
(2003)

Java EE
5
(2006)

Java EE
6
(2009)

順風
満帆

もっかい
単一仕様に
まとまろうぜ!!

6

Java EE
7
(2013)
App
Engine

WebLogic World
GlassFish &
Compatible Group
Geronimo &
Compatible Group
Copy

Japan Galapagos
Group

JBoss World

7
Vendor

App Server

EE 1.4
(2003-)

EE 5
(2006-)

EE 6
(2009-)

EE 7
(2013-)

Oracle

WebLogic

9.x

10.x

12.x

-

Oracle

GlassFish

-

2.x

3.x

4.0

IBM

WebSphere

5.1

6.x, 7.x

8.x

-

IBM

Geronimo

-

2.x

3.x

-

Red Hat

JBoss

4.x

5.1

7.1

-

富士通

Interstage

9.0,9.1

9.2,10.x,11.
0

11.1

-

日立

Cosminexus

7.x

8.x

9.x

-

だがしかし、
来年はEE 7来るよ!!

デファクトスタンダードは
依然としてEE 6
8
Java EE 7の
準備はOK?

9


CDI 1.1






Bean Validation 1.1





メソッドレベルバリデーションのサポート
EL式の更新とエラーメッセージの書き換え等

Interceptors





JSFとの(ようやくの完全)統合
簡易EJBぽい用途としての自動トランザクション @Transactionalサポート
クラスローディングから除外する@Vetoedサポート

@AroundConstructor, @PreDestroy の追加
順序@Priority, @Interceptors({1st, 2nd})追加(ようやく・・・)

Concurrency 1.0




標準のスレッド制御仕様が(ようやく)追加
ダイナミックプロクシー追加

10


EJB 3.2




JMS 2.0





リソース設定の改善
クライアント側のアノテーションでの呼び出しサポート

JTA 1.2




非永続化EJBタイマーの追加

CDIに@Transactional, @TransactionScoped 追加

JPA 2.1






マッピング用コンバーターの追加
クライテリアクエリーとJPQLの強化
動的ネームドクエリーの追加
非同期永続化コンテクストの追加
標準のDDL自動生成機能仕様の追加

11


JSF 2.2







Servlet 3.1






CDI統合と @ViewScoped @FlowScoped の追加
新規HTML-friendly styleタグの追加
CSRF対策IDの自動処理機能
EL 3.0と新規記述子・ラムダ式の追加

ノンブロッキングI/O
プロトコル更新HttpUpgradeHanderの追加
セキュリティ強化

Web Socket 1.1




新仕様。全二重双方向の通信
新アノテーション(サーバー・クライアント)
新エンコーダー・デコーダー
12


ずばり、JSF 2.2でしょう!!!

13






遂にJava EEだけで全部作れるようになりまし
た!!
さよならJSP!!
さよならStruts!!
さよならCommons!!

※2.2以降が必須です

14


CDIとの完全統合




JSF Managed Beanはdeprecated(廃止予定)

HTML5の完全サポート


HTML friendly styleの完全置換

15





たったこんだけ?
いやいやこいつら根幹ですよ
Java EE 6からの移行の際の影響度合い:

16
Java EE 6 (JSF 2.1)

Facelet
Filter

Faces
Servlet

Managed
Bean
@View
Scoped

Facelet

Managed
Bean
@View
Scoped

Facelet

Managed
Bean
@View
Scoped

Phase
Listeners

Managed
Bean
@Session
Scoped

俺俺な
JSF世界


残念ながらJSF 2系ではこれちゃんと動きません。

protected FacesContext getFacesContext(HttpServletRequest request,
HttpServletResponse response) {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
FacesContextFactory contextFactory
= (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory
= (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext = contextFactory.getFacesContext(request.getSession().getServletContext(),
request, response, lifecycle);
// Set using our inner class
InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);
// set a new viewRoot, otherwise context.getViewRoot returns null
UIViewRoot view = facesContext.getApplication().getViewHandler()
.createView(facesContext, "");
facesContext.setViewRoot(view);
}
return facesContext;
}
Java EE 6 (JSF 2.1)
NG!

CDI
don't have
@View
Scoped

Facelet
Filter

Faces
Servlet

Phase
Listeners

NG!

CDI
don't have
@View
Scoped

Facelet

NG!
Facelet
Managed
Bean
@Session
Scoped

OK!

CDI
don't have
@View
Scoped

統合された
CDIな世界
Java EE 7 (JSF 2.2)
OK!
Facelet
Filter

Facelet

New CDI
@View
Scoped

Facelet

Faces
Servlet

New CDI
@View
Scoped

New CDI
@View
Scoped

Phase
Listeners

CDI
@Session
Scoped

OK!
Java EE 7
を待つべし!!

統合された
CDIな世界
Java EE 6 (JSF 2.1)

<input type="text"
jsfc="h:inputText"
name="id"
value="#{bean.property}" />
Java EE 7 (JSF 2.2)

Changed!

<input type="text”
jsf:value="#{bean.property}" />

Java EE 7
を待ちましょう!!!!!






アクション単位(Struts)と画面単位(JSF)の違い
単純レンダリング(JSP)とテンプレートエンジン
(Facelet)の違い
俺仕様Actionクラス(Struts)とCDI (JSF)の違い
要するに180度違う(ので移行の際は作り直し)

22
Struts
Action1

画面1
JSP

+ action()

画面2
JSP

Action2

画面3
JSP

+ action()

要するに

作り直し

JSF 2

画面1
Facelet

画面2
Facelet
Backing1
- fields
+ action()

画面3
Facelet
Backing2
- fields
+ action()

23

Backing3
- fields
+ action()
誰も作ってくれないので試しに作ってみました

24
25


とりあえずNetBeansで Maven > Webプロジェ
クトを選択しましょう。







プロジェクトを右クリックして、Frameworkで
JSF 2.2を選択しましょう。
拡張子設定を *.xhtmlに変更しましょう




綺麗なMavenのプロジェクトができます。
NetBeansのプロジェクトじゃないんです!!

これで全部の.xhtmlファイルが駆動するようになりま
す。

実行しましょう! こんだけ!! 超簡単!!!
26
27
28
29
30
1.

2.

Webページ/WEB-INF/のしたで新規作成 >
GlassFishディスクリプタを選びます。
<parameter-encoding default-charset=“UTF8”/>
を追加します。

31
32


画面ごとにBacking Beanを作りましょう!






新規作成 > Javaクラス
出来たクラスにアノテーションを付けましょう







名前を合わせておくと便利です
index.xhtml  IndexBean.java

@Named  CDIですよって宣言
@ViewScoped  Backing Beanですよって宣言

最後に implements Serializableを付けましょう
めんどくさいのですが、現在NetBeansに
↑のウィザード追加作業中だそうです
33
34


index.xhtml





IndexBean.java





Faceletファイル
Apache Tapestryみたいなテンプレート
Backing Bean (CDI)
.NETのCode Behindみたいなのと思って下さい

WEB-INF/glassfish-web.xml


文字化けしないように必要です

35
1.
2.

3.

4.
5.

表示用のフィールドを追加しましょう
Backing Beanに@PostConstractメソッドを追
加します
追加したメソッドにDBからデータを取ってき
ます。EJBとJPA使いましょう
表示用フィールドにデータを詰めます
Facelet側で #{beanName.fieldName}と書きま
す。終わり!

36
37
38
39
1.

2.

3.

4.

入力項目用のフィールドとgetter, setterを作り
ます。Entity系でもいいです。
@PostConstractメソッドでDBからデータ取っ
てきて、フィールドに詰めます。
Facelet側に<form jsf:id=“form”>と、入力フィー
ルドにjsf:value=“{beanName.propertyName}”と
入れておきます。
実行したら最初から入力項目に値が入ってます。

40
41
1.

2.

3.

4.

入力項目用のフィールドとgetter, setterを作ります。
Entity系でもいいです。追加で、ボタンが押された
ときに呼び出されるメソッド(click())を、返り値
String型で作っておきます。(とりあえず空っぽ)
Facelet側に<form jsf:id=“form”>と、入力フィール
ドにjsf:value=“{beanName.property}”と入れておき
ます。
ボタン<input type=“submit”
jsf:action=“bean.click()”/>を追加します。
入力した値は入力項目用フィールドに入ってます
ので、click()メソッドの中で拾って処理します。返
り値には遷移先のFacelet名を「拡張子抜き
+?faces-redirect=true」で返します。
42
43
1.

2.
3.

4.

5.

前の画面の@ViewScopedのBacking Beanのaction
メソッドで、FacesContextからflashを取り出しま
す。
flashに値をputします(Mapなのでkey+value)で。
前の画面のactionメソッドで「次の画面の拡張子抜
き+faces-redirect=true」をreturnし遷移させます
(302リダイレクト)
次の画面の@ViewScopedのBacking Beanの
@PostConstrcutメソッドを作成し、FacesContext
のflashから値をgetします。
flashの値は1回しか読めないので、すぐ次の画面の
Backing Beanのフィールドに突っ込みます。
44
45
46


画面のFaceletとBacking Beanは1対1で作りま
しょう。Backing Beanは@ViewScopedにしま
しょう。




用途とメモリー効率を考えればこれが最適解です

FacletはHTML-friendly styleで書きましょう


HTML5 / CSS3対応でresponsible web designしよう
としたら、事実上これしか解がないのではと思いま
す。

47


他にもいろいろあると思うんですが、こういう
情報がまとまってると超嬉しいな




誰か書いて下さい!!

ただ、ホントにやったことある人じゃないと書
けないかも知れない



鶏と卵の関係ですかね・・・
みんな作りまくれ!!

48
49

Java EE 7技術アップデート & 逆引き JSF 2.2

Editor's Notes

  • #18 1st issue, JSF backing bean defectively. When some facelet or managed bean set to the session scoped bean, the filter cannot access to the session scoped bean directly.
  • #19 Some blogs and web sites shows these codes to access backing bean from non-JSF objects, but not worked properly in JSF 2.So we must override phase listeners for filtering, but very harmful and uncertain codes required.
  • #20 Of course you can switch the backing bean from JSF managed bean to CDI bean.But unfortunately, Java EE 6 CDI didn&apos;t have @ViewScoped annotations, so we cannot use one-by-one style with facelets.I cannot understand this conflicted situation in EE 6.
  • #21 In EE 7, these conflicts are already cleared and well integrated with JSF and CDI.CDI added @ViewScoped annotation to access one-by-one style with facelet.This strategy must be considered in the first JSF, but achieved in Java EE 7. It&apos;s too late for us!So wait for the Java EE 7 if you can.
  • #22 Java EE 6 has some irregular tags named &apos;jsfc&apos;.Java EE 7 JSF 2.2 changed these silly tags to XML schema compliant style. It&apos;s good for applying standards, but there&apos;s many cost required for updating from JSF 2.1.So, you should start from Java EE 7 if you can.