5月24日

うらないもどきの続きを作る。

今は名前だけをJSPで表示しているので、誕生日も表示するように修正する。
まずはサーブレット側から誕生日のデータを渡すようにする。

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String name = request.getParameter("name");
		String month = request.getParameter("month");
		String date = request.getParameter("date");
		request.setAttribute("name", name);
		request.setAttribute("month", month);
		request.setAttribute("date", date);
		request.getRequestDispatcher("result.jsp")
			   .forward(request, response);
	}

JSP側で誕生日を表示する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>うらないもどき 結果</title>
</head>
<body>
<h1>結果</h1>
${month}月${date}日生まれの${name}さんの運勢は?
</body>
</html>

サーブレット側で結果を渡すコードを追加するとともに、うらないの結果を生成するメソッドを用意する。

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String name = request.getParameter("name");
		String month = request.getParameter("month");
		String date = request.getParameter("date");
		String result = getResult(month, date);
		request.setAttribute("name", name);
		request.setAttribute("month", month);
		request.setAttribute("date", date);
		request.setAttribute("result", result);
		request.getRequestDispatcher("result.jsp")
			   .forward(request, response);
	}

	private String getResult(String month, String date) {
		return "サイコーです!";
	}

JSP側で結果を表示する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>うらないもどき 結果</title>
</head>
<body>
<h1>結果</h1>
${month}月${date}日生まれの${name}さんの運勢は?
<div>${result}</div>
</body>
</html>

誕生日によって異なる結果が表示されるようにする。

	private String getResult(String month, String date) {
		String[] r = {
				"ぼちぼちです",
				"サイコーです!",
				"まあまあです",
				"それなりです",
				"やれやれです",
				"なかなかです",
				"かなりいい感じです",
				"最悪です"
		};
		String s = month + "-" + date;
		int i = s.hashCode() % r.length;
		return r[i];
	}

なんとか度診断も追加してみる。
入力フォームに追加する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>うらないもどき</title>
</head>
<body>

<h1>うらないもどき</h1>

<form action="DivineServlet">
<div>
名前:<input type="text" name="name">
</div>
<div>
誕生日:
<select name="month">
<c:forEach begin="1" end="12" varStatus="status">
  <option value="${status.index}">${status.index}</option>
</c:forEach>
</select>
月
<select name="date">
<c:forEach begin="1" end="31" varStatus="status">
  <option value="${status.index}">${status.index}</option>
</c:forEach>
</select>
日
</div>
<div>
なんとか度:<input type="text" name="rate">
</div>
<div>
<input type="submit" value="送信">
</div>
</form>


</body>
</html>

サーブレットにコードを追加する。

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String name = request.getParameter("name");
		String month = request.getParameter("month");
		String date = request.getParameter("date");
		String rate = request.getParameter("rate");
		String result = getResult(month, date);
		String rating = getRating(name, rate);
		request.setAttribute("name", name);
		request.setAttribute("month", month);
		request.setAttribute("date", date);
		request.setAttribute("result", result);
		request.setAttribute("rate", rating);
		request.getRequestDispatcher("result.jsp")
			   .forward(request, response);
	}

	private String getRating(String name, String rate) {
		String s = name + "-" + rate;
		int v = s.hashCode() % 100;
		String rating = name + "さんの"
					  + rate + "度は、"
					  + v + "%です。";
		return rating;
	}

結果を表示する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>うらないもどき 結果</title>
</head>
<body>
<h1>結果</h1>
${month}月${date}日生まれの${name}さんの運勢は?
<div>${result}</div>
<div>${rate}</div>
</body>
</html>

Spring MVC の準備として、プラグインをインストールする。

メニューの[ヘルプ]-[Eclipseマーケットプレイス]を選択する。
検索キーワードで「STS」を入力して検索を実行。
検索結果に出た「STS 3.7.3 RELEASE」をインストールする。

5月20日

クライアントからパラメータを受け取る

HelloServletでリクエストパラメータを受け取るコードを書いてみる。

リクエストパラメータの送信は、URLにパラメータを追加する。

http://localhost:8080/web/HelloServlet?key1=value1&key2=value2&...
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Date d = new Date();
		Map<String, String[]> map = request.getParameterMap();
		Set<String> keys = map.keySet();
		for (String key : keys) {
			String[] v = map.get(key);
			System.out.println(key + "=" + v[0]);
		}
		Writer w = response.getWriter();
		w.write("<html><body>");
		w.write("Today is " + d.toString());
		w.write("</body></html>");
	}

クライアントから受け取ったパラメータと値をブラウザに表示するには、System.outに出力していた内容を、Writerに出力するように書き直せばよい。改行させるために、それぞれのキーと値のペアを div タグで囲む。

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Date d = new Date();
		Map<String, String[]> map = request.getParameterMap();
		Set<String> keys = map.keySet();
		Writer w = response.getWriter();
		w.write("<html><body>");
		w.write("Today is " + d.toString());
		for (String key : keys) {
			String[] v = map.get(key);
			w.write("<div>");
			w.write(key + "=" + v[0]);
			w.write("</div>");
		}
		w.write("</body></html>");
	}

うらないみたいなWebアプリを作ってみる

名前と誕生日を入力して送信すると、うらないの結果を表示するアプリを作る。
入力画面は input.jsp とする。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>うらないもどき</title>
</head>
<body>

<h1>うらないもどき</h1>

<form action="DivineServlet">
<div>
名前:<input type="text" name="name">
</div>
<div>
誕生日:
<select name="month">
<c:forEach begin="1" end="12" varStatus="status">
  <option value="${status.index}">${status.index}</option>
</c:forEach>
</select>
月
<select name="date">
<c:forEach begin="1" end="31" varStatus="status">
  <option value="${status.index}">${status.index}</option>
</c:forEach>
</select>
日
</div>
<div>
<input type="submit" value="送信">
</div>

</form>


</body>
</html>

「占う」の英語が「Divine」なので、リクエストの受け取り側をDivineServletとする。
とりあえず、パラメータを受け取って表示するだけのサーブレットを作る。

package jp.abc;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DivineServlet
 */
@WebServlet("/DivineServlet")
public class DivineServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		String month = request.getParameter("month");
		String date = request.getParameter("date");
		Writer w = response.getWriter();
		w.write("<html><body><h1>結果</h1>");
		w.write(name);
		w.write("さん(");
		w.write(month);
		w.write("月");
		w.write(date);
		w.write("日生まれ)の運勢は");
		w.write("サイコーです");
		w.write("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

文字化け対策をする。
文字コードを指定するだけでよい。

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String name = request.getParameter("name");
		String month = request.getParameter("month");
		String date = request.getParameter("date");
		Writer w = response.getWriter();
		w.write("<html><body><h1>結果</h1>");
		w.write(name);
		w.write("さん(");
		w.write(month);
		w.write("月");
		w.write(date);
		w.write("日生まれ)の運勢は");
		w.write("サイコーです");
		w.write("</body></html>");
	}

Writerにタグを出力するのはめんどくさいので、結果をJSPで表示できるようにする。
結果を表示する result.jsp を作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>うらないもどき 結果</title>
</head>
<body>
<h1>結果</h1>
</body>
</html>

DivineServlet から result.jsp にフォワードする。

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String name = request.getParameter("name");
		String month = request.getParameter("month");
		String date = request.getParameter("date");
		request.getRequestDispatcher("result.jsp")
			   .forward(request, response);
	}

Servletで受け取ったパラメータをJSPに渡す。

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String name = request.getParameter("name");
		String month = request.getParameter("month");
		String date = request.getParameter("date");
		request.setAttribute("name", name);
		request.getRequestDispatcher("result.jsp")
			   .forward(request, response);
	}

JSPで表示する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>うらないもどき 結果</title>
</head>
<body>
<h1>結果</h1>
${name}
</body>
</html>