1. 3 App Engineの処理

[1] サーブレットのコード記述

Drive上スプレッドシートのJavaScript で、 リスト1のgetalldata関数から(5)のfecthメソッドが実行されるとリスト2のサーブレットが呼び出されます。

リスト2 サーブレット(SpreadServlet.java)

package com.google.gdata;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.*;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import com.google.appengine.api.datastore.EntityNotFoundException;

@SuppressWarnings("serial")
public class SpreadServlet extends HttpServlet {
    :
  public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.setContentType("text/plain");
    resp.setContentType("text/html; charset=utf-8");
    PrintWriter out = resp.getWriter();
    String mode = req.getParameter("mode"); 
    String sheet = req.getParameter("sheet");
    SpreadBean ss = new SpreadBean();					//(1)
    if (mode.equals("addspreadbyshoptodsym")) {
      String shop = req.getParameter("shop");
      String rv = ss.addSpreadByShopToDsYm(sheet, shop);
      out.println(rv);
        :
    } else if (mode.equals("sfetchall")) { 
      String rv = ss.sfetchall(sheet);						//(2)
      out.println(rv);													//(3)
    }
  }
} 

サーブレットの処理はこれまでと同じ処理内容です。リスト1の(1)でビーンズのインスタンスを生成し、modeパラメータの値("sfetchall")から、(2)でSpreadBeanのsfetchallメソッドが呼び出され、(3)でその戻り値(rv)がサーブレットに返されます。次に、ビーンズのコード記述を見ていきます。

[2] ビーンズのコード記述

リスト3 ビーンズ(SpreadBean.java)

package com.google.gdata;
package com.google.gdata;
  
import java.io.IOException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

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.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.Filter;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.SortDirection;
import com.google.gdata.client.spreadsheet.FeedURLFactory;
import com.google.gdata.client.spreadsheet.ListQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.CustomElementCollection;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetFeed;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;
import com.google.appengine.api.datastore.Query.FilterPredicate;
import com.google.appengine.api.datastore.PreparedQuery;
  
public class SpreadBean {
    :
  public String sfetchall(String yyyymm){													//(1)
    try {
      String rv = "{ \"ds\":[";
      DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
      Filter ymFilter = new FilterPredicate("yyyymm", FilterOperator.EQUAL, yyyymm);
      Query q = new Query("salesym").setFilter(ymFilter);
      PreparedQuery pq = ds.prepare(q); 
      for (Entity res : pq.asIterable()) {
        String shop = (String) res.getProperty("shop");
        String food = (String) res.getProperty("food");
        String electric = (String) res.getProperty("electric");
        String bedding = (String) res.getProperty("bedding");
        String other = (String) res.getProperty("other");
        String moddate = (String) res.getProperty("moddate");
        rv += "{\"shop\": \"" + shop 											//(2)
          + "\", \"food\": \"" + food 
          + "\", \"electric\": \"" + electric 
          + "\", \"bedding\": \"" + bedding 
          + "\", \"other\": \"" + other 
          + "\", \"moddate\": \"" + moddate 
          + "\"},"; 
       } 
      rv = rv.substring(0, rv.length() - 1) + "]}";
      return rv; 
    } catch (Exception e) {
      e.printStackTrace();
      return "参照不成功 :" + e;
    } 
  } 
} 

SpreadBeanには連載で見てきたメソッドがすべて記述されています。URLFetchではリスト2のSpreadServletから(1)のsfetchallメソッドが呼び出され、ここでDatastoreをアクセスして得られたデータがDrive上のスプレッドシートに表示されることになります。
処理内容は第3回、リスト3のgetDsAllShopYmメソッドと殆ど同じですが、Datastoreをアクセスして得られた値をJSONデータとしてフォーマッティングする(2)の部分だけが異なります。

この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30