【问题标题】:Unable to update a particular record in table using servlet and jsp无法使用 servlet 和 jsp 更新表中的特定记录
【发布时间】:2014-04-07 10:19:31
【问题描述】:

大家好,我为用户创建了一个 jsp 页面,他们可以在其中更新现有详细信息,并在提交时更新数据库中的记录。

1.> Accountdetails.java

//Java Servlet program responsible for obtaining the user data and updating into   database    
package roseindia.net;

import java.io.*;
import java.sql.*;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Accountdetails 
 */
 @WebServlet("/Accountdetails")
 public class Accountdetails extends HttpServlet {
    private static final long serialVersionUID = 1L;

 /**
  * @see HttpServlet#HttpServlet()
 */
public Accountdetails() {
    super();
    // TODO Auto-generated constructor stub
}


/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
    // TODO Auto-generated method stub
    System.out.println("Servlet is in the doGet method of account details");




}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    System.out.println("Servlet is in the doPost method of account details");

    response.setContentType("text/html");  
    PrintWriter pw = response.getWriter(); 
    pw.println("<html>");
    pw.println("<body>");
    pw.println("<h1>Hello Servlet Post</h1>");
    pw.println("</body>");
    pw.println("</html>");


    Connection conn=null;
    String url="jdbc:mysql://localhost:3306/";
    String dbName="userlogindb";
    String driver="com.mysql.jdbc.Driver";

    try{  
      String Fname = request.getParameter("fname");  
      String Mname = request.getParameter("mname");  
      String Lname = request.getParameter("lname");  
      String Uname = request.getParameter("username");  
      String Emailid = request.getParameter("emailid");  
      String Mobno = request.getParameter("mobno");  
      String Address = request.getParameter("address");  
      String Password1 = request.getParameter("password1");  
      String Password2 = request.getParameter("password2");
      String ID = request.getParameter("id");

      Class.forName(driver);  
      conn = DriverManager.getConnection(url+dbName,"root", "root");

          String update="update registerutable set fname='"+Fname+"', mname='"+Mname+"',    lname='"+Lname+"', username='"+Uname+"', emailid='"+Emailid+"', mobno='"+Mobno+"',    address='"+Address+"', password1='"+Password1+"', password2='"+Password2+"' where    id='"+ID+"' ";   

                System.out.println("The sql is " +update);
                     PreparedStatement pst = (PreparedStatement) conn.prepareStatement(update);


      pst.setString(1,Fname);  
      pst.setString(2,Mname);        
      pst.setString(3,Lname);
      pst.setString(4,Uname);
      pst.setString(5,Emailid);
      pst.setString(6,Mobno);
      pst.setString(7,Address);
      pst.setString(8,Password1);
      pst.setString(9,Password2);
      pst.setString(11,ID);


      int i = pst.executeUpdate();

      String msg=" ";
      if(i!=0){  
        msg="User Updated";

        pw.print(i);
        pw.print("<font size='6' color=blue>" + msg + "</font>");  
        pw.print(" '"+Fname+"'");

      }  
      else{  
        msg="failed to update the data";
        pw.print("<font size='6' color=blue>" + msg + "</font>");
       }  
      pw.close();
      pst.close();
      conn.close();
    }  
    catch (Exception e){  
        e.printStackTrace(); 
    }  

}

 }

2.> successful.jsp

//JSP page which shows existing value and new value to be entered by user.

<form name="myaccountform" action="Accountdetails" method="post">
<table border="1">
<tr>
<td>First name:</td>
<%Object value11 = request.getAttribute("fname");%>
<td><%=value11%></td>
</tr>
<tr>
<td>Enter the new first name:</td>
<td><input type="text" name="fname" value=""></td>
</tr>
<tr>
<td>Middle name:</td>
<%Object value12 = request.getAttribute("mname");%>
<td><%=value12%></td>
</tr>
<tr>
<td>Enter the new middle name:</td>
<td><input type="text" name="mname" value=""></td>
</tr>
<tr>
<td>Last name:</td>
<%Object value13 = request.getAttribute("lname");%>
<td><%=value13%></td>
</tr>
<tr>
<td>Enter the new last name:</td>
<td><input type="text" name="lname" value=""></td>
</tr>
<tr>
<td>Username:</td>
<%Object value14 = request.getAttribute("uname");%>
<td><%=value14%></td>
</tr>
<tr>
<td>Enter new username:</td>
<td><input type="text" name="username" value=""></td>
</tr>
<tr>
<td>Email id:</td>
<%Object value15 = request.getAttribute("emailid");%>
<td><%=value15%></td>
</tr>
<tr>
<td>Enter new email id:</td>
<td><input type="text" name="emailid" value=""></td>
</tr>
<tr>
<td>Mobile number:</td>
<%Object value16 = request.getAttribute("mobno");%>
<td><%=value16%></td>
</tr>
<tr>
<td>Enter new mobile number:</td>
<td><input type="text" name="mobno" value=""></td>
</tr>
<tr>
<td>Address:</td>
<%Object value17 = request.getAttribute("address");%>
<td><%=value17%></td>
</tr>
<tr>
<td>Enter new address:</td>
<td><textarea rows="5" cols="15" name="address"></textarea></td>
</tr>
<tr>
<td>Old password:</td>
<%Object value18 = request.getAttribute("password1");%>
<td><%=value18%></td>
</tr>
<tr>
<td>Enter the new password:</td>
<td><input type="password" name="password1" value=""></td>
</tr>
<tr>
<td>Reenter the new password:</td>
<td><input type="password" name="password2" value=""></td>
</tr>
</table>
<input type="submit">
</form>

3.> web.xml

//mapping between servlet and jsp
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://java.sun.com/xml/ns/javaee"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web- app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LoginExample</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<servlet>
<description>Login Servlet</description>
<display-name>Login</display-name>
<servlet-name>Login</servlet-name>
<servlet-class>roseindia.net.Login</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>

<servlet>
<description>Servlet Example</description>
<display-name>ServletExample</display-name>
<servlet-name>ServletExample</servlet-name>
<servlet-class>servletexample.com.ServletExample</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ServletExample</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>

<servlet>
<description>Account Details</description>
<display-name>Accountdetails</display-name>
<servlet-name>Accountdetails</servlet-name>
<servlet-class>roseindia.net.Accountdetails</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Accountdetails</servlet-name>
<url-pattern>/Accountdetails</url-pattern>
</servlet-mapping>
</web-app>

这里的问题是当填写所有字段并单击提交时无法更新。

进入else部分显示更新数据失败。

当我 sys 出来时它显示 The sql is

update registerutable set 
  fname='admin11', mname='admin11', lname='admin11', username='admin11',
  emailid='admin', mobno='1111', address='admin', password1='admin',  
  password2='admin' 
where id='null'

我也试过了

String ID = request.getParameter("id");

int ID = Integer.parseInt(request.getParameter("id")); 

但仍然无法更新。

请帮我纠正,因为我现在不知道我哪里错了。

【问题讨论】:

  • mysql数据库中ID的数据类型是什么
  • JqueryLearner 数据类型是整数
  • 当你得到 String ID = request.getParameter("id"); jsp上名为id的元素在哪里。
  • 嘿,看看我的更新答案,....

标签: java mysql sql jsp servlets


【解决方案1】:

你的代码:

      pst.setString(9,Password2);
      pst.setString(11,ID);

你做错了:

  pst.setString(9,Password2);
  pst.setString(10,ID);

你应该看看下面这行:

此字段名称,如:(故障页)

      pst.setString(1,Fname);  
      pst.setString(2,Mname);        
      pst.setString(3,Lname);
      pst.setString(4,Uname);
      pst.setString(5,Emailid);
      pst.setString(6,Mobno);
      pst.setString(7,Address);
      pst.setString(8,Password1);
      pst.setString(9,Password2);
      pst.setString(11,ID);

现在你明白你的错误了吗,你应该改变它并编译它。

String update=
  "update registerutable set 
     fname=?, mname=?, lname=?, username=?, emailid=?, 
     mobno=?, address=?, password1=?, password2=? 
   where id=?";   

【讨论】:

  • @Atiq,你应该改变那个整数,比如 (11 to change 10)
  • jmail 抱歉,我不需要更新 10 个字段,所以我故意留下了它
  • 那么您使用了多少字段...查看您使用的代码 10field。但是您为 ID 提供第 11 个字段。只有你得到错误...
  • jmail 我的第 10 个字段是用户类型,由于要求不需要更新
【解决方案2】:

您可以尝试通过用问号替换变量名称来修改对带有引用更新的字符串的赋值,因为您正在使用准备好的语句来执行表更新。

【讨论】:

    【解决方案3】:

    您的代码中有几个错误:


    您的 servlet 似乎没有接收到查询参数 id

    String ID = request.getParameter("id");
    

    此语句必须导致变量ID 持有null

    在您的JSP 中,您没有为id 设置表单变量,因此AccountDetails servlet 没有接收到它。

    因此同样的null 被传递给update 查询语句,它不会更新数据库表中的任何记录。

    update registerutable set 
      fname='admin11', mname='admin11', lname='admin11', username='admin11',
      emailid='admin', mobno='1111', address='admin', password1='admin',  
      password2='admin'
    where id='null'
    

    条件where id='null' 不匹配任何记录,因此不成功。


    您准备好的语句的 sql 字符串格式错误。您应该有 PreparedStatement 的占位符以将值与它们绑定。

    变化:

    String update=
      "update registerutable set 
       fname='"+Fname+"', mname='"+Mname+"', lname='"+Lname+"', 
       username='"+Uname+"', emailid='"+Emailid+"', mobno='"+Mobno+"',
       address='"+Address+"', password1='"+Password1+"', 
       password2='"+Password2+"' where id='"+ID+"' ";   
    

    收件人:

    String update=
      "update registerutable set 
         fname=?, mname=?, lname=?, username=?, emailid=?, 
         mobno=?, address=?, password1=?, password2=? 
       where id=?";   
    

    【讨论】:

    • Ravinder 所以如何纠正它。任何帮助将不胜感激。
    • 在您的 jsp 中添加一个名为 'id' 的隐藏输入字段及其值。该值应该来自其上一页。
    • Ravinder 现在显示 sql is update registerutable set fname='admin11', mname='admin11', lname='admin11', username='admin11', emailid='admin', mobno ='1111', address='admin', password1='admin', password2='admin' where id='16' 但是还是有一个 java.sql.SQLException: Parameter index out of range (1 > number of参数,即 0)。
    • 对于最后一个参数id,它应该是10,而不是11,在您的代码中。将pst.setString(11,ID); 更改为pst.setString(10,ID);
    • 不,我们不会更新表中的10th 列。我们只是在update 查询中为索引10 处的参数设置值。它位于where 子句中的id
    【解决方案4】:

    因为 列 ID

    在 mysql 数据库中的数据类型是 int

    所以改变pst.setString(11,ID);pst.setInt(11,ID);

    但 ID 是一个字符串,所以您需要使用 Integer.parseInt(); 将其转换为 int

    【讨论】:

    • JqueryLearner 不,将其替换为 pst.setInt(11,ID); 时它不起作用;
    • @Atiq 是的,它不起作用,因为表单中没有 where name="ID",刚刚检查过
    • 对不起 JqueryLearner 我不需要更新第 10 个字段,所以我故意离开了它
    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多