SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Java EE 6 開発入門

JSF2の画面でAjaxの非同期通信を作る

JavaEE6 開発入門(4)


ダウンロード SampleWebApp.zip (26.7 KB)

 ここまでの変更が完了したら、一度ブラウザを落とし、GlassFishを再起動してから再び、http://localhost:8080/SampleWebApp/faces/ajaxsamplejsf.xhtmlを開いて、値を入力して送信してみましょう。すると、次のような画面が表示されます。

図10 変更後のFacelet表示画面
図10 変更後のFacelet表示画面

 これで送受信の仕組みは完了していますが、実はこの結果はAjax通信をしたものではなく、画面がリフレッシュされた結果になっているのです。その証拠に、パスワード欄が空欄になっています。これはHTMLの仕様で、パスワード欄の再表示は行わないことになっているからです。

 では、Ajax機能を盛りこんでみましょう。これは非常に簡単で、ManagedBeanは一切修正しません。

[リスト7]Ajax機能をつけたajaxsamplejsf.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"  …①
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>JSF+Ajaxサンプル</title>
        <script type="text/javascript"> …②
        <!--
            function success(event){
                //Ajaxイベント送信が発生するごとに起動する。
                //送信成功~サーバからの応答後の処理で利用する。
                alert("Success. " + event.status);
            }

            function failure(event){
                //Ajax送信に失敗した場合に出力される。
                //サーバからのエラーもここに出力されるので
                //サーバのデバッグ情報と共に参考にするとよい。
                alert("Error. " + event.status);
            }
        //-->
        </script>
    </h:head>
    <h:body>
        <h:form id="form1">
            名前<h:inputText id="username" value="#{user.username}">
            </h:inputText>
            <br />
            パスワード<h:inputSecret id="password" value="#{user.password}"></h:inputSecret><br />
            <hr></hr>
            <h:commandButton id="sender" action="#{user.action}" value="送信する">
                <f:ajax execute="form1" onevent="success" oneerror="failure" render="result" /> …③
            </h:commandButton>
            <h:outputText id="result" value="#{user.result}"></h:outputText>
        </h:form>
    </h:body>
</html>

 追記したのは3箇所です。まずは<f:ajax>タグを使うための宣言を追加するため、1の記述を追加します。宣言が完了したら、送信ボタンにて「ajax通信を行う」ように指示を出すため、3の記述をボタンに対して行います。上記の例でも、送信ボタンである<h:commandButton>の子要素として、<f:ajax>を挿入しています。

 <f:ajax>で指定している内容について説明します。

表2 <f:ajax>の基本属性一覧
属性名 処理概要
execute サーバへ送信する要素のid。複数指定する場合は半角スペース区切りで記述する。親要素を選ぶと、その子要素も送信される
onevent Ajaxの送受信を検知するたびに呼ばれるJavaScriptのメソッド名。begin(送信処理の開始)、complete(サーバでの処理完了)、success(XHTMLへの表示完了)の3つのステータスでハンドリングできる
onerror Ajaxの送受信で何らかのエラーを検知した場合に呼ばれるJavaScriptのメソッド名
render サーバからの受信結果を表示するタグのid

 この4つのうち、executeとrenderは指定しておきます。今回のサンプルでは、JavaScriptが起動されてメッセージの受信まで正しく完了したことを通知するよう、oneventやonerrorで起動するJavaScriptを指定し(リスト2部分)、ダイアログを表示しています。

 実際に動かしてみた状態は以下のようになります。

図11 Ajax導入後のFacelet表示画面(送信完了)
図11 Ajax導入後のFacelet表示画面(送信完了)
図12 Ajax導入後のFacelet表示画面(表示まで完了)
図12 Ajax導入後のFacelet表示画面(表示まで完了)

 画面を確認してみましょう。確かにパスワードの内容はリフレッシュされていません。メッセージの部分のみ動的に更新していることになります。

 これでAjaxを使った入出力の機能はひと通りできるようになりました。

 以上、JSF2とManagedBeanを使って簡単な入力画面を作るところまで紹介しました。サーブレットを使うことなく、またAjaxを利用するまでに数行の設定を追加するだけで使うことができることがご理解いただけかと思います。

まとめ

 今回はAjaxを利用したFacelets取り上げました。次回は今回の続きで、入力チェック機能の追加と、Faceletsが生成するJavaScriptの動作についても解説します。

参考文献

修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Java EE 6 開発入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6050 2011/11/02 17:21

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー