グーグルのCloud SQLサイトには、JSPを使用したサンプルプログラムがありますが、ここでは図22のようなjQueryの非同期通信を使用したMVCモデル構成のサンプルを見ていきます。
このサンプルではJavaBeansからCloud SQLでDBをアクセスしているので、JavaBeansから見ていきたいところですが、アクセスの順序を優先して、view機能に対応するWebクライアント(HTML+JavaScript)から見ていきます。この部分は普通のjQueryを使用した非同期通信なので簡単に見ていきます。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>App Engine Cloud SQL 社員情報登録</title>
<script type="text/javascript" src="../jslib/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
$(function(){
var query = {};
$("#add").click(function(){ //(1)
query["mode"] = "add_hdr";
query["emp_no"] = $("#emp_no").val();
query["emp_name"] = $("#emp_name").val();
query["depart"] = $("#depart").val();
query["section"] = $("#section").val();
$.post("/hrsvlt", query, function(res){ //(2)
$("#status").text(res);
});
});
});
</script>
</head>
<body>
<table width="340" border="1" cellpadding="0" bgcolor="#eeeeff">
<caption>App Engine Cloud SQL 社員マスタ管理</caption>
<tbody>
<tr height="24">
<th colspan="2">
社員マスタ登録 <input type="button" id="add" value=" 登録 " />
</th>
</tr>
<tr height="24"><th>ステータス</th><td id="status"> </td></tr>
<tr>
<th width="110">社員番号</th>
<td><input type="text" size="8" id="emp_no"/></td>
</tr>
<tr><th>社員氏名</th><td><input type="text" id="emp_name"/></td></tr>
<tr><th>所属部</th><td><input type="text" size="30" id="depart"/></td></tr>
<tr><th>所属課</th><td><input type="text" size="30" id="section"/></td></tr>
</tbody>
</table>
</body>
</html>
リスト1のaddEmpHdr.htmは社員情報(社員番号、氏名、部、課)を登録する画面ですが、jQueryを使用しています。データ入力後「登録」ボタンをクリックすると(1)の匿名関数が呼び出され、連想配列「query」にセットされた社員情報が(2)の「$.post」でサーブレットに送信されます。
package com.business;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
@SuppressWarnings("serial")
public class hrSvlt extends HttpServlet {
@Override
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
//参照系処理
}
@Override
public void doPost (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
req.setCharacterEncoding("utf-8");
res.setContentType("text/html; charset=utf-8");
PrintWriter out;
out = res.getWriter();
String resp = "";
String mode = req.getParameter("mode"); //(1)
String emp_no = req.getParameter("emp_no");
String emp_name = req.getParameter("emp_name");
String depart = req.getParameter("depart");
String section = req.getParameter("section");
hrBean hr = new hrBean();
if(mode.equals("add_hdr")){
resp = hr.addEmpHdr(emp_no, emp_name, depart, section); //(2)
}else if(mode.equals("upd_hdr")){
resp = hr.updEmpHdr(emp_no, emp_name, depart, section);
}else if(mode.equals("del_hdr")){
resp = hr.delEmpHdr(emp_no);
}
out.println(resp);
out.flush();
out.close();
}
}
jQueryの「$.post」で送信されたリクエストはリスト2のサーブレット「hrSvlt」が受け取ります。サーブレットではリクエストを受け取ると、「doPost」メソッドが呼ばれます。そして、(1)の送信パラメータ「mode」の値から、(2)のようにJava Beansの「addEmpHdr」メソッドが呼び出されます。
package com.business;
import java.text.*;
import java.io.*;
import java.io.IOException;
import java.util.Date;
import java.sql.*;
import com.google.appengine.api.rdbms.AppEngineDriver;
public class hrBean {
String user = "user1";
String pass = "pass1";
Connection con = null;
public hrBean(){
try{
DriverManager.registerDriver(new AppEngineDriver()); //(1)
con = DriverManager.getConnection("jdbc:google:rdbms://branecosmology:business/business", user, pass);
//(2)
} catch (Exception e) {
Return;
}
}
public String addEmpHdr(String emp_no,
String emp_name,
String depart,
String section){
Date now = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String ent_date = df.format(now);
try{
String sql = "insert into emp_hdr values( ?, ?, ?, ?, ?)"; //(3)
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, emp_no);
ps.setString(2, emp_name);
ps.setString(3, depart);
ps.setString(4, section);
ps.setString(5, ent_date);
ps.executeUpdate();
return "OK:登録成功 顧客ID:" + emp_no;
}catch(SQLException e) {
return "NO:登録不成功 SQエラー:" + e;
}
}
リスト3のhrBeanでCloud SQLでの従業員情報を登録しています。筆者の場合はLinux環境で動作していたプログラムをベースに使用していますが、修正したのはコンストラクタの部分だけです。
(1)ではCloud SQL用に用意されたドライバを「DriverManager」に登録してます。(2)では、「getConnection」の第1引数で指定されたDBのURLへの接続を確立しています。第2、第3引数は接続するDBユーザーのユーザー名とパスワードを指定しています。
登録処理は(3)のように動的SQLで行っていますが、これは、Linux環境で動作していたコード記述そのままで、変更はしていません。このように、Cloud SQLを使用する場合、特にオンプレミスからの移行を想定した場合、最初の設定さえしてしまえば、プログラムの修正はごくわずかで済んでしまいます。
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>hrsvlt</servlet-name>
<servlet-class>com.business.hrSvlt</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hrsvlt</servlet-name>
<url-pattern>/hrsvlt</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
</web-app>
web.xmlの記述は、GAEでの標準の記述スタイルですから、これまでGAEでプログラム作成経験のある方でしたら問題ないでしょう。また経験のない方もWebアプリケーションのweb.xml記述を参考にしてもらえれば問題ないはずです。
作成したサンプルのローカル実行では、XAMPPでMySQLサーバを起動した後、前に紹介したXAMPPのインスタンスを設定し、EclipseでCloud SQLプログラムを実行します。
XAMPPでの準備は簡単です。図12のControl Paneで、ApacheとMySQLの[Start]ボタンをクリックして、図13の状態になれば完了です。
これでローカル環境での設定は完了なのでプログラムを実行できますが、プログラムは、その都度ポート番号を変えて実行することをお勧めします。これは、毎回デフォルトの同じポート番号で実行すると、プログラムの修正が反映されない場合があるからです。
この設定は最初の実行時だけ行えばOKです。まず、該当プロジェクトを右クリックして[Run As]→[Run Configuration]と進みます。[サーバ]のタグを選択して図23のように、[Automatically select an unused port]をチェックして[Apply]→[Run]で実行を開始します。
実行により、図24の画面になるので、画面から登録処理ができることを確認します。
Eclipse環境でのテスト・デバッグが終わったら、次はクラウド環境です。Cloud SQLにはインポート機能があり、Eclipse環境で登録したXAMPPのデータ、またはオンプレミスのデータをエクスポートしてCloud SQLのテーブルに登録できます。
XAMPPからエクスポートする場合手順は簡単です。左ペインからテーブルを選択してタブメニューから[エクスポート]を選択し、後は[実行する]のボタンをクリックするだけです。
Google APIs Consoleにはインポート機能がありますが、ここではSQL Prompt画面からXAMPPでエクスポートされたINSERT文をそのまま実行してデータを登録します。
最後に、クラウド環境へのアップロードと実行ですが、この部分はこれまでのGAEでの手順とまったく同じですので、GAEの経験ある方は問題ないはずです。
初めての方は、記事「EclipseでJava版App Engineを始めるための基礎知識」の「GAEクラウド環境でアプリを実行するには?」を参照してください。
今回のサンプルは、ローカル環境で作成されたデータをCloud SQLにインポートする必要はないサンプルでしたが、後編では、マスタデータのエクスポート・インポートが有効になるサンプルを紹介します。
GAEが業務系や基幹系ではあまり使われていない理由として、「NoSQLのBigtableが、あまりこの分野には合っていない」という問題がありましたが、今回のCloud SQLの公開は、特に中小企業の業務・基幹系でGAEを使用する道を開くのではないでしょうか。
後編は、この点に注目し、基幹系でのCloud SQL利用のサンプルを紹介する予定です。
Copyright © ITmedia, Inc. All Rights Reserved.