我有一个简单的 JSP,它对我的简单数据库的表进行选择并显示结果:
<%--
<%@page import="javax.swing.JOptionPane"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page contentType="text/html" pageEncoding="UTF-8"
import="model.User"%>
<%! public void deleteUser(int id) {
Connection c1 = null;
PreparedStatement ps = null;
try {
Class.forName("org.postgresql.Driver");
c1 = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/postgres",
"postgres", "admin");
c1.setAutoCommit(false);
System.out.println("Opened database successfully" + "\n");
System.out.println("PROVA PROVA PROVA" + "\n");
ps = c1.prepareStatement("DELETE FROM users WHERE user_id = ? ");
ps.setInt(1, id);
ResultSet rs1 = ps.executeQuery();
rs1.close();
ps.close();
c1.close();
JOptionPane.showInputDialog("Player Deleted");
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
}
%>
<!DOCTYPE html>
<head>
<link rel="stylesheet" type="text/css" href="layout.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Registered users</title>
<input Type="BUTTON" Value="Home Page" onclick="location.href = 'index.html'">
</head>
<body>
<h1>Registered users</h1>
<p>
<%
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/firstapp",
"postgres", "admin");
c.setAutoCommit(false);
System.out.println("Opened database successfully" + "\n");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users;");
while (rs.next()) {
int id = rs.getInt("user_id");
String firstname = rs.getString("firstname");
String lastname = rs.getString("lastname");
String country = rs.getString("country");
User u = (User) request.getAttribute("user"); %>
First Name: <% out.print(firstname); %> <br/>
Last Name: <% out.print(lastname); %> <br/>
Country: <% out.print(country); %> <br/>
<input Type="BUTTON" Value="Delete" onclick=<%deleteUser(id);%>>
<p/>
<%
}
rs.close();
stmt.close();
c.close();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}%>
</p>
</body>
每条记录都有一个“删除”按钮,在该按钮下方应允许删除相应的记录。
但是,当调用 deleteUser 方法时,准备好的语句失败,我在控制台中收到以下消息:表“users”不存在。
这是为什么呢?这是因为我调用 deleteUser 方法并打开另一个到数据库的连接,而另一个到同一个数据库的连接已经打开(因此找不到表)?
我该如何解决这个问题?
我还想在删除完成后返回到我的简单 Web 应用程序主菜单 (index.html)。你能帮我解决这个问题吗?
非常感谢!
最佳答案
您的代码中几乎没有问题:
-
deleteUser
中的连接字符串与 JSP 的主要部分不同。这就是为什么Users
找不到表。 -
Java
代码在服务器上执行;在浏览器收到页面之前。因此,您不能在onClick
上调用 Java 代码。如你所愿。在您的代码中,您实际上会在显示记录后立即将其删除。 - 如其他人所述
JOptionPane.showInputDialog("Player Deleted");
将不起作用,因为它是对桌面 GUI 中使用的 Swing 对象的调用。 - 不要将 SQL 放入您的 JSP(或 Java 脚本)中。 (请注意,我了解您目前正在学习,需要逐步进步,所以这是可以接受的)。
- 如 Joop 所述,使用
ps.executeUpdate();
供您删除。 - 正如 joop 所提到的,删除
<!--
在代码的顶部 - 同时删除
<input>
在你的<head>
部分。它与那里无关。
最接近您的代码的解决方案是检查是否有 id
请求中的参数并删除相应的记录(如果存在)。 onClick
只会重定向到正确设置了 id 参数的同一页面。
更好的方法是将所有数据库代码放在一个 servlet 中,然后进行 AJAX 调用以删除记录,甚至获取数据。您可以找到有关 simple ajax calls 的教程或 about displaying records with ajax calls .还有一个nice answer on SO .注意他们都使用 JQuery进行 Ajax 调用。
当您对此感到满意时,您可以更进一步并使用 JAX-RS而不是简单的 serlvet。
关于java - 在 JSP 中删除不起作用(表不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281291/