防止在JSP页面加载时执行SQL语句

时间:2013-11-08 04:17:38

标签: java sql jsp

如何在单击按钮时更新数据的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>

1 个答案:

答案 0 :(得分: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执行不同的操作。您可以尝试这样的事情(请先查看this tutorial) :

<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不是对表单提交进行后处理的地方(使用普通的servlet)

您的代码的另一个问题是,由于此定义,JSP是线程UNsafe

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

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

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