サーブレット側の処理
package com.business; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; @SuppressWarnings("serial") public class bomSvlt extends HttpServlet{ @Override public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ String rv = ""; req.setCharacterEncoding("utf-8"); res.setContentType("text/html; charset=utf-8"); PrintWriter out; out = res.getWriter(); String mode = req.getParameter("mode"); //(1) bomBean bom = new bomBean(); //ビーンスインスタンスの生成 if(mode.equals("getfinal_j")){ //(2) rv = bom.getFinal_j(); //完成品 }else if(mode.equals("getchild_j")){ String p_item = req.getParameter("p_item"); rv = bom.getChild_j(p_item); //子部品 }else if(mode.equals("getiteminfo_j")){ String item_no = req.getParameter("item_no"); rv = bom.getItemInfo_j(item_no); //部品情報 } :
リスト1のWebクライアントから送られた非同期リクエストはリスト3のサーブレットが受信し、(1)のmodeパラメータの値から(2)以下のif〜else判断で、処理リクエストに対応するBeansメソッドを呼び出しています。
Beansの処理
package com.business; import java.sql.*; import java.util.List; import com.google.appengine.api.rdbms.AppEngineDriver; import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.EntityNotFoundException; import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; import com.google.appengine.api.datastore.Query; public class bomBean{ StringBuffer respBuf = new StringBuffer(""); StringBuffer rv1 = new StringBuffer(""); String rv = ""; String db = "business"; String user = "user1"; String pass = "pass1"; Connection con = null; DatastoreService ds = null; /* ****************************************** * * コンストラクタ * ****************************************** */ public bomBean(){ try{ DriverManager.registerDriver(new AppEngineDriver()); con = DriverManager.getConnection("jdbc:google:rdbms://branecosmology:business/business",user,pass); //(1) Cloud SQL } catch (SQLException e) { respBuf.append("jdbc Driver load error<r>"); } ds = DatastoreServiceFactory.getDatastoreService(); //(2) Bigtable } : /* ****************************************** * * 完成品検索 * ****************************************** */ public String getFinal_j(){ //(3) try{ Statement stmt = con.createStatement(); String sql = "select distinct p_item from item_master where final='y' order by p_item"; //(4) ResultSet rset = stmt.executeQuery(sql); //(5) rv = "{ \"entries\":["; while(rset.next()){ //(6) String p_item = rset.getString("p_item"); rv += "{\"p_item\": \"" + p_item + "\"},"; } rv = rv.substring(0, rv.length() - 1); rv += "]}"; rset.close(); stmt.close(); }catch(SQLException e){ rv = "接続失敗\n理由:" + e.toString(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ con.close(); }catch(Exception e){} } return rv; //(7) } /* ****************************************** * * 子部品検索 * ****************************************** */ public String getChild_j(String p_item){ try{ Statement stmt = con.createStatement(); String sql = "select * from item_master where p_item='"+p_item+"' order by c_item"; //(8) ResultSet rset = stmt.executeQuery(sql); //(9) rv = "{ \"entries\":["; while(rset.next()){ String c_item = rset.getString("c_item"); String make = rset.getString("make"); String stock = rset.getString("stock"); String vendor = rset.getString("vendor"); rv += "{\"p_item\": \"" + p_item + "\",\"c_item\": \"" + c_item + "\", \"make\": \"" + make + "\", \"stock\": \"" + stock + "\", \"vendor\": \"" + vendor + "\"},"; //(10) } rv = rv.substring(0, rv.length() - 1); rv += "]}"; rset.close(); stmt.close(); }catch(SQLException e){ rv = "接続失敗\n理由:" + e.toString(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ con.close(); }catch(Exception e){} } return rv; //(11) } /* ****************************************** * * 部品情報検索 * ****************************************** */ public String getItemInfo_j(String item_no){ try{ // Start Timer long start = System.currentTimeMillis(); // Start Timer Statement stmt = con.createStatement(); String sql = "select * from item_info where item_no='" + item_no + "';"; ResultSet rset = stmt.executeQuery(sql); if(rset.next()){ String item_name = rset.getString("item_name"); String final_flag = rset.getString("final_flag"); String vendor_no = rset.getString("vendor_no"); String vendor_name = rset.getString("vendor_name"); // End Timer long stop = System.currentTimeMillis(); long time = stop - start; // End Timer rv = "{\"stat\": \"" + time + "\",\"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}"; }else{ rv = "NO<i>部品番号:" + item_no + "は存在しません。"; } rset.close(); stmt.close(); }catch(SQLException e){ rv = "接続失敗\n理由:" + e.toString(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ con.close(); }catch(Exception e){} } return rv; }
コンストラクタ
ここでは、Cloud SQLにだけアクセスしています。同じプログラムからCloud SQL(MySQL)とBigtableの両方に接続が可能です。コンストラクタでは、どちらのアクセスにも対応できるようにしています。
(1)では、Cloud SQLで提供される専用ドライバを使用してMySQLデータベースへ接続します。(2)では、Bigtableアクセス用にDatastoreServiceインスタンス(ここではds)を生成しています。以上の準備で、このBeansからは、Cloud SQLのMySQLとBigtableの両方にアクセスできるようになります。
(2)のDBへの接続では、ユーザー名とパスワードで「user1」「pass1」を指定しています。これは、事前にGoogle APIs Consoleから登録してあるもので、図3のようにuser1にはSELECT、INSERT、UPDATE、DELETEの権限が付与されています。
Google Cloud SQLでは専用ドライバを使用しているため、コンストラクタ内では独自の処理部分がありますが、DB接続は、通常行われるJavaからのMySQL接続とまったく同じです。従って、JavaからのMySQLアクセス経験のある方には、まったく問題のない処理手順です。
完成品検索
完成品の検索は(3)のgetFinalメソッドで行われます。検索パターンは(4)のSQL文で指定されています。
完成品は、部品マスタ(item_master)内で、ファイナルフラグ(final)が「y」に設定されているので、それを検索条件に指定して、親部品(p_item)をDISTINCTで重複値を排除し、ORDER BYで部品番号を降順ソートしています。
次に、(5)で検索を実行して(6)のwhile文でJSONフォーマットの返信データを作り、(7)でサーブレットに返信しています。
子部品検索
子部品検索では、(8)で親部品(p_item)をキーにしてSQL文を作成しています。(9)でSQLを実行して、その結果を(10)を主体にJSONフォーマットのデータにして(11)でサーブレットに返しています。
部品情報検索
部品情報検索ではアクセスするテーブルが違うだけで手順は同じです。(12)でキー検索のSQL文指定後、(13)で実行し、実行結果を(14)でJSONフォーマットに組み立てて(15)でサーブレットに返します。
Copyright © ITmedia, Inc. All Rights Reserved.