Java EEを初めて触るようになって8ヶ月くらい経ちました。
EEはもちろんのこと、Java SEに関してもゼロスタートだったので、日々学習が必要で未だにてんてこ舞いです。
そして最近すっかり.NETの世界を忘れています(-_-;
今は実開発に入ってるので、ゆっくり学習する余裕も既になく、かつ周囲に聞ける人がいない状況は結構辛かったりもしますが、壁にぶつかって一緒に調べたり相談し合えるメンバが一緒なだけ幸いです。
前置きが長くなりましたが…
昨日、とある画面を作っていて
画面表示時にDBのあるフラグをみて、フラグに応じて警告ダイアログを出す
みたいなのがありました。遷移する前に出せよって感じですが、まあその辺の仕様は置いておいて(^^;
Windows Formだとごくごく簡単なことですが、自分のようなWeb開発初心者にとっては「何を使うのがbestなの…」って感じだったりします。
バッキングビーンのPostConstructでFacesContextにDialogのコンポーネントぶっこむ?と考えたり、preRenderViewとか使うのか、とかあれこれ思いつつ、色々とググっていくとJavaScriptにwindow.onLoadなるものがあると知りました。
「JavaScriptかぁー、でもフラグはバッキングビーンみないとねぇ…どーすんのよ」
と頭の固い自分達は「うーん」となったわけですが、一緒に調べてた人が「あれー、これできるよ」と以下stackoverflowで見つけてきました。
Mixing JSF EL in a Javascript file
なんというか、みると「あ、できるんだ(^^;」と思うし、よくよく考えれば「そりゃできるわな」って感じなのですが、頭の中が「JSFの世界」「JavaScriptの世界」みたいに何故か分けて考えてしまってたので、気づかなかった感じです。
てか、これできるなら、今まで作った所で、もう少し簡単な実装に変えられる部分もあるなぁ…と気づいて、今後リファクタとか必要になりそうです。
とりあえず、簡易サンプルを書いて検証しました。以下のようなものです。
<h:body>
<script type="text/javascript">
window.onload = function() {
if(#{onLoadConfirm.hasOpenError()}){
dlg.show();
}
};
</script>
<p:confirmDialog id="dlgId" widgetVar="dlg" message="ダイアログですー"/>
</h:body>
バッキングビーン(CDI管理対象Bean)
package jp.co.hoge.primefacessandbox;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
@Named(value = "onLoadConfirm")
@RequestScoped
public class OnLoadConfirm {
private boolean hasOpenError;
@PostConstruct
public void init(){
hasOpenError = true;
}
}
フラグ値を直接書いてるアホなサンプルコードですが…(^^;
hasOpenError=falseの場合
ページ表示しても何も表示されません。
hasOpenError=trueの場合
ページ表示するとダイアログが出ます。動いたー!
補足
Twitterで@aoetkさんから「やり過ぎるとソースがカオスになるので注意です」とコメント頂きました。
確かに上記のような簡易サンプルはいいですが、複雑になった場合には、フロントのJavaScriptとバッキングビーンを追いかけるのが大変そうな感じがします(^^;
ということで、そういった辺りは注意しつつ、恩恵を受ける所は上手く使っていきたいと思います。
てか、これまた毎度ですが、有識者の方々的には「当たり前だがなー」って感じなんだろうなぁ、と思いつつ、意外とこういうところで詰まってる自分に力のなさを感じたりします。。Challengeあるのみ(^^;