makotan _at_ gmail dot com

GT4の最中ですが、従業員管理をどうぞ!

employee/employeeSearch.html ここから始まる!
で、いきなりs:type="invoke" s:action="#{employeeSearchInitAction.initialize}"
これ・・・画面に必要な初期設定は画面でする!ってやつ。
とりあえず実行!画面表示する度にその処理が実行されてるなぁ〜って事で。
しか〜し、ここには大きい謎が・・・この検索結果使われてない!
まぁ要らないといえばそれまでなんだけどね
で、次はs:type="messages" globalOnly="true" s:class="error"
エラーメッセージっぽいなぁ〜(そのまんまだけど)
論理エラーとか表示する場所だよね〜・・・で、エラーはどこで設定するんだと、そういう事ですな。この場合は検索ボタンの先を探すのが早そう・・・えっと、検索ボタンの先は・・・EmployeeSearchActionImplのcheckSearchCount!ここにエラーをsっていしている場所が・・・無い!
まっ予想通りの結果、っていうかこれ、例外出してるだけ!
その例外を、ActionThrowsInterceptorが処理するぞと。
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, MessageUtil.getErrorMessage(ex.getMessageId(), ex.getArgs()));
結果的にこの2行でエラーメッセージへの設定するんだ・・・って事はエラー内容に応じて例外を変えればそれぞれにあわせてメッセージが切り替わると。
まさにPOJO!うんちゃらにメッセージを入れて返す某すとらっつもこういう風に出来たら嫌いにならなかったなぁ〜(;¬_¬) ぁ ゃι ぃ
で、話をエラーメッセージの出力に戻して・・・
s:type="messages"はメッセージの出力だぞ!って事でOK
globalOnly="true"は・・・個別のvalidationじゃないって事?
s:class="error"出力時のスタイルシートのクラスを指定してる気がした
これで当たってるのかなぁ〜
わかんない事はここに書いておけば近日中に解消してるはずだから、次!
validators="#{empnoRangeValidator}"
見慣れないもの発見!
こ〜れ〜は〜diconにあるはず!(笑)
みっけ!allvalidator.dicon
おや、このValidatorはJSFのそのままじゃないですか!っていうよりJSFより書きやすいのかなぁ〜複数個のValidatorはどう書くんだろうとか疑問がっ!!
で、Dtoとかは良いと・・・見慣れないものというか・・・
コメントになってるモノ発見!
type="button" value="新規" s:action="#{employeeSearchAction.goEditForCreate}" onclick="location.href='employeeEdit.html'"
新規に向けての準備は終わりつつあったんだ・・・そうか〜
え〜っとemployeeEdit.htmlは編集も新規も共通・・・だ〜か〜ら〜
goEditForCreateここでprocessMode = Constants.CREATE_MODEこんな事しているわけですね〜
がっしかし・・・謎が一つ、processModeはemployeeSearchActionのメンバ変数ではありませんか!!これをHTMLで表示しようとすると素直に考えて
processModeはemployeeSearchAction.processModeこれ?でもActionはDtoじゃないからそんな使い方しちゃだめだよね〜
って事で、実際にemployeeEdit.htmlを見ながら確認してみると・・・
requestScope.processMode!(゛゛)ギョギョギョ
そのまま素直に読むとrequestScopeにあるprocessMode・・・だよね〜でもここにあるモノはdiconに無いのは許せん!って事でdiconから探し出す(笑)
なんとな〜くそうなんだろうなぁと思った通り、無い!どこっすか!っていうかrequestScopeって一体どこの誰!?(w
きっとS2JSFが知ってる誰かなんだろうという事で無理に納得させて次〜
えっと、検索ボタンを押すと値をチェックしてデータがあれば一覧ページへ・・・ってもしかして明らかにPOSTっぽい画面遷移は初!?
return "employeeList";ってやるとemployeeListをfaces-config.xmlから探し出してそこへ飛ぶ!
プログラムが絡む画面遷移ってこれだけだよね・・・ある意味つまんない(笑)
一覧画面を開く前に、EmployeeListInitActionImplで前の画面(いきなり開いても大丈夫なんだよね)で指定されたDtoを受け取って、それをDaoで検索!結果を自分のemployeeDtoListっていうpropertyに・・・ってまたか!
まぁとりあえず、
id="employeeListForEach" s:type="forEach" s:items="#{employeeDtoList}" s:var="e" s:varIndex="i"
これですね、これ・・・っていうか、予想に反してrequestScope付いてませんから!!残念!!!
とりあえずそういう事なんだろうと無理矢理納得させて・・・
forEachは初登場!
s:items="#{employeeDtoList}" あたいのリスト
s:var="e" forEachの中で使う値
s:varIndex="i" たぶんそのカウンタ(これ良いね)
あとは閉じタグ忘れないようにしましょう!って意外は特記事項無し(笑)
さて、あとはみなれたものば・・・・かりじゃない!
class="evenRow" s:class="#{i % 2 == 0 ? 'evenRow' : 'oddRow'}"
これは、OGNLってやつですね〜
もしやこれまで#{...}って書いてた...にはどこにでもOGNL式が書けるとか!?
その後の編集のリンクの所に
s:type="param" s:name="processMode" s:value="2"
って書いてるって言う事から推測すると、requestScopeはparam、request等から取得出来るっていう風に読み替えても成立するなぁ〜
で〜次はs:rendered="false"・・・出力するな!って事ね
あとは何も書く事無いので、employeeEdit.html
initでprocessModeを受け取ってその値にあわせて見た目を変えるemployeeEditInitAction.initializeそんなのがありつつ・・・employeeDto.versionNoっていうのは、Daoに出てくるあれかな〜
employeeDto.empnoは表示もするけど、更新などで要るからhiddenでも渡すぞと、あとは大して書くところもなく・・・確認はemployeeConfirmって何か省略してませんか!?
もしかして、これはfaces-config?
発見!!まぁ考えてみれば#{}で囲ってないからOGNLじゃないもんね・・・そうか・・・単純な画面遷移でよければこれで良いんだ・・・
employeeConfirm.htmlはemployeeConfirmInitAction.initializeを呼びだしてDtoに必要な情報をせっせとセットした後
hiddenで必要な情報を全部出力・・・ちょっと大変だけど、確かに良くやる(笑)
s:type="messages" globalOnly="false" s:showDetail="true" s:showSummary="true" s:class="error"
おや、新しいのが追加されてるぞ・・・
s:showDetail="true" s:showSummary="true" 
二つともよく分かりませんから!残念!!
と、まぁそれはさておき、あとはemployeeConfirmAction.storeを呼びだしてモード毎に追加したり更新したり削除したりすると。
謎はいっぱい残ったけど、とりあえずこれで終わり〜
#これから久しぶりにご飯炊く!!\(^o^)/ワーイ