mdr141
6/9/2018 - 12:29 PM

Servlet, JSP フォーム

// プロジェクトフォルダ > Javaリソース > src > servlet > FormSampleServlet.java
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// ここのURLパターンが、送信元フォームのactionと一致しないとエラー
@WebServlet("/FormSampleServlet")
public class FormSampleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// 送信元のmethodがpostなので、doPost()メソッド
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// URLエンコードされたリクエストパラメータをデコード
		request.setCharacterEncoding("UTF-8");

		// getParameter()メソッドでリクエストパラメータを取得
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
		String body = request.getParameter("body");

		// リクエストパラメータをチェック
		String errorMsg = "";
		if(name == null || name.length() == 0) {
			errorMsg += "<font color=\"red\">名前を入力してください</font><br>";
		}

		if(gender == null || gender.length() == 0) {
			errorMsg += "<font color=\"red\">性別を入力してください</font><br>";
		} else {
			switch (gender) {
			case ("0"):
				gender = "Male";
				break;
			case ("1"):
				gender = "Female";
				break;
			}
		}

		if(body == null || body.length() == 0) {
			errorMsg +=  "<font color=\"red\">内容を入力してください</font><br>";
		}

		// 送信完了メッセージ
		String msg = name + "さん(" + gender +")、お問い合わせありがとうございました。<br>"
				+ "内容:" + body;
		if(errorMsg.length() != 0) {
			msg = errorMsg;
		}

		// HTML出力
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset=\"UTF-8\">");
		out.println("<title>フォーム送信内容</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<p>" + msg +"</p>");
		out.println("</body>");
		out.println("</html>");
	}

}
<!-- プロジェクトフォルダ > WebContent > formSample.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>フォーム - サンプル</title>
</head>
<body>
	<form action="/Lesson5/FormSampleServlet" method="post">
		名前: <input type="text" name="name"> <br> 性別: <label>Male<input
			type="radio" name="gender" value="0"></label> / <label>Female<input
			type="radio" name="gender" value="1"></label> <br> 内容:
		<textarea name="body"></textarea>
		<input type="submit" value="送信">
	</form>
</body>
</html>
◆サーブレットでリクエストパラメータを取得する
(0)送信されたリクエストパラメータは、HttpServletRequestインスタンスに格納されている。
そのインスタンスから、リクエストパラメータを取得する。

(1)URLエンコードされたリクエストパラメータをデコードして元に戻す
request.setCharacterEncoding("送信元HTMLの文字コード");
例:
request.setCharacterEncoding("UTF-8");

(2)リクエストパラメータを取得する
String xxx = request.getParameter("リクエストパラメータの名前");
例:
リクエストパラメータ「name=ディック」を取得したいなら、リクエストパラメータの名前である「name」を引数に渡す
String name = request.getParameter("name");

◆JSPでリクエストパラメータを取得する場合
doGet()、doPost()は宣言されない。けど、使える。
暗黙オブジェクト:宣言せずに利用できる特別なオブジェクト。
例:
<%
requset.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String age = request.getParameter("age");
%>
◆フォーム
<form action"送信先" method="リクエストメソッド">
...
</form>

◇action属性
・サーブレット場合:/プロジェクト名/URLパターン
・JSPの場合:/プロジェクト名/WebContent以降のパス

◇method属性(省略するとGET)
GET:WebサーバからWebページの情報を取得したいとき。アドレスバーの表示は「リクエスト先URL?リクエストパラメータ」
POST:情報をサーバに送りたいとき。コンタクトフォームなど。アドレスバーの表示は「リクエスト先URL」(入力データが見えないようになる)

◆フォームに入力されたデータは「部品名=値」の形式で送信される。
この「部品名=値」のことを「リクエストパラメータ」という
◇例:
<form action="送信先" method="リクエストメソッド">
  NAME: <input type="text" name="name"><br>
  AGE: <input type="text" name="age"><br>
  E-MAIL: <input type="text" name="email">
</form>
↓
・複数のリクエストパラメータ同士が「&」でつながれて送信される
name=ディック&age=89&email=dick@xxx.xxx
・実際は、URLエンコード(文字変換処理)がおこなわれて送信される。
・変換されたリクエストパラメータを受け取るサーバサイドプログラムは、デコードする必要がある。

◆リクエストパラメータをこっそり仕込む場合
◇hiddenを使う
例:
<input type="hidden" name="送信したいリクエストパラメータ名" value="送信したい値">
◇送信先に「?名前=値」
例:
<form action="送信先?名前=値" method="get">...</form>
<a href="送信先?名前=値">...</a>