import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/Quiz") public class Quiz extends HttpServlet { private static final String ANSWER = "answer"; private static final String SCORE = "score"; private static final String NUMBER = "number"; private static final String QUESTIONS = "questions"; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 最初の問は GET doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println(""); int i, number=0, score=0; ArrayList questions; HttpSession session = request.getSession(true); if (session.isNew() || session.getAttribute(QUESTIONS) == null) { // 最初の問 questions = new ArrayList(); File f = new File(getServletContext().getRealPath("/WEB-INF/quiz.txt")); BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8")); String line=""; while((line=in.readLine())!=null) { line = line.trim(); if(line.trim().equals("")) continue; questions.add(line.split("\\s+")); // 空白の1つ以上の繰返し } in.close(); session.setAttribute(QUESTIONS, questions); out.println("

ようこそ QUIZへ!
では最初の問題です。

"); } else { // 最初の問ではない try { number = (int)session.getAttribute(NUMBER); score = (int)session.getAttribute(SCORE); questions = (ArrayList)session.getAttribute(QUESTIONS); String[] tokens = questions.get(number-1); int a = Integer.parseInt(tokens[tokens.length-1]); int answer = Integer.parseInt(request.getParameter(ANSWER)); if (a==answer) { // aは最後の文字 out.println("正解です。
"); score++; } else { out.println("残念でした。
"); } } catch (Exception e) { // session.invalidate(); session.removeAttribute(QUESTIONS); out.println("想定外のアクセスでエラーが起こりました。タブを閉じるかリロードしてください。"); e.printStackTrace(out); out.println(""); out.close(); return; } } if (number >= questions.size()) { // 終 out.println("
これで QUIZは終わりです。
"); out.printf("正解数は、%d問でした。%n", score); // session.invalidate(); session.removeAttribute(QUESTIONS); } else { // 次の問を表示 String[] tokens = questions.get(number); out.println("次の問: "+tokens[0]+"
"); out.println("
"); for (i=0; i %s", i+1, tokens[i+1]); } out.println("
"); out.println(""); out.println(""); out.println(""); number++; session.setAttribute(NUMBER, number); session.setAttribute(SCORE, score); } out.println(""); out.close(); } }