Upload
hirofumi-iwasaki
View
14.600
Download
0
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
Java EE 7技術アップデート
皇紀二六七三年 ( 平成二十五年 )十一月十五日
岩崎浩文
2
講演者紹介
福岡で某会社の技術管理責任者やってます とはいえプログラムできなければ管理できっこないので、
ガンガン書いてます 福岡住みやすいです。が、生まれも育ちも熊本です。
元々 WebLogic ( 旧 Tengah) Love です その延長で Java EE ( 旧 J2EE) 推しです
昔いっぱい連載しました 最近は本業変えてすっかりご無沙汰です
JavaOne は 2013 ・ 2012 ・ 2001 ・ 2000 に行きました。日本のだと 2002 に喋りました
http://www.mushagaeshi.com
JavaOne 2013: Java EE 8 and beyond
Java EE spec reads
結構有名人達
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と
統合するよう
な
感じぽい !! 生情報
万歳 !!
5
Java EE とは
企業向けの Java 標準仕様です。 JEE とも。 Java Platform, Enterprise Edition その昔 J2EE と言ってました。
Java 2 Platform, Enterprise Edition 結構恥ずかしい名前なので忘れて下さい
Microsoft 以外の会社が参加してます 三強が Oracle, IBM, Red Hat 辺り。 日本だと富士通、日立、 NEC 辺り。
今年最新版が出ました。 EE 7 です。
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 仕様にとって )
もっかい単一仕様に
まとまろうぜ !!
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
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来るよ !!
9
Java EE 6 Java EE 7
Java EE 7の準備はOK?
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 標準のスレッド制御仕様が ( ようやく ) 追加 ダイナミックプロクシー追加
11
Java EE 7 仕様の強化内容 ( バックエンド系 )
EJB 3.2 非永続化 EJB タイマーの追加
JMS 2.0 リソース設定の改善 クライアント側のアノテーションでの呼び出しサポート
JTA 1.2 CDI に @Transactional, @TransactionScoped 追加
JPA 2.1 マッピング用コンバーターの追加 クライテリアクエリーと JPQL の強化 動的ネームドクエリーの追加 非同期永続化コンテクストの追加 標準の DDL 自動生成機能仕様の追加
カタカナ語で
書くとわけわ
からんね !!
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 新仕様。全二重双方向の通信 新アノテーション ( サーバー・クライアント ) 新エンコーダー・デコーダー
何が重要か
よくわからん
ね !!
13
で、目玉は ?
ずばり、 JSF 2.2 でしょう !!!
さらば Struts俺が介錯してや
る
待ってまし
た !!
14
ようこそ JSF 2.2!!!
遂に Java EE だけで全部作れるようになりました !!
さよなら JSP!! さよなら Struts!! さよなら Commons!!
※2.2 以降が必須です
15
JSF 2.2 の主要な更新内容
CDI との完全統合 JSF Managed Bean は deprecated( 廃止予定 )
HTML5 の完全サポート HTML friendly style の完全置換
16
JSF 2.2 の更新内容
たったこんだけ ? いやいやこいつら根幹ですよ Java EE 6 からの移行の際の影響度合い :
全画面・全 backing bean。
笑うしかな
い !!それだけ改善著しいと理解して下さ
い
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)
何で?
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;}
なんと
たまに
動かない
!
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!
何で??
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を待つべし !!
これが欲しかった!
<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}" />
22
Struts と JSF 2 の違い
アクション単位 (Struts) と画面単位 (JSF) の違い
単純レンダリング (JSP) とテンプレートエンジン (Facelet) の違い
俺仕様 Action クラス (Struts) と CDI (JSF) の違い
要するに 180度違う ( ので移行の際は作り直し )
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()
画面単位
要するに 作り直し
24
特集 : 逆引き JSF 2.2 超入門編誰も作ってくれないので試しに作ってみました
Java EE 6
(JSF 2.1)でも
考え方は一緒
だ
よ !!
25
実際やって
みよ
う !!
26
逆引き 1. 1画面分の画面ファイルを作る
とりあえず NetBeans で Maven > Web プロジェクトを選択しましょう。 綺麗な Maven のプロジェクトができます。 NetBeans のプロジェクトじゃないんです !!
プロジェクトを右クリックして、 Frameworkで JSF 2.2を選択しましょう。
拡張子設定を *.xhtml に変更しましょう これで全部の .xhtml ファイルが駆動するようになり
ます。 実行しましょう ! こんだけ !! 超簡単 !!!
27
Mavenの
プロジェクトを
選ぶこと !!
28
GlassFish
+ EE 7で指
定
29
プロパティーで
JSF 2.2を指
定しよう !!
30
実行ボタンを
押すと動く
ぞ !!
31
逆引き 1.5: 文字化けしないようにする
1. Webページ /WEB-INF/ のしたで新規作成 > GlassFish ディスクリプタを選びます。
2. <parameter-encoding default-charset=“UTF-8”/>を追加します。
32
めんどくさい
ね !!
33
逆引き 2. 動的な処理をさせる
画面ごとに Backing Beanを作りましょう ! 名前を合わせておくと便利です index.xhtml IndexBean.java
新規作成 > Java クラス 出来たクラスにアノテーションを付けましょう
@Named CDI ですよって宣言 @ViewScoped Backing Bean ですよって宣言
最後に implements Serializableを付けましょう めんどくさいのですが、現在NetBeans に↑のウィザード追加作業中だそうです
34
これが
Backing
Bean
35
今の状態
index.xhtml Facelet ファイル Apache Tapestry みたいなテンプレート
IndexBean.java Backing Bean (CDI) .NET の Code Behind みたいなのと思って下さい
WEB-INF/glassfish-web.xml 文字化けしないように必要です
36
逆引き 3. Facelet に DB からデータを取ってきて文字として表示させたい
1. 表示用のフィールドを追加しましょう2. Backing Bean に @PostConstract メソッドを追加します
3. 追加したメソッドに DB からデータを取ってきます。 EJB と JPA使いましょう
4. 表示用フィールドにデータを詰めます5. Facelet 側で #{beanName.fieldName} と
書きます。終わり !
37
Faceletに
Backing
Beanを指定す
るのだ!!
38
Backing
Beanの値を表
示した!!
39
おまけ:
Faceletを書き
換えると、表
示
も全自動で変
わ
るぞ !!
さよなら
Eclipse!!!
NetBeansdで
ガシガシ作り
ま
しょう!!
40
逆引き 4. 入力項目に予めなんか入れときたい
1. 入力項目用のフィールドと getter, setterを作ります。 Entity 系でもいいです。
2. @PostConstract メソッドで DB からデータ取ってきて、フィールドに詰めます。
3. Facelet 側に <form jsf:id=“form”> と、入力フィールドにjsf:value=“{beanName.propertyName}”と入れておきます。
4. 実行したら最初から入力項目に値が入ってます。
41
まるでVB6
だね !!
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」で返します。
43
?faces-
redirect=trueが必須。めんどくさい
ね !!
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 のフィールドに突っ込みます。
45
遷移元
遷移先
46
受け渡しできた !!
画面単位で作るから、こんな感じなのだ !!
47
ここまでのまとめ
画面の Facelet と Backing Bean は 1 対 1 で作りましょう。 Backing Bean は @ViewScopedにしましょう。 用途とメモリー効率を考えればこれが最適解です
Faclet は HTML-friendly style で書きましょう HTML5 / CSS3 対応で responsible web design し
ようとしたら、事実上これしか解がないのではと思います。
48
時間切れ
他にもいろいろあると思うんですが、こういう情報がまとまってると超嬉しいな 誰か書いて下さい !!
ただ、ホントにやったことある人じゃないと書けないかも知れない 鶏と卵の関係ですかね・・・ みんな作りまくれ !!
49
ご清聴有り難うございました !