【问题标题】:How to get id from jsp page to servlet?如何从jsp页面获取id到servlet?
【发布时间】:2025-12-12 19:40:01
【问题描述】:

我有一个在网站上注册的用户列表,当管理员点击批准时,它必须获取 id,然后将该行移动到另一个名为 login 的表...现在这里的问题来自 jsp 如何获取 id在 servlet 中,以便可以将其传递到服务和 DAO 层的方法中。

下面是我的jsp:

<tr bgcolor="white">
<td><b>id</b></td>
<td><b>FirstName</b></td>
<td><b>LastName</b></td>
<td><b>Gender</b></td>
<td><b>Category</b></td>
<td><b>DateOfBirth</b></td>
<td><b>Age</b></td>
<td><b>Address</b></td>
<td><b>Country</b></td>
<td><b>State</b></td>
<td><b>City</b></td>
<td><b>PinCode</b></td>
<td><b>EmailId</b></td>
<td><b>ContactNo</b></td>
<td><b>MobileNo</b></td>
</tr>


 <c:forEach items="${clients}" var="client">
 <tr>
            <td><c:out value="${client.id}"/></td>
            <td><c:out value="${client.firstName}"/></td>
            <td><c:out value="${client.lastName}"/></td>
            <td><c:out value="${client.gender}"/></td>
            <td><c:out value="${client.category}"/></td>
            <td><c:out value="${client.date}"/></td>
            <td><c:out value="${client.age}"/></td>
            <td><c:out value="${client.address}"/></td>
            <td><c:out value="${client.country}"/></td>
            <td><c:out value="${client.state}"/></td>
            <td><c:out value="${client.city}"/></td>
            <td><c:out value="${client.pinCode}"/></td>
            <td><c:out value="${client.emailId}"/></td>
            <td><c:out value="${client.contactNo}"/></td>
            <td><c:out value="${client.mobileNo}"/></td>
            <td><a href="ClientApproveServlet?id=${client.id}">APPROVE</a></td> // I have fetched the id here
            <td><a href="Reject.jsp">REJECT</a></td>
            <td><a href="OnHold.jsp">ONHOLD</a></td>

            </tr>
      </c:forEach>

堆栈跟踪:

java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
    at com.affiliate.DAO.ClientApproveDAO.insertClient(ClientApproveDAO.java:28)
    at com.affiliate.service.ClientApproveService.clientApprove(ClientApproveService.java:12)
    at com.affiliate.servlet.ClientApproveServlet.doGet(ClientApproveServlet.java:35)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2812)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1811)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1725)
    at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
    at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
    at com.affiliate.DAO.ClientApproveDAO.insertClient(ClientApproveDAO.java:23)
    ... 23 more

【问题讨论】:

  • Id 不是数字,因此会抛出数字格式异常。检查Id的值是否为数字。
  • 我没有得到你准备好的语句?insert 查询是什么类型的?里面没有值
  • 嘿,您应该检查以字符串或 int 形式命名数据类型的用户模型。
  • @jmail 你能详细说明一下我没听懂吗??
  • 嘿@user3222718 检查我对用户模型的回答。

标签: java mysql spring jsp servlets


【解决方案1】:

嘿,我解决了它,像这样改变我的 DAO:

public class ClientApproveDAO {

        private DataSource dataSource;
        public void setDataSource(DataSource dataSource) {
       this.dataSource = dataSource;
    }
    Connection conn=null;
    PreparedStatement statement=null;
    ResultSet rs=null;


    public void insertClient(int id) {    
        try{
            conn=dataSource.createConnection();
            PreparedStatement ps=conn.prepareStatement("insert into login(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

            ps.executeUpdate("insert into login(id,FirstName,LastName,Gender,Category,Dateofbirth,Age,Address,Country,State,city,PinCode,EmailId,ContactNo,MobileNo)select * from register where id="+id+"");
            ps.setInt(1, id);

        }
        catch (SQLException e) {
            throw new RuntimeException(e);

    } finally {
            if (rs != null) try { rs.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (conn != null) try { conn.close(); } catch (SQLException ignore) {}
    }


    }

}

感谢大家的帮助,这是我的最终代码,它工作得非常好并且符合预期。

【讨论】:

    【解决方案2】:

    删除${client.id}之间的空格

    <a href="ClientApproveServlet?id= $ {client.id}">
                                       ↑  
    

    应该是

    <a href="ClientApproveServlet?id=${client.id}">
    

    更新

    这意味着我们克服了 NumberFormat。现在,错误出现在 insertClient() 方法中。

    我可以从异常中说您的插入语句的语法是错误的。

    只需添加条件where id=?,因为select * from register 获取所有记录。

    PreparedStatement ps=conn.prepareStatement("insert into login(id,FirstName,
         LastName,Gender,Category,Dateofbirth,Age,Address,Country,State,city,
         PinCode,EmailId,ContactNo,MobileNo)select * from register where id=?");
    ps.setInt(1, id);
    

    【讨论】:

    • 现在出现这个异常: 引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的SQL语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“?”附近使用的正确语法在第 1 行
    • @user3222718 :这意味着我们克服了NumberFormat。现在,错误出现在insertClient() 方法中
    • 是的,我也删除了 where 子句,我已经编辑了问题,请看看并帮助我...
    • 再次检查。它应该更像insert into login (id) values (?)。然后ps.setInt(1, id);
    • 这是添加 where 子句时出现的异常:java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“?”附近使用的正确语法在第 1 行
    【解决方案3】:

    只需检查您的 SQL 查询。我的观点是您的列数不匹配。试着给个赞

    select id,firstname... etc 
    

    而不是

    select * from tablename 
    

    【讨论】:

    • 如果是这样,那么它如何在正确的列名下正确移动整个表...我认为这不是问题所在。 :-(
    • 这样使用PreparedStatement ps=conn.prepareStatement("插入登录名(id,FirstName, LastName,Gender,Category,Dateofbirth,Age,Address,Country,State,city, PinCode,EmailId,ContactNo, MobileNo) 选择 id,firstname,lastname from register where id=?"); ps.setInt(1, id);
    • 造成:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你的SQL语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“?”附近使用的正确语法在第 1 行我在做你说的这个错误。
    【解决方案4】:

    我认为您在 $ {client.id} 中有一个空格,只需将其删除即可。

     <a href="ClientApproveServlet?id= ${client.id}">
    

    我认为您查询的格式也不正确尝试:

     String query ="insert into login(id,FirstName,LastName,Gender,Category,Dateofbirth,Age,"
     " Address,Country,State,city,PinCode,EmailId,ContactNo,MobileNo)"+
     " select id,..,..,.. FROM register; ";
    

    【讨论】:

    • 是的,谢谢你......我已经编辑了这个问题,请看看我删除了插入查询中的空格和 where 子句......但还没有得到想要的输出跨度>
    • 您的插入语句在哪里添加值?
    【解决方案5】:

    好的,你可以试试这个

    在执行此行之前

    public void insertClient(int id) {    
            try{
                conn=dataSource.createConnection();
                PreparedStatement ps=conn.prepareStatement("insert into login(id,FirstName,LastName,Gender,Category,Dateofbirth,Age,Address,Country,State,city,PinCode,EmailId,ContactNo,MobileNo)select * from register");
                ps.setInt(1, id);
                ps.executeUpdate();
            }
            catch (SQLException e) {
                throw new RuntimeException(e);
    

    添加它

     String x=null;
     Resultset rs=conn.prepareStatement("select id from old_table where FirstName='request.getParameter('firstname')'and LastName='request.getParameter('lastname')'.......and so on.
    while(rs.next){
    x=rs.getString('id');
    }
    

    然后使用这个 x 并在你的插入语句中传递它..

    【讨论】:

    • x 是旧表中的 id..这不是您想要的吗?在新表中为新 id 制作另一列。否则我建议您不要在新表上制作列对于名字,姓氏...等。而只需为 id 创建一列。然后将 id 从旧表传递到这个新表,而不是传递所有内容。阅读有关外键的更多信息
    • thnx 解释一下.. 再好不过了
    • @Santino 'Sonny' Corleone 谢谢你的精彩解释。我明白你的意思
    • 你需要一个表单来将值从 jsp 发送到 servlet...你需要表单来发送数据...我会给你一个例子..在request.getParameter("id"); 上尝试 system.out 并告诉我得到了什么..
    • @user3222718 dat 回答了你的问题How to get id from jsp page to servlet? ,因为你说你得到了 system.out servlet 上的 id。
    【解决方案6】:

    您必须将插入代码更改为:

    insert into login (FirstName,LastName,Gender,Category,
    
                         Dateofbirth,Age,Address,Country,State,city,PinCode,
    
                         EmailId,ContactNo,MobileNo)values(?,?,?,?,?,?,?,?,?,?);
    

    你应该像这样检查这个用户模型:

    private int userid;
    public int getUserid()
    {
    return userid;  
    }
    public void setUserid(int userid)
    {
    this.userid=userid; 
    }
    

    您应该为您的插入类型更改此类型:

    public void addUser(User user)
        {
            try
            {
                PreparedStatement preparedStatement=connection.prepareStatement("insert into users (firstname,lastname,dob,email)values(?,?,?,?)");
    
                preparedStatement.setString(1, user.getFirstName());
                preparedStatement.setString(2, user.getLastName());
                preparedStatement.setDate(3, new java.sql.Date(user.getDob().getTime()));
                preparedStatement.setString(4, user.getEmail());
                preparedStatement.executeUpdate();
            }
            catch(SQLException e)
            {
                e.printStackTrace();
            }
        } 
    

    【讨论】:

    • 对于 SQL 查询,它会抛出 SQL 语法错误
    • 你的答案似乎比其他人更合法。其他人甚至没有他们的插入语句的值
    • @user3222718 你是否已经在 d 数据库表中有记录,或者你是否通过插入创建新记录?因为你可以轻松使用更新。
    • 我正在尝试将数据从一个表插入到另一个表,并且是这个 spring mvc 的新手,所以发现它很困难
    • @user3222718 如果是新记录,你需要 id 吗?
    【解决方案7】:

    如果只有一两个值,最简单的方法是将它们放入会话或 cookie 中。

    session.setAttribute("id",id);
    cookie.setAttribute("name",name);
    

    【讨论】: