Web系開発メモ

Java, JavaScript, CSS, HTML などなど。ハードウェアやゲームのことも書いてます。

Servletアプリ開発:3.Java開発1(モデル・リポジトリ)

サーブレットアプリ(RESTful API)の Java開発について書いていきます。Java開発は2つの記事に分けていて、今回はモデル(Memo オブジェクト)と、リポジトリ(データを操作するクラス)をつくっていきます。

※ 開発するアプリの概要は、以下のリンク先に書いてあります。

Servletアプリ開発:1.概要

モデルの作成

メモのデータを保持するクラスを作成します。

servlet-rest/src/main/java/model/Memo.java

package model;

import java.util.Date;

public class Memo {
  public long id;
  public String txt;
  public Date updated, created;
  public Memo(long id, String txt, Date time) {
    this.id = id;
    this.txt = txt;
    this.updated = time;
    this.created = time;
  }
}

メモの内容は、変数 txt に格納されます。コンストラクタは、メモを作成する処理で使います。

リポジトリの作成

メモの取得・作成・更新・削除ができるクラスを作成します。

servlet-rest/src/main/java/data/MemoRepository.java

package data;

import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

import model.Memo;

public class MemoRepository {
  private static LinkedHashMap<Long, Memo> data = new LinkedHashMap<>();
  private static AtomicLong id = new AtomicLong(0);
  public static List<Memo> readAll() {
    synchronized (data) {
      return new ArrayList<>(data.values());
    }
  }
  public static Memo create(String txt) {
    Memo memo = new Memo(
      id.getAndIncrement(), txt, new Date()
    );
    synchronized (data) {
      data.put(memo.id, memo);
    }
    return memo;
  }
  public static Memo update(Long id, String txt) {
    synchronized (data) {
      Memo memo = data.get(id);
      if (memo == null) return null;
      memo.txt = txt;
      memo.updated = new Date();
      return memo;
    }
  }
  public static Memo delete(Long id) {
    synchronized (data) {
      return data.remove(id);
    }
  }
}

メモのデータは LinkedHashMapdata 変数に格納します。今回はサーブレットに特化したサンプルアプリなので、データをメモリで保持することにしてます。メモリ保持だと、アプリを停止(コンテナを停止)するとデータは失われます。

実運用するアプリだと、RDBMS などにデータを永続化することが多いと思います。