ただのSEの備忘録

技術からニュース、くだらない雑学まで何でもまとめるブログ

*

自作API|リクエストをservletへ投げてデータをJSONで返却する方法~実装編|その2~

      2014/07/18


前回servletで受け取ったリクエストをごにょごにょして、JSON形式で返却するところまで説明しました。

今回はその「ごにょごにょ」部分を軽く紹介したいと思います。

(前回の説明記事はこちら

 

前回の記事でリクエストパラメータを受け取っていましたが、今度はそれをロジック層へ渡し、実際の処理を行います。

前回GetGarage.javaの下記記述からロジック層へ行きます。

<div class="line number20 index19 alt1" style="color: #555758;"><code class="java plain" style="color: black !important;">String kw = req.getParameter(</code><code class="java string" style="color: blue !important;">"kw"</code><code class="java plain" style="color: black !important;">);</code></div>
<div class="line number21 index20 alt2" style="color: #555758;"><code class="java plain" style="color: black !important;">List<MotoBean> list = logic.getGarage(kw);</code></div>

0002

logicフォルダに「GetGarageLogic」を作成しました。

ここで実際の処理を行います。中身はこのようになっています。


package server.logic;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import server.bean.moto.MotoBean;
import util.BigSmallStringUtil;
import util.CsvUtil;

public class GetGarageLogic {
public List<MotoBean> getGarage(String kw){
final List<MotoBean> list = CsvUtil.getBikeModelCsvData();

return fwSearch(list,kw);
}

private List<MotoBean> fwSearch(List<MotoBean> list,String kw){
List<MotoBean> resultList = new ArrayList<MotoBean>();
for (final MotoBean item : list) {
//ここでキーワードに当てはまる車種を抽出
//BigSmallStringUtil.toSmallAsciiクラスで大文字、小文字変換を行う
Pattern p = Pattern.compile(BigSmallStringUtil.toSmallAscii(kw), Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(item.getModelName());
if (m.find()) {
// 部分一致です
MotoBean bean = new MotoBean();
bean.setModelName(item.getModelName());
bean.setEngineSize(item.getEngineSize());
resultList.add(bean);
}
}
return resultList;
}
}

まずは下記記述でCSVからデータを取得しています。今回DBをうまく使うことが出来なかったため、CSVファイルを作成し、リストとして取得しています。


final List<MotoBean> list = CsvUtil.getBikeModelCsvData();

次にそのリストをfwSearch()へ渡し、kwと一致する車種を抜き取っています。

スポンサードリンク

ここで今回工夫したのが、車種一覧は半角で入っていますが、全角で入力されてもよい様に、全角を半角に直すclassを通しています。これで検索を許容するように作っています。

コチラにまとめています。

 

肝心のCSVからデータを取得するクラスですが、下記のように取得しています。

今回engineSizeとmodelNameのふたつのカラムを持っていてそれらを取得できるようにしています。

こちら、少し修正するだけで、いろいろなCSVデータを読み込むことが出来ますので、ぜひご活用ください。


package util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import server.bean.moto.MotoBean;

/**
* @author yuuki
*
*/
public class CsvUtil {

/** ファイル名 */
private static final String BIKE_MODEL_FILE_NAME = "/WEB-INF/bike_model_t.csv";

/**
* 車種テーブル定義.
*
* @author yuuki
*
*/
private static enum BIKE_MODEL_T{
/** 排気量 */
ENGINE_SIZE(0),
/** 車種名 */
MODEL_NAME(1);

final int code;

private BIKE_MODEL_T(final int code) {
this.code = code;
}
}

/**
* 車種CSVデータを取得します.
*/
public static List<MotoBean> getBikeModelCsvData() {
final List<MotoBean> motoList = new ArrayList<MotoBean>();

try {
File csv = new File(new File("").getAbsolutePath() + BIKE_MODEL_FILE_NAME);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv), "SJIS"));

// 最終行まで読み込む
String line = "";
while ((line = br.readLine()) != null) {

// 1行をデータの要素に分割
final String[] record = line.split(",");

final String name = record[BIKE_MODEL_T.MODEL_NAME.code];
final String cc = record[BIKE_MODEL_T.ENGINE_SIZE.code];

if (name == null || cc == null) {
// null の場合は読み飛ばす
continue;
}

final MotoBean item = new MotoBean();
try {
item.setEngineSize(Integer.parseInt(cc));
item.setModelName(name);
} catch (NumberFormatException nfex) {
// 排気量が数値変換できない場合は読み飛ばす
continue;
}

motoList.add(item);
}

br.close();

} catch (FileNotFoundException e) {
// Fileオブジェクト生成時の例外捕捉
e.printStackTrace();
} catch (IOException e) {
// BufferedReaderオブジェクトのクローズ時の例外捕捉
e.printStackTrace();
}

return motoList;
}
}

これで、URLにアクセスして、中でデータ取得、変換、それらのリストを返却するまでの流れを説明することが出来ました!

結果はこんな感じ

http://1-dot-kenisfriendly223.appspot.com/action/moto/getGarage?kw=gsx

スズキGSXシリーズの検索結果となります!感動ですね^^

まだこれは単純な処理しか行っていませんが、立派なAPIが完成しました。

是非自分でも作ってみたいという方は参考にしてみてください!

 - Java