竹形誠司 ブログ
Java+MySQL+Tomcat    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
ウェブ画面上での郵便番号検索
by 竹形 誠司[takegata]
ショッピングサイトなどの住所欄に入力するときにいつも思うのですが、郵便番号を入力しているのだから、住所ぐらい検索して入れてほしいですよね。実際にそうなっているサイトもあります。

郵便番号のデータは日本郵便(旧郵政公社(旧旧郵政省))のウェブにCSVファイルの形式で置かれているので、誰でもダウンロードして使うことができます。このデータの中を見ると、
"北海道","札幌市中央区","南一条西(1〜19丁目)"
のような行もあるので、少し整形しないと使いづらいかも知れません。私は次のようなプログラムでデータベースに読み込ませています。
import java.sql.*;
import java.io.*;
class ZipToDb{

  public static void main(String[] args) throws Exception{
    if(args.length!=1){
      System.out.println("usage: java ZipToDb <filename>");
    }
    FileInputStream fis = new FileInputStream(args[0]);
    InputStreamReader isr = new InputStreamReader(fis,"Windows-31J");
    BufferedReader br = new BufferedReader(isr);
    int count=0;
    String str;
    String strLastZip="";
    String strZip="";

    Class.forName("com.mysql.jdbc.Driver");
    String strConn = "jdbc:mysql://localhost/"
      + "zip_db"
      +"?user=Mulder&password=TrustNo1"
      +"&useUnicode=true&characterEncoding=utf-8";
    Connection conn = DriverManager.getConnection(strConn);
    String strSql = "INSERT INTO zip_code(zip,pref,city,town) VALUES(?,?,?,?)";
    PreparedStatement pstmt = conn.prepareStatement(strSql);
    while⇒str = br.readLine(!=null){
      String[] aryLine = str.split(",");
      StringBuffer sb = new StringBuffer();
      strZip = aryLine[2].replaceAll("\\\"","");
      if(strZip.equals(strLastZip)){
        continue;
      }
      String strPref = aryLine[6].replaceAll("\\\"","");
      String strCity = aryLine[7].replaceAll("\\\"","");
      String strTown = aryLine[8].replaceAll("\\\"","");
      if(strTown.equals("以下に掲載がない場合")){
        continue;
      }
      int p = strTown.indexOf("(");
      if(p!=-1){
        strTown=strTown.substring(0,p);
      }
      p = strTown.indexOf("、");
      if(p!=-1){
        strTown=strTown.substring(0,p);
      }
      p = strTown.indexOf("〜");
      if(p!=-1){
        strTown=strTown.substring(0,p);
      }
      if(strZip.length()!=7){
        throw new Exception("wrong zip code:" + strZip);
      }

      if(strPref.length()>5){
        throw new Exception("wrong pref:" + strPref);
      }

      if(strCity.length()>10){
        throw new Exception("too long city:" + strCity);
      }

      if(strTown.length()>36){
        throw new Exception("too long town:" + strTown);
      }
      count++;
      sb.append(count).append(":")
        .append(strZip).append(",")
        .append(strPref).append(",")
        .append(strCity).append(",")
        .append(strTown);
      System.out.println(sb.toString());
      pstmt.setString(1,strZip);
      pstmt.setString(2,strPref);
      pstmt.setString(3,strCity);
      pstmt.setString(4,strTown);
      try{
        pstmt.executeUpdate();
      }catch(SQLException e){
        if(e.getErrorCode()==1062){
          Statement stmt= conn.createStatement();
          stmt.executeUpdate("UPDATE zip_code SET town='' WHERE zip=" + strZip);
        }else{
          throw e;
        }
      }
      strLastZip=strZip;
    }
  }

}
住所の入力ページは次のような感じです。[住所検索]ボタンをクリックするとZipSearch.jspが呼び出され、検索結果がテキストボックスに入ります。
<%@ page contentType="text/html; charset=utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD><TITLE>郵便番号検索</TITLE>
<SCRIPT TYPE="text/javascript">
function funcZipSearch(){
  strZip=document.form1.zip.value;
  if(window.XMLHttpRequest){
    req = new XMLHttpRequest();
  }else if(window.ActiveXObject){
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
  }
  req.onreadystatechange = funcDispAddress;
  url = "http://localhost:8080/test/zipcode/ZipSearch.jsp?zip=" + strZip;
  //urlは実際にZipSearch.jspにアクセス可能なURLを指定
  req.open('GET', url, true);
  req.send("");
}

function funcDispAddress(){
  if (req.readyState == 4) {
    if (req.status == 200) {
      document.form1.address1.value=strZip=req.responseText;
    }
  }
}
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="form1">
郵便番号:
<INPUT TYPE="text" NAME="zip" STYLE="width:60px;">
<INPUT TYPE="button" VALUE="住所検索" ONCLICK="funcZipSearch()"><BR>
住所:
<INPUT TYPE="text" NAME="address1" STYLE="width:200px;">
</FORM>
</BODY>
</HTML>
上のコードではJavaScriptの非同期通信を使ってページを更新せずにテキストボックスにデータを挿入しています。req というオブジェクトはWebサーバにリクエストを送るためのもので、サーバからレスポンスが帰ってきたときにfuncDispAddressが呼び出されるようにしています。

郵便番号を検索するZipSearch.jspは次のような感じです。「改行しないこと」とあるのは、返された文字列をそのまま住所フィールドに入れると余計な改行コードが入ってしまうからです。
<%@ page contentType="text/html; charset=utf-8"%><%@ page import = "java.sql.*,jp.veltec.erp.*"%><%
//上の行は改行しないこと
String strZip=request.getParameter("zip");
String strAddress="該当なし";
if(strZip!=null){
  strZip=strZip.replaceAll("-","");
  Class.forName("com.mysql.jdbc.Driver");
  String strConn = "jdbc:mysql://localhost/zip_db"
    +"?user=Mulder&password=TrustNo1"
    +"&useUnicode=true&characterEncoding=utf-8";
  Connection conn = DriverManager.getConnection(strConn);
  Statement stmt = conn.createStatement();
  String strSql = "SELECT * FROM zip_code WHERE zip=" + strZip;
  ResultSet rs = stmt.executeQuery(strSql);
  if(rs.next()){
    strAddress = rs.getString("pref")+rs.getString("city")+rs.getString("town");
  }
  rs.close();
  stmt.close();
  conn.close();
}
//下の行は改行しないこと
%><%=strAddress%>
このページは
http://www.orquesta.org/zipcode/ZipSearch.jsp?zip=9012424
のようなURLで呼び出すことができます。

ただ、この方法には1つ問題があって、郵便番号検索のページを他所のサイトから勝手に使うことができてしまうので、場合によっては対策が必要になるかも知れません。

サンプルページを作りました。適当に試してみてください。
http://www.orquesta.org/zipcode/Edit.jsp
投稿:竹形 誠司[takegata]/2009年 02月 20日 01時 49分 /更新:2009年 02月 20日 02時 53分
RE:ウェブ画面上での郵便番号検索
by m.shimamura[mshima99jp]
すみません。
郵便番号検索のリンクをクリックすると
次のメッセージが出てしまい。検索できません。
なぜでしょうか。教えてください。

島村

HTTPステータス 404 - /zipcode/Edit.jsp

--------------------------------------------------------------------------------

type ステータスレポート

メッセージ /zipcode/Edit.jsp

説明 The requested resource (/zipcode/Edit.jsp) is not available.


--------------------------------------------------------------------------------

Apache Tomcat/6.0.18
投稿:m.shimamura[mshima99jp]/2011年 04月 11日 17時 44分 /更新:2011年 04月 11日 17時 46分
RE:ウェブ画面上での郵便番号検索
by 竹形 誠司[takegata]
竹形です。こんにちは。
上記の記事ですが、サーバを移転したときにリンクが切れてしまっていました。
以下のリンクで試してみてください。

郵便番号の検索:
http://www.orquesta.org/takegata/zipcode/ZipSearch.jsp?zip=9012424

入力フォームの例:
http://www.orquesta.org/takegata/zipcode/Edit.jsp

投稿:竹形 誠司[takegata]/2011年 04月 12日 11時 32分 /更新:2011年 04月 12日 11時 33分