diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 00000000..56c7380a
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index cb226e88..7c38d631 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,8 +12,8 @@
UTF-8
- 18
- 18
+ 19
+ 19
@@ -21,7 +21,7 @@
javax.servlet
javax.servlet-api
4.0.1
- provided
+
javax.servlet
diff --git a/src/main/java/com/tictactoe/InitServlet.java b/src/main/java/com/tictactoe/InitServlet.java
new file mode 100644
index 00000000..18f7d717
--- /dev/null
+++ b/src/main/java/com/tictactoe/InitServlet.java
@@ -0,0 +1,23 @@
+package com.tictactoe;
+
+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;
+import java.io.IOException;
+import java.util.List;
+
+@WebServlet(name = "InitServlet", value = "/start")
+public class InitServlet extends HttpServlet {
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ HttpSession currentSession = req.getSession(true);
+ Field field = new Field();
+ List data = field.getFieldData();
+ currentSession.setAttribute("field", field);
+ currentSession.setAttribute("data", data);
+ getServletContext().getRequestDispatcher("/index.jsp").forward(req, resp);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/tictactoe/LogicServlet.java b/src/main/java/com/tictactoe/LogicServlet.java
new file mode 100644
index 00000000..883ce238
--- /dev/null
+++ b/src/main/java/com/tictactoe/LogicServlet.java
@@ -0,0 +1,82 @@
+package com.tictactoe;
+
+import javax.servlet.RequestDispatcher;
+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;
+import java.io.IOException;
+import java.util.List;
+
+import static com.tictactoe.Sign.*;
+
+@WebServlet(name = "LogicServlet", value = "/logic")
+public class LogicServlet extends HttpServlet {
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ HttpSession currentSession = req.getSession();
+ Field field = extractField(currentSession);
+ int index = getSelectedIndex(req);
+ Sign currentSign = field.getField().get(index);
+ if (EMPTY != currentSign) {
+ RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp");
+ dispatcher.forward(req, resp);
+ return;
+ }
+
+ field.getField().put(index, CROSS);
+ int emptyFieldIndex = field.getEmptyFieldIndex();
+ if (checkWinner(field, currentSession, resp)) {
+ return;
+ }
+ if (emptyFieldIndex != -1) {
+ field.getField().put(emptyFieldIndex, NOUGHT);
+ if (checkWinner(field, currentSession, resp)) {
+ return;
+ }
+ } else {
+ currentSession.setAttribute("draw", true);
+ List data = field.getFieldData();
+ currentSession.setAttribute("data", data);
+ resp.sendRedirect("/index.jsp");
+ return;
+ }
+
+ List data = field.getFieldData();
+ currentSession.setAttribute("data", data);
+ currentSession.setAttribute("field", field);
+ resp.sendRedirect("/index.jsp");
+ }
+
+ private int getSelectedIndex(HttpServletRequest request) {
+ String click = request.getParameter("click");
+ boolean isNumeric = click.chars().allMatch(Character::isDigit);
+ return isNumeric ? Integer.parseInt(click) : 0;
+ }
+
+ private Field extractField(HttpSession currentSession) {
+ Object fieldAttribute = currentSession.getAttribute("field");
+ if (Field.class != fieldAttribute.getClass()) {
+ currentSession.invalidate();
+ throw new RuntimeException("Session is broken, try one more time");
+ }
+ return (Field) fieldAttribute;
+ }
+
+ private boolean checkWinner(Field field, HttpSession currentSession, HttpServletResponse resp) throws IOException {
+ var winner = field.checkWin();
+ if (winner != EMPTY) {
+ currentSession.setAttribute("winner", winner);
+ List data = field.getFieldData();
+ currentSession.setAttribute("data", data);
+ resp.sendRedirect("/index.jsp");
+ return true;
+
+ }
+ return false;
+ }
+
+}
+
diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp
index 964cc071..80ebb49a 100644
--- a/src/main/webapp/index.jsp
+++ b/src/main/webapp/index.jsp
@@ -1,17 +1,59 @@
+<%@ page import="com.tictactoe.Sign" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Tic-Tac-Toe
+
+ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+ ">
Tic-Tac-Toe
+
+
+ | ${data.get(0).getSign()} |
+ ${data.get(1).getSign()} |
+ ${data.get(2).getSign()} |
+
+
+ | ${data.get(3).getSign()} |
+ ${data.get(4).getSign()} |
+ ${data.get(5).getSign()} |
+
+
+ | ${data.get(6).getSign()} |
+ ${data.get(7).getSign()} |
+ ${data.get(8).getSign()} |
+
+
+
+
+ You win
+
+
+ You lose
+
+
+ Draw
+
+
+ Playing
+
-
-
-
\ No newline at end of file
+