転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】基礎からのサーブレット⑰

セッション

セッション・・・各ユーザに固有のデータを格納するための仕組み。アプリケーションサーバに保存されるセッションIDで、ユーザを区別する。
セッション属性・・・ユーザごとのデータを保持する。セッションIDに紐づく。

セッションの開始

ユーザからのリクエストを受け取ると、アプリケーションサーバを受け取るとセッションIDを発行し、レスポンスとしてブラウザに戻す。
ブラウザは、セッションIDをクッキーに保存する。

2回目以降のアクセス

ユーザが同じサイトの別ページを開くと、クッキーからセッションIDをアプリケーションサーバに送信する。アプリケーションサーバは、セッションIDを受取り、セッションデータを取得する。

@WebServlet(urlPatterns={"/chapter17/search"})
public class Count extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		PrintWriter pw = resp.getWriter();
		Page.header(pw);

		// HttpSessionオブジェクトの取得
		HttpSession hs = req.getSession();

		// セッション属性から値の取得
		Integer count = (Integer)hs.getAttribute("count");

		// 値の設定
		if (count == null) {
			count = 0;
		}
		count++;

		// セッション属性の設定
		hs.setAttribute("count", count);

		pw.println("<p>" + count + "</p>");
		pw.println("<p>" + hs.getId() + "</p>");

		Page.footer(pw);

	}

}
<p>カートに追加する商品を入力してください。</p>
<form action="cart-add" method="post">
	商品名<input type="text" name="name">
	価格<input type="text" name="price">
	<input type="submit" value="追加">
</form>
@WebServlet(urlPatterns={"/chapter17/cart-add"})
public class CartAdd extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		PrintWriter pw = resp.getWriter();
		Page.header(pw);

		// form属性から値の取得
		String name = req.getParameter("name");
		int price = Integer.parseInt(req.getParameter("price"));

		// HttpSessionオブジェクトの取得
		HttpSession session = req.getSession();

		// セッション属性から値の取得
		List<Product> cart = (List<Product>)session.getAttribute("cart");
		if(cart==null) {
			cart = new ArrayList<Product>();
		}

		// Beanに値の設定
		Product p = new Product();
		p.setName(name);
		p.setPrice(price);
		cart.add(p);

		// セッション属性に値の設定
		session.setAttribute("cart", cart);

		pw.println("カートに商品を追加しました。");
		Page.footer(pw);
	}

}
@WebServlet(urlPatterns={"/chapter17/cart-get"})
public class CartGet extends HttpServlet {

	@SuppressWarnings("unchecked")
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		PrintWriter pw = resp.getWriter();
		Page.header(pw);

		HttpSession session = req.getSession();

		List<Product> cart = (List<Product>)session.getAttribute("cart");

		for(Product p : cart) {

			pw.println("<p>");
			pw.println(p.getName());
			pw.println(":");
			pw.println(p.getPrice());
			pw.println("</p>");

		}

		Page.footer(pw);

	}

}
@WebServlet(urlPatterns={"/chapter17/cart-remove"})
public class CartRemove extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		PrintWriter pw = resp.getWriter();
		Page.header(pw);

		HttpSession session = req.getSession();
		// セッション属性の削除
		session.removeAttribute("cart");
               // すべてのセッション属性を削除し、セッションを終了させる場合は、以下の書き方
               // session.invalidate();

		Page.footer(pw);
	}

}

SuppressWarningsアノテーション

コンパイラが適切かどうか判断できない型変換などがある場合、コンパイラは警告を発する。
この警告を抑制する際、このアノテーションをクラスまたはメソッドに対して記述する。
未チェックまたは安全ではない操作に対する警告では、
@SuppressWarnings("unchecked")
と記述する。