建议将JSP中的代码移动到Servlet中

时间:2015-09-13 04:33:22

标签: java jsp servlets

我一直在开始学习JavaEE和编程。到目前为止,我已创建了6个不同的JSP程序。我对它感到满意,现在想要做得更好。我知道我需要减少JPS中的代码量。我在JSP表单中包含了一个通用程序,并希望指出哪些部分应该放在servlet中的哪个位置或如何查看它(我应该创建一堆类然后使用servlet将它们放在一起或运行整个一个servlet:/)。 我将每个部分的初步想法放在代码中。 请不要给我答案,我需要努力学习 - 但请让我感动,不要停滞不前。

<%@ page language="java" import ="java.util.*" import="java.math.*" %>

<html>

<head><title>TicTacToe</title></head>

<body>

<h1>TicTacToe</h1>

<% // game state variables to include in the servlet I think
char[][] tiles; // the board
String winner;  
tiles = (char[][]) session.getAttribute("tiles");
winner = (String)session.getAttribute("winner"); 
if (tiles == null || winner == null) {
tiles = new char[3][3];
for (int r=0; r<3; r++) 
  for (int c=0; c<3; c++) 
    tiles[r][c] = ' ';
  winner = new String(""); //not too sure how this should change, I am thinking I would need a class for "winner" maybe
  }
  %>

  <%  // All things dealing with display I am thinking Servlet under processRequest 
  if (request.getParameter("reset") != null) {
for (int r=0; r<3; r++) 
  for (int c=0; c<3; c++) 
    tiles[r][c] = ' ';
winner = new String("");
  }
  %>

  <%  // Pretty sure this needs a person class, maybe put both this one and the "O" player in the same class. 
 boolean didX = false;
 if (winner.equals("")) {
  for (int r=0; r<3; r++) { 
  for (int c=0; c<3; c++) {
    if (request.getParameter("B" + r + c) != null && tiles[r][c] == '     ') {
      tiles[r][c] = 'X';
      didX = true;
    }
   }
  }
 } 
 if (didX) { //thinking ether a winner class to check both or run this in the servlet
// see if "X" player won yet
for (int r=0; r<3; r++) {
  if (tiles[r][0]=='X' && tiles[r][1]=='X' && tiles[r][2] == 'X') {
     winner = new String("X");
  }
  }
  for (int c=0; c<3; c++) {
  if (tiles[0][c]=='X' && tiles[1][c]=='X' && tiles[2][c] == 'X') {
     winner = new String("X");
  }
   }
   if (tiles[0][0]=='X' && tiles[1][1]=='X' && tiles[2][2] == 'X') {
   winner = new String("X");
   }
   if (tiles[0][2]=='X' && tiles[1][1]=='X' && tiles[2][0] == 'X') {
  winner = new String("X");
  }
  }

  // same as with "X" player
  if (didX && winner.equals("")) {
  boolean playable = false;
  for (int r=0; r<3; r++) for (int c=0; c<3; c++) {
  if (tiles[r][c] == ' ') {
    playable = true;
  }
  }
  if (playable) {
  boolean didO = false;
  while (!didO) {
    int r = (int) (Math.random() * 3);
    int c = (int) (Math.random() * 3);
    if (tiles[r][c] == ' ') {
      tiles[r][c] = 'O';
      didO = true;
    }
    }

     // same as with "X" 
    for (int r=0; r<3; r++) {
    if (tiles[r][0]=='O' && tiles[r][1]=='O' && tiles[r][2] == 'O') {
       winner = new String("O");
    }
    }
    for (int c=0; c<3; c++) {
    if (tiles[0][c]=='O' && tiles[1][c]=='O' && tiles[2][c] == 'O') {
      winner = new String("O");
      }
    }
    if (tiles[0][0]=='O' && tiles[1][1]=='O' && tiles[2][2] == 'O') {
     winner = new String("O");
     }
    if (tiles[0][2]=='O' && tiles[1][1]=='O' && tiles[2][0] == 'O') {
     winner = new String("O");
    }
    }
    }
     %>

     <% // I am very lost on where this goes in the servlet, I guess that depends on how it gets laid out
     session.setAttribute("tiles", tiles);
     session.setAttribute("winner", winner);
     %>

     <form action="TicTacToe2.jsp" method="post">

     <table border="1" >

     <tbody>

     <%  // This goes in the servlet I am sure
     for (int r=0; r<3; r++) {
     out.println("<tr>");
     for (int c=0; c<3; c++) {
     out.println("<td><input type=\"submit\" name=\"B" + r + c + "\"" +
    " value=\"" + tiles[r][c] + "\"></td>");
       }
      out.println("</tr>");
     }
     %>

     </tbody>

     </table>

      <%  // Announce winner
      if (!winner.equals("")) {
      out.println("<p>" + winner + " Won!</p>");
      }
      %>

      <p><input type="submit" name="reset" value="Reset"></p>

      </form>

      </body>

       </html>

1 个答案:

答案 0 :(得分:0)

这是一个广泛的问题,因为你正在学习,我会尽力给你一些指示。

作为一个初学者,对于小丢失的代码,JSP很好。一般来说,正如你所推测的那样,视图中的代码很乱,现在被认为非常糟糕。

因此,已经发明了许多许多框架来试图解决这个问题。 Servlet是如此低级,以至于你现在从未真正写过任何真实内容。事实上,JSP试图让Servlet更容易编写。

Web开发的下一个重要步骤是MVC框架(如Struts)的出现,它试图将一个众所周知的OO模式应用于Web开发。

这些已经演变成更复杂的系统,试图为你做很多工作,但其中许多已经发展成为巨大的代码毛球。

现在大多数Java开发人员已经接受了服务器应该扮演数据存储的角色,并且大部分用户界面正在回到客户端(通过UI框架,如Angular,React等)和Javascript / Coffeescript / Clojurescript。

但是,如果你的既定目标是学习服务器端的web开发,那么我建议你查看各种选项,看看有什么共鸣。 Struts很老,但相对容易学习。 Seam更现代,但开始时有很多膨胀。 Wicket在模型/视图分离方面做得很好。

这是一个丛林。

我最好的建议是首先使用System.in和System.out编写一些控制台游戏。专注于干净的代码。观看一些有意编程的视频,避免网络内容的复杂化,直到你的排骨更好。