pirkak公式サイト|株式会社 オリエンタルアーツ
HOMEpirka TOP > サンプル集
pirka サンプル集

> 戻る

Ajaxを使ったマスタデータ取得方法


≪サンプル説明≫  

郵便番号フィールドに郵便番号を入力しタブキー等で郵便番号フィールドから
フォーカスが離れると住所フィールドに郵便番号に対応する住所が表示されます。
このときサブミットを行わない非同期通信でWEBサーバ上のデータを検索し住所を取得しています。


≪作成時注意点≫ 

・pirkaは標準でAjaxをサポートしているためサブミット無しでWEBサーバーとの
 同期/非同期通信を行うことが可能です。
 
・実行時のブラウザの設定はJavaScriptが有効でなければ正しく動作しません。

・Ajaxを使用するにはAjaxScriptオブジェクトを作成します。
 AjaxScriptオブジェクトはAjaxScriptクラスから派生させたクラスより作成してください。
 
 派生したクラスはWEBブラウザから同期/非同期で送信されるデータを受信
 したときに動作し処理を行うrunメソッドを実装してください。
 
 runメソッドではブラウザーから送信されるデータを引数として取得し、ブラウザーへ
 戻すレスポンスとしてResponseDataオブジェクトを戻します。
 
  【例】AjaxScriptのオブジェクトを無名クラスとして作成
     引数の郵便番号(zipCode)から住所を検索し、検索された値をレスポンスデータのadrsとして戻す
 
  AjaxScript script2 = new AjaxScript() {
  public ResponseData run(Map<String, String[]> param) {
  // 郵便番号から住所を検索しセットレスポンスにセット
  ResponseData responseData = new ResponseData();
  String[] zipCode = param.get("zipCode");
  if (zipCode != null && zipCode.length > 0) {
  responseData.put("adrs", AjaxZipDB.getAdrs(zipCode[0]));
  } else {
  responseData.put("adrs", "");
  }
  return responseData;
  }
  };
 
・AjaxScriptオブジェクトはブラウザー側で動作する処理を登録することができます。
 通信前に動作する処理はaddPreScriptメソッド、通信後はaddResScriptメソッド、
 エラー時はaddErrScriptメソッドを使用して登録を行います。
 
 登録できる処理はJavaScriptのラッパーオブジェクトであり、複数登録することも可能です。
 以下は定義済みJavaScriptのラッパークラスです。
 
  1) JavaScriptAlert アラート(メッセージボックス)を表示
  2) JavaScriptElementById HTML上のID属性で指定されるオブジェクトの任意のプロパティにデータをセット
  3) JavaScriptInnerHTML HTML上のID属性で指定されるオブジェクトのinnerHTMLプロパティにデータをセット
  4) JavaScriptInnerText HTML上のID属性で指定されるオブジェクトのinnerTextプロパティにデータをセット
  5) JavaScriptSource 指定された文字列をJavaScriptとして動作させる
  6) JavaScriptSrc HTML上のID属性で指定されるオブジェクトのsrcプロパティにデータをセット
  7) JavaScriptValue HTML上のID属性で指定されるオブジェクトのvalueプロパティにデータをセット
   
  【例】サーバー呼び出し前にID=smarkに"★"をセット
  script2.addPreScript(new JavaScriptInnerHTML("smark", "★"));
 
  【例】サーバーからレスポンスが戻された後にID=smarkに"☆"をセットし、ID=adrsにレスポンスデータのadrsを
     セットする
  script2.addResScript(new JavaScriptInnerHTML("smark", "☆"));
  script2.addResScript(new JavaScriptValue("adrs", new ResponseName("adrs")));
 
  【例】サーバーと通信がエラーとなったときに通信エラーのアラートを表示
  script2.addErrScript(new JavaScriptAlert("通信エラー"));
 
 
  ・作成したAjaxScriptオブジェクトをコンストラクタ等でSCRITPタグへsetAjaxScriptメソッドを使用して
   セットします。
 
  【例】HTML
    <script name="ajaxTest02" type="text/javascript"></script>
 
  【例】Java  
    field.setAjaxScript("ajaxTest02", script2);
 
・AjaxScriptオブジェクトはブラウザに送られるHTML内では以下の
 functionとして自動挿入されます。
 通信が必要な何らかのイベント時発生時に上記ファンクションをJavaScriptで呼び出してください。
 
  function scriptName(async, data);
 
  scriptName : SCRIPTタグのname属性の値(名前)
  async : trueのときは非同期通信、falseの時は同期通信
  data : プロパティ名とその値で構成されるオブジェクト(JSON:JavaScript Object Notation)
  であり、WEBサーバーに送信されAjaxScriptオブジェクトのrunメソッドの引数となる
 
・またOnEventJavaScript#getSourceメソッドを使用しJavaScriptの記述なしでAjax用のファンクションを
 呼び出すこともできます。
 
  【例】zipCodeフィールドのonChange属性に自フィールド値をzipCodeとしてajaxTest02を
     呼び出すJavascriptコードを設定
 
  field.setOption( "zipCode", "onChange",
  OnEventJavaScript.getSource( "ajaxTest02", true, new RequestData("zipCode")));



ソースファイル
AjaxGetMstData.html  サンプル画面のHTMLファイル

<html>
<head>
<head>
<title>pirka逆引きサンプル Ajaxを使ったマスタデータ取得方法</title>
<script name="ajaxScript" type="text/javascript"></script>
</head>
<body>
<center>
<span style="color: #8080ff">pirka逆引きサンプル Ajaxを使ったマスタデータ取得方法</span><br>
<hr>
<br>
<form name="testForm" method="post">
<table>
<tr>
<td>氏名</td>
<td><input type="text" name="name" size="50"></td>
</tr>
<tr>
<td>郵便番号<span style="color: #c0c000" id="smark">☆</span></td>
<td><input type="text" name="zipCode" size="10" maxlength="8">(東京、埼玉、神奈川は自動検索されます)</td>
</tr>
<tr>
<td>住所</td>
<td><textarea name="adrs" id="adrs" warp="soft" rows="5" cols="50"></textarea></td>
</tr>
<tr>
<td><input type="submit" name="execButton" value="登録">
<input type="submit" name="returnButton" value="戻る"><Br>
</td>
<td></td>
</tr>
</table>
</form>
</center>
</body>
</html>



AjaxGetMstData.java  サンプル画面のJavaソースファイル

package jp.oarts.pirka.sample.instruction.is102900;

import java.util.Map;

import jp.oarts.pirka.core.ajax.AjaxScript;
import jp.oarts.pirka.core.ajax.JavaScriptAlert;
import jp.oarts.pirka.core.ajax.JavaScriptInnerHTML;
import jp.oarts.pirka.core.ajax.JavaScriptValue;
import jp.oarts.pirka.core.ajax.OnEventJavaScript;
import jp.oarts.pirka.core.ajax.RequestData;
import jp.oarts.pirka.core.ajax.ResponseData;
import jp.oarts.pirka.core.ajax.ResponseName;
import jp.oarts.pirka.core.kernel.FieldMap;
import jp.oarts.pirka.core.win.PirkaWindow;

/**
* pirka逆引きサンプル Ajaxを使ったマスタデータ取得方法
*/
public class AjaxGetMstData extends PirkaWindow {

/**
* コンストラクタ
*/
public AjaxGetMstData() {
FieldMap field = getFieldMap();

// AjaxJavaScriptオブジェクト作成
AjaxScript script = new AjaxScript() {

// JavascriptよりXMLHttpRequestで呼ばれたときに動作するメソッド
@Override
public ResponseData run(Map<String, String[]> param) {
// 郵便番号から住所を検索しセットレスポンスにセット
ResponseData responseData = new ResponseData();
String[] zipCode = param.get("zipCode");
if (zipCode != null && zipCode.length > 0) {
responseData.put("adrs", ZipDB.getAdrs(zipCode[0]));
} else {
responseData.put("adrs", "");
}
return responseData;
}
};

// サーバー呼び出し前にID=smarkに"★"をセットするJavascriptを追加
script.addPreScript(new JavaScriptInnerHTML("smark", "★"));

// サーバーからレスポンスが戻された後にID=smarkに"☆"をセットするJavascriptを追加
script.addResScript(new JavaScriptInnerHTML("smark", "☆"));

// サーバーからレスポンスが戻された後にID=adrsにレスポンスデータのadrsをセットするJavascriptを追加
script.addResScript(new JavaScriptValue("adrs", new ResponseName("adrs")));

// サーバーと通信がエラーとなったときに通信エラーのアラートを表示するJavascriptを追加
script.addErrScript(new JavaScriptAlert("通信エラー"));

// ajaxTest02フィールドに上記で作成したAjaxJavaScriptオブジェクトをセット
field.setAjaxScript("ajaxScript", script);

// zipCodeフィールドのonChange属性に自フィールド値をzipCodeとしてajaxScriptを呼び出すJavascriptコードを設定
field.setOption("zipCode", "onChange", OnEventJavaScript.getSource("ajaxScript", true, new RequestData("zipCode")));
}

/**
* 登録ボタンが押された時の処理<BR>
* 全フィールドクリア
*/
public void execButton() {
FieldMap field = getFieldMap();
field.setValue("name", "");
field.setValue("zipCode", "");
field.setValue("adrs", "");
}

/**
* 戻るボタンが押された時の処理<BR>
*/
public PirkaWindow returnButton() {
return null;
}

}

ZipDB.java  サンプル用郵便番号データベースのJavaソースファイル

package jp.oarts.pirka.sample.instruction.is102900;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
* サンプル用郵便番号データベース
*/
public class ZipDB {

/** 郵便番号マップ */
private static Map<String, String> zipMap;

/** 郵便番号3桁マップ */
private static Map<String, TreeMap<String, String>> zipMap3;

static {
zipMap = new HashMap<String, String>();
zipMap3 = new TreeMap<String, TreeMap<String, String>>();
setDataS(zipMap);
setDataT(zipMap);
setDataK(zipMap);

for(String code : zipMap.keySet()){
String code3=code.substring(0,3);
TreeMap<String, String> subMap=zipMap3.get(code3);
if(subMap==null){
subMap=new TreeMap<String, String>();
zipMap3.put(code3, subMap);
}

subMap.put(code, zipMap.get(code));
}
}

/**
* 郵便番号より住所を検索する<b>
* @param zipCode 郵便番号
* @return 住所 ただし、対応する住所が無い時はnull
*/
public static String getAdrs(String zipCode) {
if (zipCode == null) {
return "";
}

StringBuilder sb= new StringBuilder();
for(char c : zipCode.toCharArray()){
if(c>='0' && c<='9'){
sb.append(c);
}
}

String adrs = zipMap.get(sb.toString());
if (adrs == null) {
return "";
}
return adrs;
}

/**
* 郵便番号頭3桁より該当する住所マップを作成する<b>
* @param code3 郵便番号頭3桁
* @return 住所マップ
*/
public static TreeMap<String, String> getCode3Map(String code3){
return zipMap3.get(code3);
}

// 以下テストデータ ////////////////////////////////////////////////////////////

private static void setDataS(Map<String, String>zipMap){
zipMap.put("3310000", "埼玉県さいたま市西区");
zipMap.put("3310058", "埼玉県さいたま市西区飯田");



zipMap.put("3430113", "埼玉県北葛飾郡松伏町ゆめみ野");
zipMap.put("3430114", "埼玉県北葛飾郡松伏町ゆめみ野東");
}

private static void setDataT(Map<String, String>zipMap){
zipMap.put("1000000", "東京都千代田区");
zipMap.put("1020072", "東京都千代田区飯田橋");



zipMap.put("1002101", "東京都小笠原村父島");
zipMap.put("1002211", "東京都小笠原村母島");
}

private static void setDataK(Map<String, String>zipMap){
zipMap.put("2300000", "神奈川県横浜市鶴見区");
zipMap.put("2300033", "神奈川県横浜市鶴見区朝日町");



zipMap.put("2430112", "神奈川県愛甲郡清川村煤ケ谷(その他)");
zipMap.put("2430111", "神奈川県愛甲郡清川村宮ケ瀬");
}

}

ページのTOPへ このページの先頭へ
oriental arts pirka