0

我怎样才能有一个 SQL 语句在单击按钮时更新数据,而不是在页面加载时执行?

我有一个非常简单的表格,其中包含球员姓名、球员得分和球员 ID 属性,并且只有一行。当我在此页面上时,我希望按钮执行更新查询以增加玩家得分,但每次页面加载时都会发生这种情况。

是否有一个布尔值或我可以设置的东西来防止它在每次加载时将玩家分数加 1?

请不要问我为什么在这种情况下使用 JSP。这样做不好,我知道,但这是我的要求。

这是我的代码:

<%@ page contentType="text/html" %>
<%@ page import="java.text.DecimalFormat" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.lang*" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Player scores</title>
    <script>
      function reloadPage() {
        location.reload();
      }
    </script>
  </head>    
  <body>
  <%!
    String name = "";
    Integer score = 0;
    Integer pID = 0;
  %>
  <form name="form1" method="POST" onsubmit="return false">
    <p align="center">
      <input type="BUTTON" value="+" onclick="reloadPage();"/>
    </p>

    <%
      try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
        Statement stmnt = conn.createStatement();
        stmnt.executeUpdate("update players set playerScore=playerScore+1 where playerID=1");
      } catch (Exception e) {
      }
    %>
  </form>

  <%
  try {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
    Statement stmnt = conn.createStatement();
    ResultSet rs = stmnt.executeQuery("select playerID, playerName, playerScore from players where playerID=1");
    if (rs.next()) {
       name = rs.getString("playerName");
       score = rs.getInt("playerScore");
       pID = rs.getInt("playerID");
    } else {
      name = "-";
      score = 0;
      pID = 404;
    }
  } catch(Exception e) {
  }
  %>
  <table align="center">
    <tr>
      <th>Player name:</th>
      <td id="pID"><%=name%></td>
    </tr>
    <tr>
      <th>Player score:</th>
      <td id="pN"><%=score%></td>
    </tr>
    <tr>
      <th>Player id:</th>
      <td id="pi"><%=pID%></td>
    </tr>
    <p class="center">
      <a href="Page2.jsp">Go back</a>
    </p>
  </table>
</body>
</html>
4

1 回答 1

1

更新代码总是被执行,因为你的代码是这样写的。

这段代码:

<form name="form1" method="POST" onsubmit="return false">
    <p align="center">
      <input type="BUTTON" value="+" onclick="reloadPage();"/>
    </p>

调用:

<script>
  function reloadPage() {
    location.reload();
  }
</script>

只是没有额外参数的刷新。您总是执行 GET。

+当您单击按钮时,您需要告诉 JSP 做一些不同的事情。你可以尝试这样的事情(请先看看这个教程):

<form name="form1" method="POST" action="yourJSPWhateverIsCalled.jsp">
  <p align="center">
    <input type="submit" value="+" name="increaseScore" />
  </p>

然后使用以下代码保护您的更新代码if

<%
  if (request.getParameter("increaseScore") != null) {
    try {
      Class.forName("com.mysql.jdbc.Driver");
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
      Statement stmnt = conn.createStatement();
      stmnt.executeUpdate("update players set playerScore=playerScore+1 where playerID=1");
    } catch (Exception e) {
    }
  }
%>

Class.forName只需要一次,您可以重用连接来创建语句,但这是另一回事。此外,JSP 不是对表单提交进行后处理的地方(使用普通的 vanilla servlet)

您的代码的另一个问题是,由于以下定义,JSP 是线程不安全的:

<%!
    String name = "";
    Integer score = 0;
    Integer pID = 0;
%>

如果您使用<%!代码,则在您的 JSP 被转换为 servlet 时将代码放置在 servlet 类级别,而不是_jspService在它所属的方法内。您基本上是在向 JSP 添加状态,这是线程不安全的,因为 servlet 容器可以重用相同的 servlet 实例来处理多个请求。

最后,我强烈建议您在继续之前阅读 JSP 教程。官方教程在这里

于 2013-11-08T21:44:53.987 回答