MVCに分割してじゃんけん処理を作成してみよう2

JSP&Servlet

MVCに分割してじゃんけんの処理を作成してみよう。今回はセッションを利用して勝敗数を管理する

実行例

  • 以下のurlをいれリクエストを送ると以下のような手を選ぶフォームが表示される
  • 手を選択し勝負ボタンを押すと結果が表示される
  • 戻るを押すと最初から

model.Jyan.java

作成

  • 実行例を見ると、
    自分の手
    PCの手
    結果
    勝数
    負け数
    を表示している。その5つをフィールドに持つJyanクラスを以下のように作成する
package model;

import java.io.Serializable;

public class Jyan implements Serializable{
	private String userHand;
	private String pcHand;
	private String result;
	private int win;
	private int lose;
	public String getUserHand() {
		return userHand;
	}
	public void setUserHand(String userHand) {
		this.userHand = userHand;
	}
	public String getPcHand() {
		return pcHand;
	}
	public void setPcHand(String pcHand) {
		this.pcHand = pcHand;
	}
	public String getResult() {
		return result;
	}
	public void setResult(String result) {
		this.result = result;
	}
	public int getWin() {
		return win;
	}
	public void setWin(int win) {
		this.win = win;
	}
	public int getLose() {
		return lose;
	}
	public void setLose(int lose) {
		this.lose = lose;
	}

}

controller.JyanMain.java

  • MVCに分割して作成する場合、リクエストを受け取るのはサーブレットの役割だ。
  • 最初のリクエストはフォームを表示する処理なので、シンプルにform.jspにフォワードする処理を書く。この段階ではdoPostは空にしておく
package controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/JyanMain")
public class JyanMain extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("WEB-INF/view/form.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

WEB-INF/view/form.jsp

  • 実行例になるようにformを作成する
<%@ 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="JyanMain" method="post">
<label><input type="radio" name="userHand" value="0" required>グー</label>
<label><input type="radio" name="userHand" value="1">チョキ</label>
<label><input type="radio" name="userHand" value="2">パー</label>
<button type="submit">勝負</button>
</form>
</body>
</html>
  • JyanMainサーブレットから実行してみよう以下のようにフォームが表示されれば成功だ

model.JyanLogic.java

  • フォームからユーザーが選択した手を取得できるのでその手をJyanインスンタンスに覚えさせる
  • JyanLogicクラスでそのJyanインスタンスを引数に受取り、内部でPCの手をランダムに作成し、判定を行ないJyanインスタンスを完成させる処理を以下のように作成する
  • 勝敗数を更新する
package model;

public class JyanLogic {
	public static final String[] HANDS= {"グー","チョキ","パー"};
	public static final String[] RESULTS= {"あいこ","あなたの負け","あなたの勝ち"};
	public void execute(Jyan jyan) {
		//jyanが持っている"0","1","2"をintに変換
		int userHand=Integer.parseInt(jyan.getUserHand());
		//pcの手を0,1,2のRandomに生成
		int pcHand=(int)(Math.random()*3);
		//差を求める(ひっくり返らないように3を足してから引く)
		int diff = (userHand+3 -pcHand) % 3;
		//ユーザーの手をグー、チョキ、パーという表記でセット
		jyan.setUserHand(HANDS[userHand]);
		//PCの手をグー、チョキ、パーという表記でセット
		jyan.setPcHand(HANDS[pcHand]);
		//今回の結果をセット
		jyan.setResult(RESULTS[ diff]);
		//win or loseを増やす
		if(diff == 2) {
			jyan.setWin(jyan.getWin()+1);
		}else if(diff == 1) {
			jyan.setLose(jyan.getLose()+1);
		}
	}
}

controller.JyanMain.javaへの追記

  • フォームからユーザーが選んだ手が0,1,2のいずれかで飛んでくるのでdoPostを以下のように追記する
  • セッションスコープからjyanインスタンスを取得する(なければ新規に作成する)
package controller;

import java.io.IOException;

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

import model.Jyan;
import model.JyanLogic;

@WebServlet("/JyanMain")
public class JyanMain extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("WEB-INF/view/form.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメーターを取得("0"or"1"or"2")
		String userHand=request.getParameter("userHand");
		//HttpSessionインスタンスの取得
		HttpSession session = request.getSession();
		//セッションスコープからjyanインスタンスの取得
		Jyan jyan = (Jyan)session.getAttribute("jyan");
		if(jyan == null) {
			//Jyanインスタンスの作成
			jyan = new Jyan();
		}
		//jyanに"0"or"1"or"2"をセット
		jyan.setUserHand(userHand);
		//JyanLogicインスタンスを作成
		JyanLogic logic = new JyanLogic();
		//executeを実行->jyanインスタンスがすべての情報をもって完成する
		logic.execute(jyan);
		//セッションスコープにjyanインスタンスを登録(キーはjyan)
		session.setAttribute("jyan", jyan);
		//result.jspにフォワード
		request.getRequestDispatcher("WEB-INF/view/result.jsp").forward(request, response);

	}

}

WEB-INF/view/result.jsp

  • すべての情報を持っているjyanインスタンスをセッションスコープから取得し、情報を表示する
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model.Jyan"%>
<%
//セッションスコープからjyanインスタンスの取り出し
Jyan jyan = (Jyan)session.getAttribute("jyan");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>じゃん</title>
</head>
<body>
<p>あなたは<%=jyan.getUserHand()%></p>
<p>PCは<%=jyan.getPcHand()%></p>
<p><%=jyan.getResult()%></p>
<p>Win:<%=jyan.getWin()%></p>
<p>Lose:<%=jyan.getLose()%></p>
<p><a href="JyanMain">戻る</a></p>
<a href="JyanMain?action=reset">(勝敗をクリア)</a>
</body>
</html>

controller.JyanMain.javaの追記

  • 勝敗をクリアを押されたときの処理を以下のように追記する
package controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import model.Jyan;
import model.JyanLogic;

@WebServlet("/JyanMain")
public class JyanMain extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String action = request.getParameter("action");
		if(action != null && action.equals("reset")) {
			HttpSession session = request.getSession();
			//jyanインスタンスをセッションスコープから削除
			session.removeAttribute("jyan");
		}
		request.getRequestDispatcher("WEB-INF/view/form.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメーターを取得("0"or"1"or"2")
		String userHand=request.getParameter("userHand");
		//HttpSessionインスタンスの取得
		HttpSession session = request.getSession();
		//セッションスコープからjyanインスタンスの取得
		Jyan jyan = (Jyan)session.getAttribute("jyan");
		if(jyan == null) {
			//Jyanインスタンスの作成
			jyan = new Jyan();
		}
		//jyanに"0"or"1"or"2"をセット
		jyan.setUserHand(userHand);
		//JyanLogicインスタンスを作成
		JyanLogic logic = new JyanLogic();
		//executeを実行->jyanインスタンスがすべての情報をもって完成する
		logic.execute(jyan);
		//セッションスコープにjyanインスタンスを登録(キーはjyan)
		session.setAttribute("jyan", jyan);
		//result.jspにフォワード
		request.getRequestDispatcher("WEB-INF/view/result.jsp").forward(request, response);
	}

}

完成

実行してみよう。実行例どおりに遊べれば成功だ。

コメント

タイトルとURLをコピーしました