diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..42129f3b --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +.idea +/target +*.iml +/lib +.DS_Store \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..aa00ffab --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..0e338d81 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..ae8927aa --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +To run the project, please run EmbeddedTomcat.java and go to http://localhost:8081/start \ No newline at end of file diff --git a/pom.xml b/pom.xml index cb226e88..b01e9ea0 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,23 @@ jstl 1.2 + + + org.apache.tomcat.embed + tomcat-embed-core + 9.0.99 + + + org.apache.tomcat.embed + tomcat-embed-jasper + 9.0.99 + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + diff --git a/src/main/java/com/tictactoe/InitServlet.java b/src/main/java/com/tictactoe/InitServlet.java new file mode 100644 index 00000000..327ef3e6 --- /dev/null +++ b/src/main/java/com/tictactoe/InitServlet.java @@ -0,0 +1,25 @@ +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; +import java.util.Map; + +@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(); + Map fieldData = field.getField(); + 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..5b5514c0 --- /dev/null +++ b/src/main/java/com/tictactoe/LogicServlet.java @@ -0,0 +1,77 @@ +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; + +@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 (Sign.EMPTY != currentSign) { + RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp"); + dispatcher.forward(req, resp); + return; + } + field.getField().put(index, Sign.CROSS); + if (checkWin(resp, currentSession, field)) { + return; + } + int emptyFieldIndex = field.getEmptyFieldIndex(); + if (emptyFieldIndex >= 0) { + field.getField().put(emptyFieldIndex, Sign.NOUGHT); + if (checkWin(resp, currentSession, field)) { + 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 boolean checkWin(HttpServletResponse response, HttpSession currentSession, Field field) throws IOException { + Sign winner = field.checkWin(); + if (Sign.CROSS == winner || Sign.NOUGHT == winner) { + currentSession.setAttribute("winner", winner); + List data = field.getFieldData(); + currentSession.setAttribute("data", data); + response.sendRedirect("/index.jsp"); + return true; + } + return false; + } + + 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; + } +} \ No newline at end of file diff --git a/src/main/java/com/tictactoe/RestartServlet.java b/src/main/java/com/tictactoe/RestartServlet.java new file mode 100644 index 00000000..019c3ce8 --- /dev/null +++ b/src/main/java/com/tictactoe/RestartServlet.java @@ -0,0 +1,16 @@ +package com.tictactoe; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "RestartServlet", value = "/restart") +public class RestartServlet extends HttpServlet { + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + req.getSession().invalidate(); + resp.sendRedirect("/start"); + } +} diff --git a/src/main/java/org/example/EmbeddedTomcat.java b/src/main/java/org/example/EmbeddedTomcat.java new file mode 100644 index 00000000..c7178ba4 --- /dev/null +++ b/src/main/java/org/example/EmbeddedTomcat.java @@ -0,0 +1,47 @@ +package org.example; + +import org.apache.catalina.Context; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.startup.Tomcat; +import com.tictactoe.InitServlet; +import com.tictactoe.LogicServlet; +import com.tictactoe.RestartServlet; +import java.io.File; + +public class EmbeddedTomcat { + public static void main(String[] args) throws LifecycleException { + Tomcat tomcat = new Tomcat(); + tomcat.setPort(8081); + + String webappDirLocation = new File("src/main/webapp/").getAbsolutePath(); + File webAppDir = new File(webappDirLocation); + + if (!webAppDir.exists()) { + System.err.println("Error: The webapp folder was not found! Path: " + webAppDir.getAbsolutePath()); + return; + } + + Context context = tomcat.addWebapp("", webAppDir.getAbsolutePath()); + + if (context == null) { + System.err.println("Error: Tomcat context was not created! There may be an issue with webapp."); + return; + } + + Tomcat.addServlet(context, "InitServlet", new InitServlet()); + Tomcat.addServlet(context, "LogicServlet", new LogicServlet()); + Tomcat.addServlet(context, "RestartServlet", new RestartServlet()); + + context.addServletMappingDecoded("/start", "InitServlet"); + context.addServletMappingDecoded("/logic", "LogicServlet"); + context.addServletMappingDecoded("/restart", "RestartServlet"); + + System.out.println("Starting Tomcat. Open in your browser: http://localhost:8081/start"); + + tomcat.getConnector(); + + tomcat.start(); + tomcat.getServer().await(); + } +} + diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 964cc071..13d1dfa6 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -1,16 +1,64 @@ +<%@ page import="com.tictactoe.Sign" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + + <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + Tic-Tac-Toe

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()}
- diff --git a/src/main/webapp/static/main.css b/src/main/webapp/static/main.css index e69de29b..ee95757a 100644 --- a/src/main/webapp/static/main.css +++ b/src/main/webapp/static/main.css @@ -0,0 +1,22 @@ +body { + text-align: center; + font-family: Arial, sans-serif; +} + +table { + margin: auto; + border-collapse: collapse; +} + +td { + width: 60px; + height: 60px; + text-align: center; + font-size: 24px; + border: 2px solid black; + cursor: pointer; +} + +td:hover { + background-color: #f0f0f0; +} diff --git a/tomcat.8081/work/Tomcat/localhost/ROOT/org/apache/jsp/index_jsp.class b/tomcat.8081/work/Tomcat/localhost/ROOT/org/apache/jsp/index_jsp.class new file mode 100644 index 00000000..faec56af Binary files /dev/null and b/tomcat.8081/work/Tomcat/localhost/ROOT/org/apache/jsp/index_jsp.class differ diff --git a/tomcat.8081/work/Tomcat/localhost/ROOT/org/apache/jsp/index_jsp.java b/tomcat.8081/work/Tomcat/localhost/ROOT/org/apache/jsp/index_jsp.java new file mode 100644 index 00000000..4c44129d --- /dev/null +++ b/tomcat.8081/work/Tomcat/localhost/ROOT/org/apache/jsp/index_jsp.java @@ -0,0 +1,363 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.99 + * Generated at: 2025-03-01 21:27:30 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; +import com.tictactoe.Sign; + +public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map _jspx_dependants; + + static { + _jspx_dependants = new java.util.HashMap(2); + _jspx_dependants.put("file:/Users/nastya/.m2/repository/javax/servlet/jstl/1.2/jstl-1.2.jar", Long.valueOf(1308849601000L)); + _jspx_dependants.put("jar:file:/Users/nastya/.m2/repository/javax/servlet/jstl/1.2/jstl-1.2.jar!/META-INF/c.tld", Long.valueOf(1153374282000L)); + } + + private static final java.util.Set _jspx_imports_packages; + + private static final java.util.Set _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.LinkedHashSet<>(4); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = new java.util.LinkedHashSet<>(2); + _jspx_imports_classes.add("com.tictactoe.Sign"); + } + + private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005furl_0026_005fvalue_005fnobody; + private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody; + private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005fif_0026_005ftest; + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map getDependants() { + return _jspx_dependants; + } + + public java.util.Set getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + _005fjspx_005ftagPool_005fc_005furl_0026_005fvalue_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig()); + _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig()); + _005fjspx_005ftagPool_005fc_005fif_0026_005ftest = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig()); + } + + public void _jspDestroy() { + _005fjspx_005ftagPool_005fc_005furl_0026_005fvalue_005fnobody.release(); + _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody.release(); + _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.release(); + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + javax.servlet.http.HttpSession session = null; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html;charset=UTF-8"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, true, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + session = pageContext.getSession(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("\n"); + out.write("\n"); + out.write("\n"); + out.write("\n"); + out.write("\n"); + out.write("\n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" Tic-Tac-Toe\n"); + out.write("\n"); + out.write("\n"); + out.write("

Tic-Tac-Toe

\n"); + out.write("\n"); + out.write("\n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write(" \n"); + out.write("
"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(0).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write(""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(1).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write(""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(2).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("
"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(3).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write(""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(4).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write(""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(5).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("
"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(6).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write(""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(7).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write(""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${data.get(8).getSign()}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("
\n"); + out.write("\n"); + out.write("
\n"); + // c:set + org.apache.taglibs.standard.tag.rt.core.SetTag _jspx_th_c_005fset_005f0 = (org.apache.taglibs.standard.tag.rt.core.SetTag) _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.SetTag.class); + _jspx_th_c_005fset_005f0.setPageContext(_jspx_page_context); + _jspx_th_c_005fset_005f0.setParent(null); + // /index.jsp(34,0) name = var type = java.lang.String reqTime = false required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null + _jspx_th_c_005fset_005f0.setVar("CROSSES"); + // /index.jsp(34,0) name = value type = javax.el.ValueExpression reqTime = true required = false fragment = false deferredValue = true expectedTypeName = java.lang.Object deferredMethod = false methodSignature = null + _jspx_th_c_005fset_005f0.setValue(Sign.CROSS); + int _jspx_eval_c_005fset_005f0 = _jspx_th_c_005fset_005f0.doStartTag(); + if (_jspx_th_c_005fset_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { + return; + } + _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody.reuse(_jspx_th_c_005fset_005f0); + out.write('\n'); + // c:set + org.apache.taglibs.standard.tag.rt.core.SetTag _jspx_th_c_005fset_005f1 = (org.apache.taglibs.standard.tag.rt.core.SetTag) _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.SetTag.class); + _jspx_th_c_005fset_005f1.setPageContext(_jspx_page_context); + _jspx_th_c_005fset_005f1.setParent(null); + // /index.jsp(35,0) name = var type = java.lang.String reqTime = false required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null + _jspx_th_c_005fset_005f1.setVar("NOUGHTS"); + // /index.jsp(35,0) name = value type = javax.el.ValueExpression reqTime = true required = false fragment = false deferredValue = true expectedTypeName = java.lang.Object deferredMethod = false methodSignature = null + _jspx_th_c_005fset_005f1.setValue(Sign.NOUGHT); + int _jspx_eval_c_005fset_005f1 = _jspx_th_c_005fset_005f1.doStartTag(); + if (_jspx_th_c_005fset_005f1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { + return; + } + _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody.reuse(_jspx_th_c_005fset_005f1); + out.write('\n'); + out.write('\n'); + if (_jspx_meth_c_005fif_005f0(_jspx_page_context)) + return; + out.write('\n'); + if (_jspx_meth_c_005fif_005f1(_jspx_page_context)) + return; + out.write('\n'); + if (_jspx_meth_c_005fif_005f2(_jspx_page_context)) + return; + out.write("\n"); + out.write("\n"); + out.write("\n"); + out.write("\n"); + out.write("\n"); + out.write(""); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } + + private boolean _jspx_meth_c_005furl_005f0(javax.servlet.jsp.PageContext _jspx_page_context) + throws java.lang.Throwable { + javax.servlet.jsp.PageContext pageContext = _jspx_page_context; + javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut(); + // c:url + org.apache.taglibs.standard.tag.rt.core.UrlTag _jspx_th_c_005furl_005f0 = (org.apache.taglibs.standard.tag.rt.core.UrlTag) _005fjspx_005ftagPool_005fc_005furl_0026_005fvalue_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.UrlTag.class); + _jspx_th_c_005furl_005f0.setPageContext(_jspx_page_context); + _jspx_th_c_005furl_005f0.setParent(null); + // /index.jsp(9,17) name = value type = null reqTime = true required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null + _jspx_th_c_005furl_005f0.setValue("/static/jquery-3.6.0.min.js"); + int _jspx_eval_c_005furl_005f0 = _jspx_th_c_005furl_005f0.doStartTag(); + if (_jspx_th_c_005furl_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { + return true; + } + _005fjspx_005ftagPool_005fc_005furl_0026_005fvalue_005fnobody.reuse(_jspx_th_c_005furl_005f0); + return false; + } + + private boolean _jspx_meth_c_005fif_005f0(javax.servlet.jsp.PageContext _jspx_page_context) + throws java.lang.Throwable { + javax.servlet.jsp.PageContext pageContext = _jspx_page_context; + javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut(); + // c:if + org.apache.taglibs.standard.tag.rt.core.IfTag _jspx_th_c_005fif_005f0 = (org.apache.taglibs.standard.tag.rt.core.IfTag) _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.IfTag.class); + _jspx_th_c_005fif_005f0.setPageContext(_jspx_page_context); + _jspx_th_c_005fif_005f0.setParent(null); + // /index.jsp(37,0) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null + _jspx_th_c_005fif_005f0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${winner == CROSSES}", boolean.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)).booleanValue()); + int _jspx_eval_c_005fif_005f0 = _jspx_th_c_005fif_005f0.doStartTag(); + if (_jspx_eval_c_005fif_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) { + do { + out.write("\n"); + out.write("

CROSSES WIN!

\n"); + out.write(" \n"); + int evalDoAfterBody = _jspx_th_c_005fif_005f0.doAfterBody(); + if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) + break; + } while (true); + } + if (_jspx_th_c_005fif_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { + return true; + } + _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f0); + return false; + } + + private boolean _jspx_meth_c_005fif_005f1(javax.servlet.jsp.PageContext _jspx_page_context) + throws java.lang.Throwable { + javax.servlet.jsp.PageContext pageContext = _jspx_page_context; + javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut(); + // c:if + org.apache.taglibs.standard.tag.rt.core.IfTag _jspx_th_c_005fif_005f1 = (org.apache.taglibs.standard.tag.rt.core.IfTag) _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.IfTag.class); + _jspx_th_c_005fif_005f1.setPageContext(_jspx_page_context); + _jspx_th_c_005fif_005f1.setParent(null); + // /index.jsp(41,0) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null + _jspx_th_c_005fif_005f1.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${winner == NOUGHTS}", boolean.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)).booleanValue()); + int _jspx_eval_c_005fif_005f1 = _jspx_th_c_005fif_005f1.doStartTag(); + if (_jspx_eval_c_005fif_005f1 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) { + do { + out.write("\n"); + out.write("

NOUGHTS WIN!

\n"); + out.write(" \n"); + int evalDoAfterBody = _jspx_th_c_005fif_005f1.doAfterBody(); + if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) + break; + } while (true); + } + if (_jspx_th_c_005fif_005f1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { + return true; + } + _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f1); + return false; + } + + private boolean _jspx_meth_c_005fif_005f2(javax.servlet.jsp.PageContext _jspx_page_context) + throws java.lang.Throwable { + javax.servlet.jsp.PageContext pageContext = _jspx_page_context; + javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut(); + // c:if + org.apache.taglibs.standard.tag.rt.core.IfTag _jspx_th_c_005fif_005f2 = (org.apache.taglibs.standard.tag.rt.core.IfTag) _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.IfTag.class); + _jspx_th_c_005fif_005f2.setPageContext(_jspx_page_context); + _jspx_th_c_005fif_005f2.setParent(null); + // /index.jsp(45,0) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null + _jspx_th_c_005fif_005f2.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${draw}", boolean.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)).booleanValue()); + int _jspx_eval_c_005fif_005f2 = _jspx_th_c_005fif_005f2.doStartTag(); + if (_jspx_eval_c_005fif_005f2 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) { + do { + out.write("\n"); + out.write("

IT'S A DRAW

\n"); + out.write(" \n"); + int evalDoAfterBody = _jspx_th_c_005fif_005f2.doAfterBody(); + if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) + break; + } while (true); + } + if (_jspx_th_c_005fif_005f2.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { + return true; + } + _005fjspx_005ftagPool_005fc_005fif_0026_005ftest.reuse(_jspx_th_c_005fif_005f2); + return false; + } +}