Google が提供するジオコーディング サービスを使用する JavaScript メソッドを使用して、数行の入力データを処理し、その処理されたデータをバッキング Bean に配置しようとしています。
ユーザーには、アドレスの詳細を入力するログイン ページが表示されます。送信ボタンがクリックされるとすぐに、JavaScript メソッドを呼び出して住所のジオコーディングを試みます。このメソッドは、ユーザーが入力したデータを読み取り、ジオコード サービスに送信します。このサービスが完了するまでに数ミリ秒かかります。完了するとすぐに、ログイン ページのバッキング Bean で見つかったデータを保存したいと考えています。
次の JavaScript 関数は、住所のジオコーディングに使用されます。
function codeAddress() {
alert('coding address');
geocoder = new google.maps.Geocoder();
postcode = document.getElementById('loginForm:address').value;
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
alert('setting location: '+results[0].geometry.location);
document.getElementById('loginForm:location').value = results[0].geometry.location;
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
});
}
フォーム内に配置された非表示フィールドに値を格納します。これが最善の方法であるかどうかはわかりませんが、多くの例で見たことがあるだけです。このコンポーネントの値を設定すると、loginBean で対応するロケーション セッターが呼び出されると想定しています。
<h:inputHidden id="location" value="#{loginBean.location}" />
フォームの送信に使用されるボタンを使用して、これをすべて実現しようとしています。
<p:commandButton id="submitButton" value="login"
action="#{loginBean.doLogin}"
styleClass="blue login" update="growl">
<p:ajax event="click" onstart="codeAddress()" />
</p:commandButton>
私はこの構造について確信が持てないことを付け加えなければなりません。送信ボタンを押すと、おそらく ajax 呼び出しにチャンスさえ与えずに、次のページがすぐに読み込まれます。
これを達成しようとすると、いくつかの問題が発生しました。上記のコードを使用すると、JavaScript 関数は呼び出されません。簡単にするために、この関数をページ上部の script タグで宣言しました。2 番目の問題は、この値を JavaScript メソッドから loginBean に渡す最善の方法が不明であることです。フォーム内に隠しタグを配置し、その値タグを loginBean プロパティにリンクする必要がありますか? ajax コンポーネントにリスナーを追加する必要がありますか?