gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:52:41 25 4
gpt4 key购买 nike

如何让 SQL 语句在单击按钮时更新数据,而不是在页面加载时执行?

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

我可以设置一个 boolean 值或其他值来防止它在每次加载时为玩家得分加 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>

最佳答案

更新代码始终会被执行,因为您的代码是这样编写的。

这段代码:

<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 是线程不安全的,因为这个定义:

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

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

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

关于java - 防止在 JSP 页面加载时执行 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19851503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com