javaee6 first application #glassfishjp
DESCRIPTION
2012/6/4GlassFish Users Group Japan 勉強会 June 2012TRANSCRIPT
JAVAEE 6FIRST APPLICATION#GLASSFISHJP
12年6月4日月曜日
JavaEE6作りやすくなったよという話はたくさん聞くけど
12年6月4日月曜日
実は作ったことがない
12年6月4日月曜日
そんな人向け
軽い気持ちで見て下さい。
12年6月4日月曜日
自己紹介
•名前:久保智(@megascus)
• Javaが好きらしい
• JavaEE6は趣味でやってます!
• JavaEE6でSIの現場が楽になればいいなとか
12年6月4日月曜日
アジェンダ
•サンプルアプリを作成
•サンプルアプリにそって説明
12年6月4日月曜日
今回作るアプリの説明
•基本のCreate,Read,Update,Delete
ネタバレ禁止。
12年6月4日月曜日
早速作ってみる
https://github.com/megascus/JavaEE6FisrtApplication
12年6月4日月曜日
出来上がったファイル一覧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日月曜日
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日月曜日
• JavaEE6の標準UI技術はJSF2.0
• JavaScript書けなくてもリッチなUIが作成できる
•いろいろな所で感じるStruts臭()
UI (JSF)
Struts知ってれば使えるよ。
12年6月4日月曜日
UI系の設定ファイル
必要になるまでいじらない。
12年6月4日月曜日
•言わずと知れたJavaで作ったWebアプリのコアファイル
•セッションのタイムアウト時間とか設定できるよ!
•今回はデフォルトで設定
web.xml
困ったときに修正してね。
12年6月4日月曜日
faces-config.xml
• JSFの設定ファイル。struts-configみたいなもの
• JSF1.Xでは超重要だったけど今は空気(にしたい)
•国際化対応時は使用する
画面数が増えてきても使う。
12年6月4日月曜日
XHTMLファイル
Viewをデザインします。
12年6月4日月曜日
• JSFのViewはXHTMLで記載
• XHTMLなので色々と面倒くさい <BR> → <BR /> とか
XHTML
HTMLが雑すぎるとも言う。
12年6月4日月曜日
XHTML(こんなのがあった)
中身を実際に見てみる。
template.xhtmlCreate.xhtmlEdit.xhtmlList.xhtmlView.xhtml
12年6月4日月曜日
その前に基礎知識
• template.xhtmlにデザインを記載
•それ以外に個々の機能を記載
今のUI作成は全体のデザインと画面ごとに変更できる場所を分けて定義するのが当たり前。
昔はFrameを使ってました。
12年6月4日月曜日
その前に基礎知識
複数の画面を作る場合メニューは同じ場合が多いので使いまわしたい。
12年6月4日月曜日
template.xhtml
デザイン定義してます。
12年6月4日月曜日
template.xhtml
使用するタグを定義。
使用したいタグがあれば追加。
12年6月4日月曜日
template.xhtml
h:XX、ui:XXみたいなのがJSFで記載されたところ。
実行時にはHTMLに変換される。
12年6月4日月曜日
template.xhtml
ctrl+spaceで補完と説明が出てくる。必要なら見てね。
12年6月4日月曜日
template.xhtml
ui:insertの中身だけ各画面で書く。
name属性は説明必要?
12年6月4日月曜日
Create.xhtml
長いのでこの後は抜粋で。
12年6月4日月曜日
Create.xhtml
ui:composition でテンプレートを指定。
ui:defineでui:insertの置換。
12年6月4日月曜日
#{bundle.XXXX}の説明
いわゆる国際化対応。
Bundle.propertiesfaces-config.xml
Create.xhtml
12年6月4日月曜日
#{bundle.XXXX}以外の説明
#から始まるやつです。
• value binding
• method binding
12年6月4日月曜日
value binding
bundle.XXXもこれと一緒。
managed-bean(JavaBeans)やmapなどをマッピングできます。
•画面の値をJavaにマッピングする
12年6月4日月曜日
method binding
h:commandLinkは<a href=~>に変換されるので、リンクが押されるとセッションに入っているMessageControllerクラスのcreateメソッドが呼ばれます。
•画面の操作をJavaにマッピングする
12年6月4日月曜日
commandLinkのaction
immediate=”true”はサーバーサイドで値を使わないという意味。
•拡張子を除いてURLを書いておけば他のページに遷移
12年6月4日月曜日
Create.xhtml以外
Create.xhtmlの説明で十分でした。
•省略
12年6月4日月曜日
jsfcrud.css
手を上げたやつ土下座な。
• cssを知らない人が居れば説明するので挙手して下さい
12年6月4日月曜日
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日月曜日
MessageController.java
いわゆるmanaged-bean。
•画面から呼ばれるJavaのクラス
12年6月4日月曜日
MessageController.java
アノテーションがついてます。
12年6月4日月曜日
MessageController.java
@ManagedBeanで画面から扱うクラスとして定義。name
でXHTMLから使用する場合の名前をつける
@SessionScopedでセッションに保存すると定義
method bindingの時に間違った説明があったので誰かがtweetで突っ込んでくれているはず。
12年6月4日月曜日
MessageController.java
faces-config.xmlで指定されてる場合はそちらの設定が優先されます。
メソッドが呼ばれた時にnullだと同じ画面、それ以外の場合はURLとして画面移動する
12年6月4日月曜日
PaginationHelper.java
ページャーを作りたかったら見て下さい。ちなみにクラス名は間違えてないです。
• List.xhtmlで実装されているページャー用
12年6月4日月曜日
JsfUtils.java
JSFで困ったらここから呼ばれているクラスで出来ないかを調べる。
• JSFでやり方のわかりにくいアレやらコレやら
•これ自体よりも内部で呼ばれているクラスが重要
12年6月4日月曜日
JsfUtils.java
エトセトラエトセトラ。全部説明したいがスライドの余白が足りない。
• FacesContext
• ExternalContext
• Converter
12年6月4日月曜日
エラーメッセージの表示だけ
strutsで見たことがあるような・・・
JsfUtils.java
Create.xhtml
12年6月4日月曜日
次はDB系web.xmlfaces-config.xmltemplate.xhtmlCreate.xhtmlEdit.xhtmlList.xhtmlView.xhtmljsfcrud.cssBundle.propertiesMessageController.javaPaginationHelper.javaJsfUtil.java
beans.xmlpersistence.xmlMessage.javaMessageFacade.javaAbstractFacade.java
※他は省略
12年6月4日月曜日
beans.xml
DB系として紹介しているけどDBとは関係ないです。
• CDI(今回未使用)のための設定ファイル
• CDIが有効化される条件はこのファイルがあること
• CDIの有効化方法が判りにくいので紹介だけ
12年6月4日月曜日
DB系の設定ファイル
persistence.xml だけ。
12年6月4日月曜日
persistence.xml
GUIからの設定がオススメ。
• DB接続用定義ファイル
• NetBeansからGUIで設定できる
12年6月4日月曜日
persistence.xml
接続性ユニット名は適当に変えてね。
12年6月4日月曜日
データソースについて
詳細は優しい人がtweetしてくれます。
• GlassFishの管理コンソールで設定したものを使用する
•今回は最初から定義されているjdbc/__defaultを使用
12年6月4日月曜日
Message.java
エンティティにDBの値が保持されています。
•いわゆるエンティティと呼ばれるもの
• RDBのテーブルと対応する
•コレを元にテーブルが自動生成される
12年6月4日月曜日
Message.java
フィールドの値は何もつけなくてもDBに保存されます。messageとか。
12年6月4日月曜日
Message.java
エンティティにするためには@Entityアノテーションを付けてSerializableをimplementsするだけです。
エディタを使って新規作成すれば勝手についてくるよ。
12年6月4日月曜日
Message.java
DBにおける主キーの設定です。JPA(O/R
マッパー)を使う場合は通常は人工キーをつかいます。
思想的な話はHibernate in Actionを参照して下さい。
12年6月4日月曜日
Message.java
GeneratedValueは自動採番の設定ですが、採番の仕方によって保守時の難易度が段違いなので使う時はよく考えて。
12年6月4日月曜日
その他詳しい話は
今までの話、全部これ読めで済みます。
12年6月4日月曜日
MessageFacade.java
EJBという言葉を聞くと動悸や息切れ、めまい等の諸症状が現れる方はお気をつけ下さい。
• EJB
12年6月4日月曜日
MessageFacade.java
EJBというかJTAですけどね。
• EJB内ではデータベースのトランザクション管理をスレッドに紐付ける形で勝手にやってくれる
• commitとかrollbackは不要
12年6月4日月曜日
MessageFacade.java
EJBの外でも同じ事は出来ますが、EJB
の中でやったほうが便利です。
•この中でデータベースへエンティティの値が同期される
•トランザクション管理が必要な処理はこの中で
12年6月4日月曜日
MessageFacade.java
EJBの外でも同じ事は出来ますが、EJB
の中でやったほうが便利です。
•この中でデータベースへエンティティの値が同期される
•トランザクション管理が必要な処理はこの中で
12年6月4日月曜日
MessageFacade.java
@StatelessアノテーションがEJBの印。
@Statefulアノテーションもありますが、差は割愛。
12年6月4日月曜日
MessageFacade.java
@PersistenceContextのunitNameには
persistence.xml で指定した持続性Unit名を入れます。
12年6月4日月曜日
MessageFacade.java
そうするとEntityManagerのインスタンスがGlassFishから渡されて、DBにアクセスすることが出来るようになります。
DBのアクセスにはEntityManagerを使用します。
12年6月4日月曜日
MessageFacade.java
本体はAbstractFacadeなのでそちらをみます。
12年6月4日月曜日
AbstractFacade.java
まずはCRUDから。
12年6月4日月曜日
AbstractFacade.java(CRUD)
getEntityManager().merge(entity)を呼び出しても同じ結果になります。
Create
12年6月4日月曜日
AbstractFacade.java(CRUD)
id(Primary Key)を指定して1件取得しています。
複数件の場合は後ほど。
Read(一件)
12年6月4日月曜日
AbstractFacade.java(CRUD)
getEntityManager().persist(entity)を呼び出すと失敗します。
Update
12年6月4日月曜日
AbstractFacade.java(CRUD)
ちょっと変な感じがしますがお約束。どうしてこうなるかはBeginning Java EE
6を読んで下さい!
Delete
12年6月4日月曜日
AbstractFacade.java(CRUD)
複数件取得する場合はCriteriaかJPQLを使います。上の例はCriteria。
Read(複数件)
12年6月4日月曜日
AbstractFacade.java(CRUD)
Criteriaはコンパイラによって静的チェックが出来ますが複雑になると面倒くさい・・・・・
Criteria
12年6月4日月曜日
AbstractFacade.java(CRUD)
JPQLはSQLライクなクエリ言語で、コンパイラにによるチェックは出来ないけれども、簡単です。
JPQL(今回アプリでは未使用)
12年6月4日月曜日
AbstractFacade.java(CRUD)
書き比べてみました。
Criteria×JPQL
12年6月4日月曜日
MessageFacade.java
やっと最後。
最後にEJBの呼び出し方について
MessageControllerクラスから呼び出される
12年6月4日月曜日
MessageController.java
@EJBアノテーションを付けてインスタンスを生成します。new でインスタンスを生成しても正しく動作しません。
GlassFishがよろしくやってくれてます。
12年6月4日月曜日
今回のアプリの処理の流れ
おおざっぱにこんな順に呼ばれてました。
XHTML(画面)
MessageController(managed-bean)
MessageFacade(EJB)
EntityManager(DB)
Message(Entity)で値をやり取り
12年6月4日月曜日
その他詳しい話は
ご清聴ありがとうございました。
12年6月4日月曜日