【问题标题】:Delete row from db using jsp使用jsp从数据库中删除行
【发布时间】:2015-09-21 18:50:59
【问题描述】:

问题在于,当我在 deleteData 中的 userNotes.jsp 测试函数中单击 DELETE 按钮时 - out.println(value) 有效 - 它向我显示了按钮上单击的当前值,但是没有其他的。它不会从数据库中删除数据,也不会在响应中发送重定向,我需要做什么?
userNotes.jsp

                        <table id="notes" border="2">
                            <tr>

                                <td>note name</td>
                                <td>note</td>

                            </tr>
                            <%
                                PrintWriter writer = response.getWriter();
                                int id = Integer.parseInt(request.getParameter("r"));
                                try {
                                    Class.forName("com.mysql.jdbc.Driver");
                                    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/evernoteDB",
                                            "evernoteDB", "0633739768z");

                                    Statement st = con.createStatement();
                                    ResultSet rs;
                                    rs = st.executeQuery("SELECT * FROM note");

                                    while (rs.next())
                                    {
                            %>
                            <tr>
                                <td><%=rs.getString(1) %></td>
                                <td><%=rs.getString(2) %></td>
                                <td>

                                            <a href=deleteData?id=<%=rs.getString(1) %>> Delete </a>

                                </td>
                       </tr>
                            <%

                                    }
                                    rs.close();
                                    st.close();
                                    con.close();
                                }
                                catch(ClassNotFoundException e)
                                {
                                    writer.println("Couldn't load database driver: " + e.getMessage());
                                }
                                catch(SQLException e)
                                {
                                    writer.println("SQLException caught: " + e.getMessage());
                                }
                                catch (Exception e)
                                {
                                    writer.println(e);
                                }

                            %>
                        </table>

deleteData - servlet

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.*;
import java.sql.*;


@WebServlet("/deleteData")
public class deleteData extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();


    String value = request.getParameter("id");
    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/evernoteDB",
                "evernoteDB", "0633739768z");


        Statement st = conn.createStatement();

        st.executeUpdate("DELETE FROM note WHERE noteName=" + value);
        out.print(value);
            response.sendRedirect("http://localhost:8080/userNotes.jsp");

        conn.close();
    }
    catch(Exception e){
        e.printStackTrace();
    }
  }
}

【问题讨论】:

  • 将您的业务逻辑保留在 Java 类/EJB 中,并且仅将 JSP 用于视图层
  • 从技术上讲,你可以这样做,我们甚至可以用上面的代码解决问题。但是,原则上,我认为从 JSP 访问数据库并不正确。数据库操作应该在网页上实现,因为它们属于服务器端。

标签: java mysql jsp jdbc web


【解决方案1】:

noteName 列的类型为 String,因此您的执行查询应引用该值。

st.executeUpdate("DELETE FROM note WHERE noteName='" + value + "'");

考虑改用PreparedStatement。它很安全,也能处理此类错误。

而且由于您正在重定向,因此您不应该尝试设置任何内容标题。删除以下内容,因为 servlet 不应该写入任何响应,而是重定向。

response.setContentType("text/html");
PrintWriter out = response.getWriter();

另外,不要像这样对主机和端口号进行硬编码,否则您将无法将生成的 war 部署到不同的服务器上。使用带有 sendRedirect() 的相对 URL,例如

conn.close();
response.sendRedirect("/userNotes.jsp");
return;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多