Servlet异常(java.lang.StackOverflowerError),用于将值从表插入到另一个表

Servlet异常(java.lang.StackOverflowerError),用于将值从表插入到另一个表,java,jsp,servlets,Java,Jsp,Servlets,我正在开发一个servlet应用程序,它在jsp中显示该表,然后在另一个表中插入该表的值(从表中插入一个id到另一个表),正如我使用调试器检查的那个样,从第一个表中读取一个值并将其插入到查找表中并没有问题,但当我在一段时间后单击insert按钮时,我出现了这个错误(java.lang.StackOverflowerError)同样,当我检查mysql表时,我看到的值超过了我插入它的时间,就像一个无限循环。关于我正在读取数据的表,我可以说(表名:class,id(type:int(primary)

我正在开发一个servlet应用程序,它在jsp中显示该表,然后在另一个表中插入该表的值(从表中插入一个id到另一个表),正如我使用调试器检查的那个样,从第一个表中读取一个值并将其插入到查找表中并没有问题,但当我在一段时间后单击insert按钮时,我出现了这个错误(java.lang.StackOverflowerError)同样,当我检查mysql表时,我看到的值超过了我插入它的时间,就像一个无限循环。关于我正在读取数据的表,我可以说(表名:class,id(type:int(primary),null:no,default:none,Extra:AUTO_INCREMENT),name(type: varchar,null:yes,default:current_timestamp),我插入值的表是(表名test,id(type:int(index),null:yes,default:null))

我想再说一遍,除了错误之外,我还有更多的插入,我在sql表中单击jsp(大约100倍以上)

//servlet类
公共类add_课程扩展了HttpServlet{
私有dbutil-dbutil;
@资源(name=“jdbc/web\u student\u tracker”)
私有数据源;
@凌驾
public void init()引发ServletException{
//dbutil=新的dbutil(数据源);
super.init();
试一试{
dbutil=新的dbutil(数据源);
}
捕获(异常exc){
抛出新的ServletException(exc);
}
}
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//列出学生名单;
//试一试{
//student=dbutil.getcourse();
//request.setAttribute(“选择”,学生);
//RequestDispatcher=request.getRequestDispatcher(“/course.jsp”);
//转发(请求、响应);
//}catch(异常e){//TODO自动生成的catch块
//e.printStackTrace();
//		}
试一试{
字符串thecommand=request.getParameter(“命令”);
if(命令==null){
命令=“列表”;
}
开关(命令){
案例“列表”:
列表课程(请求、响应);
打破
案例“插入”:
插入课程(请求、响应);
打破
}
}
捕获(异常exc){
抛出新的ServletException(exc);
}
}
private void insertcourse(HttpServletRequest请求、HttpServletResponse响应)引发异常{
int courseid=Integer.parseInt(request.getParameter(“courseid”);
学生学生=新学生(课程ID);
dbutil.insetcourse(学生);
插入课程(请求、响应);
}
私有void listcourse(HttpServletRequest请求、HttpServletResponse响应)引发异常{
List student=dbutil.getcourse();
request.setAttribute(“选择”,学生);
RequestDispatcher=request.getRequestDispatcher(“/course.jsp”);
转发(请求、响应);
}

}
如果要在表中插入多条记录,为什么不使用
for循环
而不是递归方法

private void insertcourse(HttpServletRequest request, HttpServletResponse response) throws Exception {

    // Assuming you are getting multiple courseid in your request, 
    Object[] courseid = request.getParameter("courseid");
    for(Object obj : courseid)
    {
          student thestudent=new student(courseid);
           dbutil.insetcourse(thestudent);
     }
    request.setAttribute("message", "Records loaded successfully");
 RequestDispatcher dispatcher = request.getRequestDispatcher("/course.jsp");
dispatcher.forward(request,response);


}
插入完成后,将结果分派到Fornten,以便通知用户

如果只想插入一条记录,只需调用
insert
onlynce即可

但是查看jsp代码,您正在为每个记录生成
insert
超链接,因此一次只插入一条记录,在这种情况下,您可以按照下面的代码进行操作

  int courseid = Integer.parseInt(request.getParameter("courseid"));
  student thestudent=new student(courseid);
  dbutil.insetcourse(thestudent);
  request.setAttribute("message", "Records loaded successfully");
  RequestDispatcher dispatcher = request.getRequestDispatcher("/course.jsp");
  dispatcher.forward(request,response);

为什么要递归调用
insertcourse
?这是我如何了解的,当我的servlet中有多个方法时,我应该这样调用它,你认为这会导致插入问题吗?当然会。你没有提供任何中断逻辑,你是在尝试插入一条记录还是多条记录?我正在尝试插入multiple记录,但例如,当我插入3和5而不是表中的3和5时,表中有100个或更多。您能告诉我如何防止这种情况发生吗?谢谢!它现在起作用了。您能告诉我我的错误到底是什么吗?您正在调用
insert
方法本身,但您没有提供任何c如果打破无限循环,这将导致在jvm级别继续将同一类加载到堆栈中,因为它的无限循环、堆栈已满并导致stackoverflow错误。