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

vueの環境構築

vueについて勉強したことなどを。 Contents1 vueとは?1.1 方法1 CDN1.2 方法2 npm+コンパイル vueとは? 近年のJavaScriptフレームワークの一種で「双方向デー …

no image

JavaSEでのCDI

以前、JavaSEでもCDIを使ってみたい!と思ったのですが、以前は探し方が悪かったのか情報を見つけ出すことができませんでした。 が、昨日ちょっと検索したらちょっと情報があり、無事実装できたのでメモし …

no image

URLパターンマッピング

JavaEEではURLのマッピングについて結構悩んだんですが、サーブレットは案外簡単ですね。 web.xmlで設定することもできるようですが、アノテーションで設定することもできるようです。 例えば s …

no image

mavenのリモートリポジトリについて

JPAでO/Rマッパーに慣れてからというもの通常のSQLをごりごり書くのが億劫になってきました。 億劫というかいろいろとリスクがありますね。 問題点としてはコンパイルするときにエラーが検知できなかった …

no image

bootstrapでのJavaScriptエラーチェック

お問い合わせフォームの入力チェックというのは本来サーバーサイド側でやらなくてはいけないのですが、JavaScriptによってクライアント側でやることも可能です。 入力欄にフォーカスして、遷移したときに …

アーカイブ