javaee6 first application #glassfishjp

75
JAVAEE 6 FIRST APPLICATION #GLASSFISHJP 1264日月曜日

Upload: satoshi-kubo

Post on 17-Jun-2015

2.125 views

Category:

Technology


3 download

DESCRIPTION

2012/6/4GlassFish Users Group Japan 勉強会 June 2012

TRANSCRIPT

Page 1: JavaEE6 First Application #glassfishjp

JAVAEE 6FIRST APPLICATION#GLASSFISHJP

12年6月4日月曜日

Page 2: JavaEE6 First Application #glassfishjp

JavaEE6作りやすくなったよという話はたくさん聞くけど

12年6月4日月曜日

Page 3: JavaEE6 First Application #glassfishjp

実は作ったことがない

12年6月4日月曜日

Page 4: JavaEE6 First Application #glassfishjp

そんな人向け

軽い気持ちで見て下さい。

12年6月4日月曜日

Page 5: JavaEE6 First Application #glassfishjp

自己紹介

•名前:久保智(@megascus)

• Javaが好きらしい

• JavaEE6は趣味でやってます!

• JavaEE6でSIの現場が楽になればいいなとか

12年6月4日月曜日

Page 6: JavaEE6 First Application #glassfishjp

アジェンダ

•サンプルアプリを作成

•サンプルアプリにそって説明

12年6月4日月曜日

Page 7: JavaEE6 First Application #glassfishjp

今回作るアプリの説明

•基本のCreate,Read,Update,Delete

ネタバレ禁止。

12年6月4日月曜日

Page 9: JavaEE6 First Application #glassfishjp

出来上がったファイル一覧web.xmlfaces-config.xmltemplate.xhtmlCreate.xhtmlEdit.xhtmlList.xhtmlView.xhtmljsfcrud.cssBundle.propertiesMessageController.javaPaginationHelper.javaJsfUtil.java

beans.xmlpersistence.xmlMessage.javaMessageFacade.javaAbstractFacade.java

※他は省略

UI DB

12年6月4日月曜日

Page 10: JavaEE6 First Application #glassfishjp

UI(VIEW)から順番にweb.xmlfaces-config.xmltemplate.xhtmlCreate.xhtmlEdit.xhtmlList.xhtmlView.xhtmljsfcrud.cssBundle.propertiesMessageController.javaPaginationHelper.javaJsfUtil.java

beans.xmlpersistence.xmlMessage.javaMessageFacade.javaAbstractFacade.java

※他は省略

12年6月4日月曜日

Page 11: JavaEE6 First Application #glassfishjp

• JavaEE6の標準UI技術はJSF2.0

• JavaScript書けなくてもリッチなUIが作成できる

•いろいろな所で感じるStruts臭()

UI (JSF)

Struts知ってれば使えるよ。

12年6月4日月曜日

Page 12: JavaEE6 First Application #glassfishjp

UI系の設定ファイル

必要になるまでいじらない。

12年6月4日月曜日

Page 13: JavaEE6 First Application #glassfishjp

•言わずと知れたJavaで作ったWebアプリのコアファイル

•セッションのタイムアウト時間とか設定できるよ!

•今回はデフォルトで設定

web.xml

困ったときに修正してね。

12年6月4日月曜日

Page 14: JavaEE6 First Application #glassfishjp

faces-config.xml

• JSFの設定ファイル。struts-configみたいなもの

• JSF1.Xでは超重要だったけど今は空気(にしたい)

•国際化対応時は使用する

画面数が増えてきても使う。

12年6月4日月曜日

Page 15: JavaEE6 First Application #glassfishjp

XHTMLファイル

Viewをデザインします。

12年6月4日月曜日

Page 16: JavaEE6 First Application #glassfishjp

• JSFのViewはXHTMLで記載

• XHTMLなので色々と面倒くさい <BR> → <BR /> とか

XHTML

HTMLが雑すぎるとも言う。

12年6月4日月曜日

Page 17: JavaEE6 First Application #glassfishjp

XHTML(こんなのがあった)

中身を実際に見てみる。

template.xhtmlCreate.xhtmlEdit.xhtmlList.xhtmlView.xhtml

12年6月4日月曜日

Page 18: JavaEE6 First Application #glassfishjp

その前に基礎知識

• template.xhtmlにデザインを記載

•それ以外に個々の機能を記載

今のUI作成は全体のデザインと画面ごとに変更できる場所を分けて定義するのが当たり前。

昔はFrameを使ってました。

12年6月4日月曜日

Page 19: JavaEE6 First Application #glassfishjp

その前に基礎知識

複数の画面を作る場合メニューは同じ場合が多いので使いまわしたい。

12年6月4日月曜日

Page 20: JavaEE6 First Application #glassfishjp

template.xhtml

デザイン定義してます。

12年6月4日月曜日

Page 21: JavaEE6 First Application #glassfishjp

template.xhtml

使用するタグを定義。

使用したいタグがあれば追加。

12年6月4日月曜日

Page 22: JavaEE6 First Application #glassfishjp

template.xhtml

h:XX、ui:XXみたいなのがJSFで記載されたところ。

実行時にはHTMLに変換される。

12年6月4日月曜日

Page 23: JavaEE6 First Application #glassfishjp

template.xhtml

ctrl+spaceで補完と説明が出てくる。必要なら見てね。

12年6月4日月曜日

Page 24: JavaEE6 First Application #glassfishjp

template.xhtml

ui:insertの中身だけ各画面で書く。

name属性は説明必要?

12年6月4日月曜日

Page 25: JavaEE6 First Application #glassfishjp

Create.xhtml

長いのでこの後は抜粋で。

12年6月4日月曜日

Page 26: JavaEE6 First Application #glassfishjp

Create.xhtml

ui:composition でテンプレートを指定。

ui:defineでui:insertの置換。

12年6月4日月曜日

Page 27: JavaEE6 First Application #glassfishjp

#{bundle.XXXX}の説明

いわゆる国際化対応。

Bundle.propertiesfaces-config.xml

Create.xhtml

12年6月4日月曜日

Page 28: JavaEE6 First Application #glassfishjp

#{bundle.XXXX}以外の説明

#から始まるやつです。

• value binding

• method binding

12年6月4日月曜日

Page 29: JavaEE6 First Application #glassfishjp

value binding

bundle.XXXもこれと一緒。

managed-bean(JavaBeans)やmapなどをマッピングできます。

•画面の値をJavaにマッピングする

12年6月4日月曜日

Page 30: JavaEE6 First Application #glassfishjp

method binding

h:commandLinkは<a href=~>に変換されるので、リンクが押されるとセッションに入っているMessageControllerクラスのcreateメソッドが呼ばれます。

•画面の操作をJavaにマッピングする

12年6月4日月曜日

Page 31: JavaEE6 First Application #glassfishjp

commandLinkのaction

immediate=”true”はサーバーサイドで値を使わないという意味。

•拡張子を除いてURLを書いておけば他のページに遷移

12年6月4日月曜日

Page 32: JavaEE6 First Application #glassfishjp

Create.xhtml以外

Create.xhtmlの説明で十分でした。

•省略

12年6月4日月曜日

Page 33: JavaEE6 First Application #glassfishjp

jsfcrud.css

手を上げたやつ土下座な。

• cssを知らない人が居れば説明するので挙手して下さい

12年6月4日月曜日

Page 34: JavaEE6 First Application #glassfishjp

UI系のJavaファイルweb.xmlfaces-config.xmltemplate.xhtmlCreate.xhtmlEdit.xhtmlList.xhtmlView.xhtmljsfcrud.cssBundle.propertiesMessageController.javaPaginationHelper.javaJsfUtil.java

beans.xmlpersistence.xmlMessage.javaMessageFacade.javaAbstractFacade.java

※他は省略

12年6月4日月曜日

Page 35: JavaEE6 First Application #glassfishjp

MessageController.java

いわゆるmanaged-bean。

•画面から呼ばれるJavaのクラス

12年6月4日月曜日

Page 36: JavaEE6 First Application #glassfishjp

MessageController.java

アノテーションがついてます。

12年6月4日月曜日

Page 37: JavaEE6 First Application #glassfishjp

MessageController.java

@ManagedBeanで画面から扱うクラスとして定義。name

でXHTMLから使用する場合の名前をつける

@SessionScopedでセッションに保存すると定義

method bindingの時に間違った説明があったので誰かがtweetで突っ込んでくれているはず。

12年6月4日月曜日

Page 38: JavaEE6 First Application #glassfishjp

MessageController.java

faces-config.xmlで指定されてる場合はそちらの設定が優先されます。

メソッドが呼ばれた時にnullだと同じ画面、それ以外の場合はURLとして画面移動する

12年6月4日月曜日

Page 39: JavaEE6 First Application #glassfishjp

PaginationHelper.java

ページャーを作りたかったら見て下さい。ちなみにクラス名は間違えてないです。

• List.xhtmlで実装されているページャー用

12年6月4日月曜日

Page 40: JavaEE6 First Application #glassfishjp

JsfUtils.java

JSFで困ったらここから呼ばれているクラスで出来ないかを調べる。

• JSFでやり方のわかりにくいアレやらコレやら

•これ自体よりも内部で呼ばれているクラスが重要

12年6月4日月曜日

Page 41: JavaEE6 First Application #glassfishjp

JsfUtils.java

エトセトラエトセトラ。全部説明したいがスライドの余白が足りない。

• FacesContext

• ExternalContext

• Converter

12年6月4日月曜日

Page 42: JavaEE6 First Application #glassfishjp

エラーメッセージの表示だけ

strutsで見たことがあるような・・・

JsfUtils.java

Create.xhtml

12年6月4日月曜日

Page 43: JavaEE6 First Application #glassfishjp

次はDB系web.xmlfaces-config.xmltemplate.xhtmlCreate.xhtmlEdit.xhtmlList.xhtmlView.xhtmljsfcrud.cssBundle.propertiesMessageController.javaPaginationHelper.javaJsfUtil.java

beans.xmlpersistence.xmlMessage.javaMessageFacade.javaAbstractFacade.java

※他は省略

12年6月4日月曜日

Page 44: JavaEE6 First Application #glassfishjp

beans.xml

DB系として紹介しているけどDBとは関係ないです。

• CDI(今回未使用)のための設定ファイル

• CDIが有効化される条件はこのファイルがあること

• CDIの有効化方法が判りにくいので紹介だけ

12年6月4日月曜日

Page 45: JavaEE6 First Application #glassfishjp

DB系の設定ファイル

persistence.xml だけ。

12年6月4日月曜日

Page 46: JavaEE6 First Application #glassfishjp

persistence.xml

GUIからの設定がオススメ。

• DB接続用定義ファイル

• NetBeansからGUIで設定できる

12年6月4日月曜日

Page 47: JavaEE6 First Application #glassfishjp

persistence.xml

接続性ユニット名は適当に変えてね。

12年6月4日月曜日

Page 48: JavaEE6 First Application #glassfishjp

データソースについて

詳細は優しい人がtweetしてくれます。

• GlassFishの管理コンソールで設定したものを使用する

•今回は最初から定義されているjdbc/__defaultを使用

12年6月4日月曜日

Page 49: JavaEE6 First Application #glassfishjp

Message.java

エンティティにDBの値が保持されています。

•いわゆるエンティティと呼ばれるもの

• RDBのテーブルと対応する

•コレを元にテーブルが自動生成される

12年6月4日月曜日

Page 50: JavaEE6 First Application #glassfishjp

Message.java

フィールドの値は何もつけなくてもDBに保存されます。messageとか。

12年6月4日月曜日

Page 51: JavaEE6 First Application #glassfishjp

Message.java

エンティティにするためには@Entityアノテーションを付けてSerializableをimplementsするだけです。

エディタを使って新規作成すれば勝手についてくるよ。

12年6月4日月曜日

Page 52: JavaEE6 First Application #glassfishjp

Message.java

DBにおける主キーの設定です。JPA(O/R

マッパー)を使う場合は通常は人工キーをつかいます。

思想的な話はHibernate in Actionを参照して下さい。

12年6月4日月曜日

Page 53: JavaEE6 First Application #glassfishjp

Message.java

GeneratedValueは自動採番の設定ですが、採番の仕方によって保守時の難易度が段違いなので使う時はよく考えて。

12年6月4日月曜日

Page 54: JavaEE6 First Application #glassfishjp

その他詳しい話は

今までの話、全部これ読めで済みます。

12年6月4日月曜日

Page 55: JavaEE6 First Application #glassfishjp

MessageFacade.java

EJBという言葉を聞くと動悸や息切れ、めまい等の諸症状が現れる方はお気をつけ下さい。

• EJB

12年6月4日月曜日

Page 56: JavaEE6 First Application #glassfishjp

MessageFacade.java

EJBというかJTAですけどね。

• EJB内ではデータベースのトランザクション管理をスレッドに紐付ける形で勝手にやってくれる

• commitとかrollbackは不要

12年6月4日月曜日

Page 57: JavaEE6 First Application #glassfishjp

MessageFacade.java

EJBの外でも同じ事は出来ますが、EJB

の中でやったほうが便利です。

•この中でデータベースへエンティティの値が同期される

•トランザクション管理が必要な処理はこの中で

12年6月4日月曜日

Page 58: JavaEE6 First Application #glassfishjp

MessageFacade.java

EJBの外でも同じ事は出来ますが、EJB

の中でやったほうが便利です。

•この中でデータベースへエンティティの値が同期される

•トランザクション管理が必要な処理はこの中で

12年6月4日月曜日

Page 59: JavaEE6 First Application #glassfishjp

MessageFacade.java

@StatelessアノテーションがEJBの印。

@Statefulアノテーションもありますが、差は割愛。

12年6月4日月曜日

Page 60: JavaEE6 First Application #glassfishjp

MessageFacade.java

@PersistenceContextのunitNameには

persistence.xml で指定した持続性Unit名を入れます。

12年6月4日月曜日

Page 61: JavaEE6 First Application #glassfishjp

MessageFacade.java

そうするとEntityManagerのインスタンスがGlassFishから渡されて、DBにアクセスすることが出来るようになります。

DBのアクセスにはEntityManagerを使用します。

12年6月4日月曜日

Page 62: JavaEE6 First Application #glassfishjp

MessageFacade.java

本体はAbstractFacadeなのでそちらをみます。

12年6月4日月曜日

Page 63: JavaEE6 First Application #glassfishjp

AbstractFacade.java

まずはCRUDから。

12年6月4日月曜日

Page 64: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

getEntityManager().merge(entity)を呼び出しても同じ結果になります。

Create

12年6月4日月曜日

Page 65: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

id(Primary Key)を指定して1件取得しています。

複数件の場合は後ほど。

Read(一件)

12年6月4日月曜日

Page 66: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

getEntityManager().persist(entity)を呼び出すと失敗します。

Update

12年6月4日月曜日

Page 67: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

ちょっと変な感じがしますがお約束。どうしてこうなるかはBeginning Java EE

6を読んで下さい!

Delete

12年6月4日月曜日

Page 68: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

複数件取得する場合はCriteriaかJPQLを使います。上の例はCriteria。

Read(複数件)

12年6月4日月曜日

Page 69: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

Criteriaはコンパイラによって静的チェックが出来ますが複雑になると面倒くさい・・・・・

Criteria

12年6月4日月曜日

Page 70: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

JPQLはSQLライクなクエリ言語で、コンパイラにによるチェックは出来ないけれども、簡単です。

JPQL(今回アプリでは未使用)

12年6月4日月曜日

Page 71: JavaEE6 First Application #glassfishjp

AbstractFacade.java(CRUD)

書き比べてみました。

Criteria×JPQL

12年6月4日月曜日

Page 72: JavaEE6 First Application #glassfishjp

MessageFacade.java

やっと最後。

最後にEJBの呼び出し方について

MessageControllerクラスから呼び出される

12年6月4日月曜日

Page 73: JavaEE6 First Application #glassfishjp

MessageController.java

@EJBアノテーションを付けてインスタンスを生成します。new でインスタンスを生成しても正しく動作しません。

GlassFishがよろしくやってくれてます。

12年6月4日月曜日

Page 74: JavaEE6 First Application #glassfishjp

今回のアプリの処理の流れ

おおざっぱにこんな順に呼ばれてました。

XHTML(画面)

MessageController(managed-bean)

MessageFacade(EJB)

EntityManager(DB)

Message(Entity)で値をやり取り

12年6月4日月曜日

Page 75: JavaEE6 First Application #glassfishjp

その他詳しい話は

ご清聴ありがとうございました。

12年6月4日月曜日