Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

26,601 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. 皇紀二六七三年(平成二十五年) 十一月十五日 岩崎浩文
  2. 2.  福岡で某会社の技術管理責任者やってます    元々WebLogic (旧Tengah) Loveです    その延長でJava EE (旧J2EE)推しです 昔いっぱい連載しました   とはいえプログラムできなければ管理できっこないので、 ガンガン書いてます 福岡住みやすいです。が、生まれも育ちも熊本です。 最近は本業変えてすっかりご無沙汰です JavaOneは2013・2012・2001・2000に行きました。 日本のだと2002に喋りました http://www.mushagaeshi.com 2
  3. 3. Java EE spec reads 結構有名人達
  4. 4. 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)
  5. 5.  企業向けのJava標準仕様です。JEEとも。    Microsoft以外の会社が参加してます    Java Platform, Enterprise Edition その昔J2EEと言ってました。  Java 2 Platform, Enterprise Edition  結構恥ずかしい名前なので忘れて下さい 三強がOracle, IBM, Red Hat辺り。 日本だと富士通、日立、NEC辺り。 今年最新版が出ました。EE 7です。 5
  6. 6. 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)
  7. 7. App Engine WebLogic World GlassFish & Compatible Group Geronimo & Compatible Group Copy Japan Galapagos Group JBoss World 7
  8. 8. 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
  9. 9. Java EE 7の 準備はOK? 9
  10. 10.  CDI 1.1     Bean Validation 1.1    メソッドレベルバリデーションのサポート EL式の更新とエラーメッセージの書き換え等 Interceptors    JSFとの(ようやくの完全)統合 簡易EJBぽい用途としての自動トランザクション @Transactionalサポート クラスローディングから除外する@Vetoedサポート @AroundConstructor, @PreDestroy の追加 順序@Priority, @Interceptors({1st, 2nd})追加(ようやく・・・) Concurrency 1.0   標準のスレッド制御仕様が(ようやく)追加 ダイナミックプロクシー追加 10
  11. 11.  EJB 3.2   JMS 2.0    リソース設定の改善 クライアント側のアノテーションでの呼び出しサポート JTA 1.2   非永続化EJBタイマーの追加 CDIに@Transactional, @TransactionScoped 追加 JPA 2.1      マッピング用コンバーターの追加 クライテリアクエリーとJPQLの強化 動的ネームドクエリーの追加 非同期永続化コンテクストの追加 標準のDDL自動生成機能仕様の追加 11
  12. 12.  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
  13. 13.  ずばり、JSF 2.2でしょう!!! 13
  14. 14.     遂にJava EEだけで全部作れるようになりまし た!! さよならJSP!! さよならStruts!! さよならCommons!! ※2.2以降が必須です 14
  15. 15.  CDIとの完全統合   JSF Managed Beanはdeprecated(廃止予定) HTML5の完全サポート  HTML friendly styleの完全置換 15
  16. 16.    たったこんだけ? いやいやこいつら根幹ですよ Java EE 6からの移行の際の影響度合い: 16
  17. 17. 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世界
  18. 18.  残念ながら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; }
  19. 19. 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な世界
  20. 20. 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な世界
  21. 21. 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 を待ちましょう!!!!!
  22. 22.     アクション単位(Struts)と画面単位(JSF)の違い 単純レンダリング(JSP)とテンプレートエンジン (Facelet)の違い 俺仕様Actionクラス(Struts)とCDI (JSF)の違い 要するに180度違う(ので移行の際は作り直し) 22
  23. 23. 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. 24. 誰も作ってくれないので試しに作ってみました 24
  25. 25. 25
  26. 26.  とりあえずNetBeansで Maven > Webプロジェ クトを選択しましょう。     プロジェクトを右クリックして、Frameworkで JSF 2.2を選択しましょう。 拡張子設定を *.xhtmlに変更しましょう   綺麗なMavenのプロジェクトができます。 NetBeansのプロジェクトじゃないんです!! これで全部の.xhtmlファイルが駆動するようになりま す。 実行しましょう! こんだけ!! 超簡単!!! 26
  27. 27. 27
  28. 28. 28
  29. 29. 29
  30. 30. 30
  31. 31. 1. 2. Webページ/WEB-INF/のしたで新規作成 > GlassFishディスクリプタを選びます。 <parameter-encoding default-charset=“UTF8”/> を追加します。 31
  32. 32. 32
  33. 33.  画面ごとにBacking Beanを作りましょう!     新規作成 > Javaクラス 出来たクラスにアノテーションを付けましょう     名前を合わせておくと便利です index.xhtml  IndexBean.java @Named  CDIですよって宣言 @ViewScoped  Backing Beanですよって宣言 最後に implements Serializableを付けましょう めんどくさいのですが、現在NetBeansに ↑のウィザード追加作業中だそうです 33
  34. 34. 34
  35. 35.  index.xhtml    IndexBean.java    Faceletファイル Apache Tapestryみたいなテンプレート Backing Bean (CDI) .NETのCode Behindみたいなのと思って下さい WEB-INF/glassfish-web.xml  文字化けしないように必要です 35
  36. 36. 1. 2. 3. 4. 5. 表示用のフィールドを追加しましょう Backing Beanに@PostConstractメソッドを追 加します 追加したメソッドにDBからデータを取ってき ます。EJBとJPA使いましょう 表示用フィールドにデータを詰めます Facelet側で #{beanName.fieldName}と書きま す。終わり! 36
  37. 37. 37
  38. 38. 38
  39. 39. 39
  40. 40. 1. 2. 3. 4. 入力項目用のフィールドとgetter, setterを作り ます。Entity系でもいいです。 @PostConstractメソッドでDBからデータ取っ てきて、フィールドに詰めます。 Facelet側に<form jsf:id=“form”>と、入力フィー ルドにjsf:value=“{beanName.propertyName}”と 入れておきます。 実行したら最初から入力項目に値が入ってます。 40
  41. 41. 41
  42. 42. 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. 43. 43
  44. 44. 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. 45. 45
  46. 46. 46
  47. 47.  画面のFaceletとBacking Beanは1対1で作りま しょう。Backing Beanは@ViewScopedにしま しょう。   用途とメモリー効率を考えればこれが最適解です FacletはHTML-friendly styleで書きましょう  HTML5 / CSS3対応でresponsible web designしよう としたら、事実上これしか解がないのではと思いま す。 47
  48. 48.  他にもいろいろあると思うんですが、こういう 情報がまとまってると超嬉しいな   誰か書いて下さい!! ただ、ホントにやったことある人じゃないと書 けないかも知れない   鶏と卵の関係ですかね・・・ みんな作りまくれ!! 48
  49. 49. 49

×