skillup

技術ブログ

Java JavaScript

JSF+ajax

投稿日:2015年9月5日 更新日:

JSFでajaxを使うときにいろいろと調べたのでメモ。

やろうとしたことはWEB上で給与明細の計算をしたくて、プルダウンで月の変更したら自動的に経費が該当月に替わるというシステムです。

ajaxを使うときの考え方ですが、基本的には

  1. トリガー
  2. 送信コンポーネント
  3. メソッド
  4. レンダー

に注意します。

1.トリガー

ようはどのイベントが起こった時に通信が発生するかという起点になる動きのことです。

<f:ajax>の部分がajaxのタグを記述する場所になります。

ソースは該当月の部分のみです。

このeventとという部分がトリガーになります。今回はプルダウンを変更したら~という設定にしてあります。

トリガーとなるイベントは通常のJavaScriptのイベントであれば大体大丈夫かと思います。

2.送信コンポーネント

次はトリガーが起こった時にどのデータをCDI側に送るかです。executeで指定します。

今回は該当月のみ(自分自身)なので@thisとしてありますが、下記のような送信方法があります。

  • 全体・・@all
  • form内全体・・@form
  • 送らない・・@none
  • 自分自身・・@this
  • idの場合にはexecute=”sample_id sample_id2″などスペースを空けて指定。

3.メソッド

listenerに記述。ここでCDIのメソッドを呼ぶことができます。

またAjaxを使うときはスコープをRequestではなくViewにしたほうがよいでしょう。

RequestだとイベントのたびにCDIが初期化されますがViewであれば該当メソッドだけ呼ばれるため、その分処理が速くなります。

4.レンダー

ここがJSFのポイントなんですが、CDIのプロパティが変わっても自動的に画面側の値は変わりません!

どの値をレンダリングさせるか?ということを指定してあげないといけないんですね。

これで結構時間食いました。CDIの値がしっかり変わっているのに画面の値が変わらない・・・

どの値を反映させるかがrenderになります。

ちなみに指定方法はexecuteと同じになります。

番外

ajax反映後のjquery

給与明細には経費の詳細を見れるようにボタンにトリガーを付けておいたのですが、ajax反映後変化しないというバグが起こりました。

そういえば昔、ajaxで追加したテーブルはjqueryが起動しませんでしたね・・・

解決手段ですが、下記のように記述しておけば無事起動します。

下記リンクを参考にしました。

jQueryで後から追加した要素へのclickイベントはonを使う

追記

ちなみにajaxはクロスドメイン(ドメインが違うもの)のものを読み込んだり、アクセスしたりはできません。

jqueryを外部のURLから読み込んだ時にこの問題が起きるので注意しましょう。(ブラウザのコンソール機能でみるとわかりやすい。)

続 クロスドメインで使う XMLHttpRequest と CORS の話
AjaxでAccess-Control-Allow-Originのエラーを回避する方法

-Java, JavaScript
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

型パラメータに関して

Javaでの型パラメータについて書きたいと思います。 Contents1 基本の型パラメータ2 型パラメータの制限(ある型を継承した場合) 基本の型パラメータ Sample.java [crayon- …

no image

クリック編集のjQuery

最近のWEBサービスだと表示の画面と編集画面が同じになっていて、一見表示なんだけど、クリックすると特定の項目は編集できる、そんな画面がふえていきていますよね。 先日社内アプリをつくっていたところ、そう …

no image

リフレクション

前回のエントリーでは動的にクラスを使いまわす方法について書いたのですが、同様にリフレクション(動的にインスタンスを生成する方法)という技術についても学びました。 社長いわく黒魔術みたいなものといってい …

no image

vueのコンポーネント化

vueの記事をポツポツ上げてきましたが、コンポーネント化した書き方に関して。 既存のvueの記事 Vue.jsについて vueの環境構築 今まではCDNで読み込んだり、HTMLの中に直接vueを入れて …

no image

requirejsでのモジュール読み込み

JavaScriptのモジュール化では2019年5月現在ではwebpackなどを使うことが一般的かと思いますが、以前はrequire.jsなどというライブラリがあったようです。 例えば下記のようなファ …