SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

Ajax4JSFを利用したデータ検証

フレームワークを活用したAjaxの導入

要求の送信

 アプリケーションを試すには、Ajax4JSFフレームワークを使用するJSF JSPページ「input.jsp」からAJAX要求を送信します。まずCatalog IDフィールドに<a4j:support/>要素を追加します。event属性にはAJAX要求を開始するイベントを指定し、action属性にはAJAX要求の送信時に呼び出すinputText_action()バッキングBeanメソッドを指定します。また、reRender属性を使ってAJAX応答で更新されるコンポーネントを指定します。Catalog IDフィールドのh:inputText要素は次のようになります。

<h:inputText binding="#{backing_input.inputText1}"
  id="inputText1">
  <a4j:support event="onkeyup" action=
    "#{backing_input.inputText_action}"
    reRender=
    "inputText2,inputText3,inputText4,inputText5,inputText6,
    commandButton1,outputText1" />
</h:inputText>

 Ajax4JSFコンポーネントライブラリを使用するには、次のtaglibディレクティブをJSF JSPページ「input.jsp」に追加します(全体のコードについてはリスト2を参照)。

<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" 
  prefix="a4j"%>

 コマンドボタンのクリックによりフォームが送信されるときにカタログエントリを作成するには、コマンドボタンにaction属性を追加して、コマンドボタンがクリックされたときにcommandButton_action()メソッドを呼び出します。コマンドボタンの要素は次のとおりです。

<h:commandButton value="Submit"
  binding="#{backing_input.commandButton1}" action=
  "#{backing_input.commandButton_action}"
  id="commandButton1"/>

 「catalog.jsp」を変更して、カタログエントリが作成されたことを伝えるメッセージを出力し、「error.jsp」を変更して、データベースの更新時にエラーが発生したことを伝えるメッセージを出力します。

 Catalog IDフィールドに入力された値は、データベーステーブルCatalogが配置されているサーバ側で検証されます。ID値がデータベースに既に存在する場合は、「Catalog Id is not valid」というメッセージが入力フォームに表示されます。これは、番号が既に存在するため、そのID値は新しいID番号として「有効でない」ことを意味します。Catalog IDフィールドの値がデータベースに存在しない場合は、「Catalog Id is valid」という検証メッセージが入力フォームに表示されます。有効なID値を判断するビジネスロジックは、サーバ側で指定できます。

 Catalog IDフィールドに値が指定されると、inputText_action()メソッドが呼び出されます。Catalog IDフィールドの内容を変更するたびに、つまり、新しい文字を入力するたびに、AJAX要求が送信されます。JDeveloperで設定されるOracleデータソースを使って、inputText_action()メソッドでOracleデータベースとの接続を確立します。

InitialContext initialContext = new InitialContext();
 javax.sql.DataSource ds = 
 (javax.sql.DataSource)initialContext.lookup(
 "java:comp/env/jdbc/OracleDBConnectionDS");
 java.sql.Connection connection = ds.getConnection();

 SQL文でStatementオブジェクトを実行します。

Statement stmt = connection.createStatement(
  ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

 フォームに指定されたCatalog ID値を取得し、SQLクエリを作成してOracleデータベースで実行できます。

String catalogID = (String)inputText1.getValue();
  String query = "SELECT * from Catalog WHERE CATALOGID=" + "'" + 
  catalogID + "'";

 SQLクエリを実行し、結果セットを取得します。

rs = stmt.executeQuery(query);

 結果セットが空でない場合は、検証メッセージを「Catalog Id is not valid」に設定し、フィールド値を設定し、コマンドボタンを無効にします。

if (rs.next()) {
  inputText2.setValue(rs.getString(2));
  inputText3.setValue(rs.getString(3));
  inputText4.setValue(rs.getString(4));
  inputText5.setValue(rs.getString(5));
  inputText6.setValue(rs.getString(6));
  outputText1.setValue(new String("Catalog Id is not Valid"));

  commandButton1.setDisabled(true);

}

 結果セットが空の場合、つまり、入力フォームに指定されたID値がデータベースに存在しない場合は、検証メッセージを「Catalog Id is valid」に設定し、フィールド値を空のStringに設定し、[Submit]ボタンを有効にします。

else {
  inputText2.setValue(new String());
  inputText3.setValue(new String());
  inputText4.setValue(new String());
  inputText5.setValue(new String());
  inputText6.setValue(new String());
  outputText1.setValue(new String("Catalog Id is Valid"));

  commandButton1.setDisabled(false);
}

 ID値が有効な場合、つまり、フィールドの値がデータベースに存在しない場合は、フォームフィールド値を取得し、データベースとの接続を確立し、新しいカタログエントリを作成します。

リスト2 input.jsp
<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
  <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; 
        charset=windows-1252"/>
      <title>input</title>
      <h3>Catalog Entry Form</h3>
    </head>
    <body><h:form binding="#{backing_input.form1}" id="form1">
      <h:panelGrid columns="2" binding=
        "#{backing_input.panelGrid1}" id="panelGrid1">
        <h:outputLabel value="Catalog ID"
          binding="#{backing_input.outputLabel1}"
          id="outputLabel1"/>
        <h:inputText binding="#{backing_input.inputText1}"
          id="inputText1">
          <a4j:support event="onkeyup" action=
            "#{backing_input.inputText_action}"
            reRender="inputText2,inputText3,inputText4,inputText5,
            inputText6,commandButton1,outputText1" />
        </h:inputText>
        <h:outputLabel value="Journal" binding=
          "#{backing_input.outputLabel2}" id="outputLabel2"/>
        <h:inputText binding="#{backing_input.inputText2}" 
          id="inputText2"/>
        <h:outputLabel value="Publisher"
          binding="#{backing_input.outputLabel3}"
          id="outputLabel3"/>
        <h:inputText binding="#{backing_input.inputText3}" 
          id="inputText3"/>
        <h:outputLabel value="Edition" binding=
          "#{backing_input.outputLabel4}"
          id="outputLabel4"/>
        <h:inputText binding="#{backing_input.inputText4}" 
          id="inputText4"/>
        <h:outputLabel value="Title" binding=
          "#{backing_input.outputLabel5}"
          id="outputLabel5"/>
        <h:inputText binding="#{backing_input.inputText5}" 
          id="inputText5"/>
        <h:outputLabel value="Author" binding=
          "#{backing_input.outputLabel6}"
          id="outputLabel6"/>
        <h:inputText binding="#{backing_input.inputText6}" 
          id="inputText6"/>
        <h:commandButton value="Submit"
          binding="#{backing_input.commandButton1}" action=
          "#{backing_input.commandButton_action}"
          id="commandButton1"/>
        <h:outputText  binding="#{backing_input.outputText1}"
          id="outputText1"/>
      </h:panelGrid>
    </h:form></body>
  </html>
</f:view>
<%-- oracle-jdev-comment:auto-binding-backing-bean-
  name:backing_input--%>

次のページ
バッキングBeanクラス

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

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

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

Deepak Vohra(Deepak Vohra)

O'Reillyの技術レビュー担当者として『WebLogic: The Definitive Guide』を担当。NuBeanコンサルタント、Web開発者でもある。Sun認定資格(Java 1.4プログラマおよびWebコンポーネントディベロッパJ2EEバージョン)を取得。メールの宛先はdvohra0...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1616 2007/08/24 14:00

イベント

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

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

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

メールバックナンバー