我有一个简单的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方法并打开了另一个与DB的连接,而另一个连接到同一个DB的连接已经打开(因此无法找到该表)?
我该如何解决这个问题?
此外,我还想在删除完成后返回到我的简单Web应用程序主菜单(index.html)。你能帮我这个吗?
非常感谢!
答案 0 :(得分:2)
ps.executeQuery();
应该是
ps.executeUpdate();
并删除
JOptionPane.showInputDialog("Player Deleted");
你可以在那里填充一个String变量,以HTML格式显示。 (JOptionPane是swing,桌面应用程序的GUI。)
同样<%--
可能是一个遗留的编辑 - 一个JSP评论。
答案 1 :(得分:2)
您的代码中存在一些问题:
Java
中的连接字符串与JSP的主要部分中的连接字符串不同。这就是无法找到onClick
表的原因。JOptionPane.showInputDialog("Player Deleted");
代码在服务器上执行;在浏览器收到页面之前。因此,您无法按照预期在ps.executeUpdate();
上调用Java代码。在您的代码中,您实际上会在显示它时立即删除记录。<!--
将无效,因为它是对桌面GUI中使用的Swing对象的调用。<input>
进行删除。<head>
id
部分中的onClick
。它没有任何关系。与您的代码最接近的解决方案是检查您的请求中是否有Mike dollar 15
Fred euro 10
Mike euro 4
Fred euro 4
参数,并删除相应的记录(如果存在)。 Mike:
dollar 15
euro 4
Fred:
euro 14
只会重定向到正确设置了id参数的同一页面。
更好的方法是将所有数据库代码放在servlet中,并进行AJAX调用以删除记录甚至获取数据。您可以找到有关simple ajax calls或about displaying records with ajax calls的教程。还有一个nice answer on SO。请注意,它们都使用JQuery来进行Ajax调用。
当你对此感到满意时,你可以更进一步,使用JAX-RS而不是简单的serlvet。
答案 2 :(得分:0)
您已将自动提交设置为false。
c.setAutoCommit(false);
所以我认为你需要在执行delete语句后提交事务。
c.commit();