要求の送信
アプリケーションを試すには、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値が有効な場合、つまり、フィールドの値がデータベースに存在しない場合は、フォームフィールド値を取得し、データベースとの接続を確立し、新しいカタログエントリを作成します。
<%@ 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--%>
