@Override
	public void service(Request request, Response response) {
		// 色コードを取得する。
		int[] color = getRGBColor(request);

		// セッション ID とユーザー名を取得する。
		String sessionId = request.getCookie("session_id");
		String[] names = null;
		try (ShopDB db = new ShopDB()) {
			if (sessionId == null || ! db.checkSessionId(sessionId)) {
				sessionId = db.generateSessionId();
				response.addCookie("session_id=" + sessionId);
			} else {
				names = db.getUserNames(sessionId);
			}
		} catch (ClassNotFoundException | SQLException e) {
			response.setError(Response.STATUS_ERROR, e);
			return;
		}

		// ページを表示する。
		BasicView view = new BasicView(response);
		view.printHead(getName());

		view.printTag("p", "色売り屋へようこそ。" +
				view.linkTag("カート", "/cart") + " | " +
				view.linkTag(names != null ? names[2] + "さん" : "ログイン", "/login"));

		// 色選択フォームを表示する。
		view.printTag("p", "色を選んでください。または、" +
				view.linkTag("ランダムな色", "/", "random") + "。");
		view.printOpenFormTag("GET", "/");
		response.println("あか：" + view.inputTag("text",
				"red", color != null ? "" + color[0] : null, "size", "5"));
		response.println("みどり：" + view.inputTag("text",
				"green", color != null ? "" + color[1] : null, "size", "5"));
		response.println("あお：" + view.inputTag("text",
				"blue", color != null ? "" + color[2] : null, "size", "5"));
		view.printInputTag("submit", null, "送信");
		view.printCloseTag("form");

		// 色が選択されていれば、その色を表示する。
		if (color != null) {
			String colorString = String.format("%02x%02x%02x", color[0], color[1], color[2]);
			view.printTag("p", "あなたの選んだ色は、#" + colorString + " です。");
			view.printTag("div", "", "style", "background: #" + colorString +
					"; border: solid 1px black; width: 200px; height: 50px;");
			view.printOpenFormTag("POST", "/cart");
			view.printInputTag("hidden", "color", colorString);
			view.printInputTag("submit", null, "カートに追加");
			view.printCloseTag("form");
		}

		view.printTail();
	}