0

基本的に、データベースをループして、内部のすべての情報を表示しようとしています。概念は理解していますが、Tomcat が次のエラーを出し続けるため、私の実装は明らかに間違っています。

Root cause:

javax.servlet.ServletException: Operation not allowed after ResultSet closed

どんな助けでも大歓迎です。while ループに問題があることはわかっていますが、知識が限られているため、必要な変更を見つけることができません。コードは自由に変更してください。

<%@ page import="java.sql.*" %>

<%
String connectionURL = "jdbc:mysql://addr.to.db:3306/dbname";
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
%>

<html>

<head>
<title>JSP Server Response</title>
</head>

<body>
<h1>JSP Server Response:</h1>

<!--Get information from HTML form for manipulation-->

<%
    String songName = request.getParameter("newSongName");
String artistName = request.getParameter("newArtistName");
String password = request.getParameter("pass");
String radioResults = request.getParameter("dbIO");
%>

<%

Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(connectionURL, "userName", "password");
statement = connection.createStatement();
String query = "SELECT * FROM song_info;";
rs = statement.executeQuery(query);

//Add or Delete Information from DB

if(radioResults.equalsIgnoreCase("insert"))
{
    statement.executeUpdate("INSERT INTO song_info (songTitle, artistName) VALUES                     ('"+artistName+"','"+songName+"')");
}
else if(radioResults.equalsIgnoreCase("delete"))
{
statement.executeUpdate("DELETE FROM song_info WHERE artistName='"+songName+"'");
}
%>

<table>
<tr>
<th>Song Name</th><th>Artist Name</th>
</tr>

<% while(rs.next()){ %>
<tr>
<td align=center> <%= rs.getString("songTitle")%></td>
<td align=center> <%= rs.getString("artistName")%></td>
</tr>
<%}%>
</table>

<%
rs.close();
statement.close();
connection.close();
%>

Information Submitted to Server:

Artist Name: <%=songName%> <br />
Song Name: <%=artistName%> <br />
Password: <%=password%><br />
Radio Button Selection: <%=radioResults%><br /><br />

Password Correct: 

</body>

</html>
4

2 に答える 2

0

問題は、同じStatementオブジェクトを使用して複数のクエリを実行していることです。を再利用すると、以前の実行のStatementようなリソースはすべてResultSet閉じられます。

解決策は、クエリの順序を変更するか (自分の回答で行ったように)、Statementクエリと更新に別々のオブジェクトを使用することです。

また、現在のコードは SQL インジェクションにさらされています。PreparedStatementパラメータ化されたクエリで使用してください。これにより、すべてではないにしてもほとんどの SQL インジェクション攻撃から保護されます。

于 2012-11-15T09:25:44.907 に答える
0

DB のすべての行を 1 つの長い文字列に連結し、その文字列をブラウザに表示するその場しのぎのソリューションを考え出すことができました。

<%

Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(connectionURL, "userName", "dbPass");
statement = connection.createStatement();
String query = "SELECT songTitle, artistName FROM song_info";
rs = statement.executeQuery(query);

String db_contentsORIGINAL = "";

while (rs.next()) {
    String artName = rs.getString("artistName");
    String sName = rs.getString("songTitle");

    String db_entry = "<b>Artist:</b> " + artName + " | " + "<b>Song Title:         </b>" + sName + "<br />";

        db_contentsORIGINAL += db_entry;
}

//Add or Delete Information from DB

if(radioResults.equalsIgnoreCase("insert"))
{
statement.executeUpdate("INSERT INTO song_info (songTitle, artistName) VALUES         ('"+artistName+"','"+songName+"')");
}
else if(radioResults.equalsIgnoreCase("delete"))
{
statement.executeUpdate("DELETE FROM song_info WHERE artistName='"+songName+"'");
}

%>
于 2012-11-15T00:45:52.877 に答える