我一直在开始学习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>
答案 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编写一些控制台游戏。专注于干净的代码。观看一些有意编程的视频,避免网络内容的复杂化,直到你的排骨更好。