ショッピングサイトなどの住所欄に入力するときにいつも思うのですが、郵便番号を入力しているのだから、住所ぐらい検索して入れてほしいですよね。実際にそうなっているサイトもあります。
郵便番号のデータは日本郵便(旧郵政公社(旧旧郵政省))のウェブにCSVファイルの形式で置かれているので、誰でもダウンロードして使うことができます。このデータの中を見ると、
郵便番号を検索するZipSearch.jspは次のような感じです。「改行しないこと」とあるのは、返された文字列をそのまま住所フィールドに入れると余計な改行コードが入ってしまうからです。
http://www.orquesta.org/zipcode/ZipSearch.jsp?zip=9012424
のようなURLで呼び出すことができます。
ただ、この方法には1つ問題があって、郵便番号検索のページを他所のサイトから勝手に使うことができてしまうので、場合によっては対策が必要になるかも知れません。
サンプルページを作りました。適当に試してみてください。
http://www.orquesta.org/zipcode/Edit.jsp
郵便番号のデータは日本郵便(旧郵政公社(旧旧郵政省))のウェブに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が呼び出され、検索結果がテキストボックスに入ります。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;
}
}
}
<%@ 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が呼び出されるようにしています。<!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>
郵便番号を検索する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%>
このページは//上の行は改行しないこと
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
郵便番号検索のリンクをクリックすると
次のメッセージが出てしまい。検索できません。
なぜでしょうか。教えてください。
島村
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分
竹形です。こんにちは。
上記の記事ですが、サーバを移転したときにリンクが切れてしまっていました。
以下のリンクで試してみてください。
郵便番号の検索:
http://www.orquesta.org/takegata/zipcode/ZipSearch.jsp?zip=9012424
入力フォームの例:
http://www.orquesta.org/takegata/zipcode/Edit.jsp
上記の記事ですが、サーバを移転したときにリンクが切れてしまっていました。
以下のリンクで試してみてください。
郵便番号の検索:
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分