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

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

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

リクエス

HTTPのリクエストは、以下構造で構成されている。
・リクエストライン
・メッセージヘッダ
・改行 ・メッセージボディ
上記は、POSTリクエストの場合。 GETリクエストだと、改行とメッセージボディはない。
また、GETリクエストは、リクエストパラメータはURLの末尾に付加されるが、POSTリクエストは、メッセージボディに格納される。

リクエストライン

リクエストの種類(GETかPOSTかなど)、URI、HTTPのバージョンが記述される。
URI:URLとURNを包括する概念。

メッセージヘッダ

名前:値 上記形式を使って、リクエストに関する様々な情報が記載されている。これをヘッダフィールドという。

メッセージボディ

POSTリクエストなら、リクエストパラメータが格納されている。

各リクエスト情報の取得例

@WebServlet(urlPatterns={"/chapter12/request"})
public class Request extends HttpServlet {

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

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

		// リクエストURLを取得
		pw.println("<p>Request URL<br>" + req.getRequestURL() + "</p>");

		// サーバー情報を取得
		// 引数にヘッダフィールドの名前を指定すると、ヘッダフィールドの値が返却される
		pw.println("<p>Host<br>" + req.getHeader("Host") + "</p>");

		// ブラウザの種類を取得
		pw.println("<p>User-Agent<br>" + req.getHeader("User-Agent") + "</p>");

		// リクエスト送信元(クライアント)のIPアドレスを取得
		pw.println("<p>Remote Address<br>" + req.getRemoteAddr() + "</p>");

		Page.footer(pw);

	}

}
@WebServlet(urlPatterns={"/chapter12/request2"})
public class Request2 extends HttpServlet {

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

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

		pw.println("<p>Method<br>" + req.getMethod() + "</p>");
		pw.println("<p>Request URI<br>" + req.getRequestURI() + "</p>");
		pw.println("<p>Context Path<br>" + req.getContextPath() + "</p>");
		pw.println("<p>Servlet Path<br>" + req.getServletPath() + "</p>");
		pw.println("<p>Query String<br>" + req.getQueryString() + "</p>");
		pw.println("<p>Protocol<br>" + req.getProtocol() + "</p>");
		pw.println("<p>Request URL<br>" + req.getRequestURL() + "</p>");
		pw.println("<p>Sceme<br>" + req.getScheme() + "</p>");
		pw.println("<p>Servlet Name<br>" + req.getServerName() + "</p>");
		pw.println("<p>Server Port<br>" + req.getServerPort() + "</p>");

		Page.footer(pw);
	}



}

レスポンス

HTTPのレスポンスは、以下構造で構成されている。
・ステータスライン
・メッセージヘッダ
・改行
・メッセージボディ

ステータスライン

HTTPのバージョンとステータスコードが記述される。

主なステータスコード
200・・・正常終了
301・・・リクエストしたリソースは、新しい場所に移動した
302・・・リクエストしたリソースは、一時的に別の場所に移動した
304・・・リクエストしたリソースは変更されていない
404・・・リクエストしたリソースは利用できない
505・・・サーバ側のエラーが原因で、リクエストを完了できない

ステータスコードの範囲
100-199・・・情報
200-299・・・リクエストの成功
300-399・・・リダイレクション
400-499・・・クライアント側のエラー
500-599・・・サーバ側のエラー

メッセージヘッダ

リクエスト同様、ヘッダフィールドがある。

メッセージボディ

出力するHTMLが格納されている。

レスポンスの各種情報の設定例

@WebServlet(urlPatterns={"/chapter12/response"})
public class Response extends HttpServlet {

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

		// ステータスコード301を表す定数
		resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);

		// ヘッダフィールドの指定
		resp.setHeader("Location", "http://www.sbcr.jp");
	}

}