49
Java EE 7 技技技技技技技技 技技技技技技技 ( 技技技技技技 ) 技技技技 技技技技

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

Embed Size (px)

DESCRIPTION

Java EE 7技術アップデート Java EE 7の更新は数あれど、やっぱり目玉はJSF 2.2! Faceletを獲得し、NetBeansの強力な後見を得、遂に愛しのCDIと完全合体したJSFにもはや敵はいない! さらばJSP! さらばEclipse! さらばJSF Managed Bean達よ! Java EE 6 (JSF 2.0) でもどかしい思いをした貴方、そろそろゾンビのようなStrutsから脱却したいとお考えの貴方、EE 7でデファクトスタンダードに追いつき、堅牢で今時な企業システムを楽に作りましょう! 各種アプリケーションサーバーのEE 7準拠が来年に控える中、やり始めるなら今でしょ! ※JavaOne 2013 報告会 at 福岡 技術編 発表分です。 2013/11/15 19:00 to 21:30 http://atnd.org/events/45326

Citation preview

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

Java EE 7技術アップデート

皇紀二六七三年 ( 平成二十五年 )十一月十五日

岩崎浩文

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

2

講演者紹介

福岡で某会社の技術管理責任者やってます とはいえプログラムできなければ管理できっこないので、

ガンガン書いてます 福岡住みやすいです。が、生まれも育ちも熊本です。

元々 WebLogic ( 旧 Tengah) Love です その延長で Java EE ( 旧 J2EE) 推しです

昔いっぱい連載しました 最近は本業変えてすっかりご無沙汰です

JavaOne は 2013 ・ 2012 ・ 2001 ・ 2000 に行きました。日本のだと 2002 に喋りました

http://www.mushagaeshi.com

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

JavaOne 2013: Java EE 8 and beyond

Java EE spec reads

結構有名人達

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

JavaOne 2013: Question: Future of CDI & EJB

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)

英語で質問してみました !!

EJBは CDIと

統合するよう

感じぽい !! 生情報

万歳 !!

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

5

Java EE とは

企業向けの Java 標準仕様です。 JEE とも。 Java Platform, Enterprise Edition その昔 J2EE と言ってました。

Java 2 Platform, Enterprise Edition 結構恥ずかしい名前なので忘れて下さい

Microsoft 以外の会社が参加してます 三強が Oracle, IBM, Red Hat 辺り。 日本だと富士通、日立、 NEC 辺り。

今年最新版が出ました。 EE 7 です。

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

6

Java EE の歴史

J2EE 1.2

(1999)

J2EE 1.3

(2001)

J2EE 1.4

(2003)

Java EE 5

(2006)

Java EE 6

(2009)

Java EE 7

(2013)

誕生 ! 順風満帆 再統合 !!

微妙な時期(EE 仕様にとって )

もっかい単一仕様に

まとまろうぜ !!

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

7

Java EE のベンダー達とその周辺

GlassFish &Compatible Group

WebLogic World

Geronimo &Compatible Group

JBoss World

Code

Sharing

BigCompetitor

Japan GalapagosGroup

Com

petit

or

AppEngine

Copy

New

Nam

e

Com

petit

or

of JE

E

Battle

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

8

Java EE のバージョン一覧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 6だがしかし、

来年は EE 7来るよ !!

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

9

Java EE 6 Java EE 7

Java EE 7の準備はOK?

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

10

Java EE 7 仕様の強化内容 ( 共通系 )

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

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

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

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

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

11

Java EE 7 仕様の強化内容 ( バックエンド系 )

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

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

JTA 1.2 CDI に @Transactional, @TransactionScoped 追加

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

カタカナ語で

書くとわけわ

からんね !!

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

12

Java EE 7 仕様の強化内容 ( フロントエンド系 )

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

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

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

何が重要か

よくわからん

ね !!

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

15

JSF 2.2 の主要な更新内容

CDI との完全統合 JSF Managed Bean は deprecated( 廃止予定 )

HTML5 の完全サポート HTML friendly style の完全置換

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

16

JSF 2.2 の更新内容

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

全画面・全 backing bean。

笑うしかな

い !!それだけ改善著しいと理解して下さ

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

JSF 2.1 の問題点 1Backing Bean

FilterFaces

ServletPhase

Listeners

Facelet

Facelet

Facelet

ManagedBean

@ViewScoped

ManagedBean

@ViewScoped

ManagedBean

@ViewScopedManaged

Bean@SessionScoped 俺俺な

JSF世界

Java EE 6 (JSF 2.1)

何で?

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

JSF 2.1 の問題点 1Backing Bean

残念ながら 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;}

なんと

たまに

動かない

!

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

JSF 2.1 の問題点 1Backing Bean

FilterFaces

ServletPhase

Listeners

Facelet

Facelet

Facelet

CDIdon't have

@View Scoped

CDIdon't have

@View Scoped

CDIdon't have

@View ScopedManaged

Bean@SessionScoped

Java EE 6 (JSF 2.1)

統合されたCDIな世界OK!

NG!

NG!

NG!

何で??

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

JSF 2.1 の問題点 1Backing Bean (解決 )

FilterFaces

ServletPhase

Listeners

Facelet

Facelet

Facelet

New CDI@ViewScoped

New CDI@ViewScoped

New CDI@ViewScoped

CDI@SessionScoped

Java EE 7 (JSF 2.2)

統合されたCDIな世界OK!

OK!

Java EE 7を待つべし !!

これが欲しかった!

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

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

JSF 2.1 の問題点 2HTML-friendly tags

Java EE 7 (JSF 2.2)

Java EE 6 (JSF 2.1)

Changed!

超良い!!でも

超いっぱい

修正になるか

死ねるね !!

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

<input type="text" jsfc="h:inputText" name="id" value="#{bean.property}" />

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

22

Struts と JSF 2 の違い

アクション単位 (Struts) と画面単位 (JSF) の違い

単純レンダリング (JSP) とテンプレートエンジン (Facelet) の違い

俺仕様 Action クラス (Struts) と CDI (JSF) の違い

要するに 180度違う ( ので移行の際は作り直し )

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

23

Struts vs. JSFStruts

画面 1JSP

画面 2JSP

Action1

+ action()

画面 3JSP

Action2

+ action()

アクション単位

JSF 2

画面 1Facelet

Backing1- fields+ action()

画面 2Facelet

Backing2- fields+ action()

画面 3Facelet

Backing3- fields+ action()

画面単位

要するに 作り直し

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

24

特集 : 逆引き JSF 2.2 超入門編誰も作ってくれないので試しに作ってみました

Java EE 6

(JSF 2.1)でも

考え方は一緒

よ !!

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

25

実際やって

みよ

う !!

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

26

逆引き 1. 1画面分の画面ファイルを作る

とりあえず NetBeans で Maven > Web プロジェクトを選択しましょう。 綺麗な Maven のプロジェクトができます。 NetBeans のプロジェクトじゃないんです !!

プロジェクトを右クリックして、 Frameworkで JSF 2.2を選択しましょう。

拡張子設定を *.xhtml に変更しましょう これで全部の .xhtml ファイルが駆動するようになり

ます。 実行しましょう ! こんだけ !! 超簡単 !!!

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

27

Mavenの

プロジェクトを

選ぶこと !!

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

28

GlassFish

+ EE 7で指

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

29

プロパティーで

JSF 2.2を指

定しよう !!

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

30

実行ボタンを

押すと動く

ぞ !!

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

31

逆引き 1.5: 文字化けしないようにする

1. Webページ /WEB-INF/ のしたで新規作成 > GlassFish ディスクリプタを選びます。

2. <parameter-encoding default-charset=“UTF-8”/>を追加します。

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

32

めんどくさい

ね !!

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

33

逆引き 2. 動的な処理をさせる

画面ごとに Backing Beanを作りましょう ! 名前を合わせておくと便利です index.xhtml IndexBean.java

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

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

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

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

34

これが

Backing

Bean

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

35

今の状態

index.xhtml Facelet ファイル Apache Tapestry みたいなテンプレート

IndexBean.java Backing Bean (CDI) .NET の Code Behind みたいなのと思って下さい

WEB-INF/glassfish-web.xml 文字化けしないように必要です

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

36

逆引き 3. Facelet に DB からデータを取ってきて文字として表示させたい

1. 表示用のフィールドを追加しましょう2. Backing Bean に @PostConstract メソッドを追加します

3. 追加したメソッドに DB からデータを取ってきます。 EJB と JPA使いましょう

4. 表示用フィールドにデータを詰めます5. Facelet 側で #{beanName.fieldName} と

書きます。終わり !

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

37

Faceletに

Backing

Beanを指定す

るのだ!!

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

38

Backing

Beanの値を表

示した!!

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

39

おまけ:

Faceletを書き

換えると、表

も全自動で変

るぞ !!

さよなら

Eclipse!!!

NetBeansdで

ガシガシ作り

しょう!!

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

40

逆引き 4. 入力項目に予めなんか入れときたい

1. 入力項目用のフィールドと getter, setterを作ります。 Entity 系でもいいです。

2. @PostConstract メソッドで DB からデータ取ってきて、フィールドに詰めます。

3. Facelet 側に <form jsf:id=“form”> と、入力フィールドにjsf:value=“{beanName.propertyName}”と入れておきます。

4. 実行したら最初から入力項目に値が入ってます。

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

41

まるでVB6

だね !!

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

42

逆引き 5. 入力項目を取りたい

1. 入力項目用のフィールドと getter, setterを作ります。 Entity 系でもいいです。追加で、ボタンが押されたときに呼び出されるメソッド (click())を、返り値String型で作っておきます。 ( とりあえず空っぽ )

2. Facelet 側に <form jsf:id=“form”> と、入力フィールドにjsf:value=“{beanName.property}” と入れておきます。

3. ボタン <input type=“submit” jsf:action=“bean.click()”/>を追加します。

4. 入力した値は入力項目用フィールドに入ってますので、 click() メソッドの中で拾って処理します。返り値には遷移先の Facelet 名を「拡張子抜き +?faces-redirect=true」で返します。

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

43

?faces-

redirect=trueが必須。めんどくさい

ね !!

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

44

逆引き 6. 画面を遷移させたとき、前の画面から値を受け渡したい (超基本 )

1. 前の画面の @ViewScoped の Backing Bean の actionメソッドで、 FacesContext から flashを取り出します。

2. flash に値を put します (Map なので key+value) で。3. 前の画面の action メソッドで「次の画面の拡張子抜き

+faces-redirect=true」を return し遷移させます(302 リダイレクト )

4. 次の画面の @ViewScoped の Backing Bean の@PostConstrcut メソッドを作成し、 FacesContextの flash から値を get します。

5. flash の値は 1回しか読めないので、すぐ次の画面のBacking Bean のフィールドに突っ込みます。

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

45

遷移元

遷移先

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

46

受け渡しできた !!

画面単位で作るから、こんな感じなのだ !!

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

47

ここまでのまとめ

画面の Facelet と Backing Bean は 1 対 1 で作りましょう。 Backing Bean は @ViewScopedにしましょう。 用途とメモリー効率を考えればこれが最適解です

Faclet は HTML-friendly style で書きましょう HTML5 / CSS3 対応で responsible web design し

ようとしたら、事実上これしか解がないのではと思います。

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

48

時間切れ

他にもいろいろあると思うんですが、こういう情報がまとまってると超嬉しいな 誰か書いて下さい !!

ただ、ホントにやったことある人じゃないと書けないかも知れない 鶏と卵の関係ですかね・・・ みんな作りまくれ !!

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

49

ご清聴有り難うございました !