Исключение сервлета (java .lang.StackOverflowError) для вставки значения из таблицы в другое - PullRequest
0 голосов
/ 31 января 2020

Я разрабатываю приложение сервлета, которое показывает таблицу в jsp и затем вставляет значение этой таблицы в другую таблицу (вставка идентификатора из таблицы в другую таблицу), поскольку я проверил с помощью отладчика, что нет проблем с чтением значение из первой таблицы и вставка его в таблицу подбора, но когда я нажимаю на кнопку вставки через некоторое время, у меня появляется эта ошибка (java .lang.StackOverflowError) также при проверке таблицы mysql, которую я вижу, у меня есть значение больше чем время, когда я вставляю его как бесконечный l oop. о таблице, в которой я читаю данные, которые я могу сказать (имя таблицы: класс, id (тип: int (primary), null: no, default: none, Extra: AUTO_INCREMENT), name (тип: varchar, null: yes, default: current_timestamp)) и таблица, в которую я вставляю значение, (test имени таблицы, id (type: int (index), null: yes, default) : null))

Я хочу еще раз сказать, что помимо ошибки у меня есть дополнительная вставка, которую я нажимаю на jsp в sql таблице (например, в 100 раз больше)

// servlet class
public class add_course extends HttpServlet {
	private dbutil dbutil;
	@Resource(name="jdbc/web_student_tracker")
	private DataSource dataSource;
	@Override
	public void init() throws ServletException {
		//dbutil= new dbutil(dataSource);
		super.init();
		try {
			dbutil=new dbutil(dataSource);
		}
		catch(Exception exc) {
		throw new ServletException(exc);
		}
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		List<student> student;
//		try {
//			student = dbutil.getcourse();
//			request.setAttribute("select",student);
//			RequestDispatcher dispatcher = request.getRequestDispatcher("/course.jsp");
//		dispatcher.forward(request,response);
//		} catch (Exception e) {			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		try {
			String thecommand=request.getParameter("command");
			if(thecommand==null) {
				thecommand="LIST";
			}
			switch(thecommand) {
			case"LIST":
				listcourse(request,response);
				break;
			case"insert":
				insertcourse(request,response);
				break;
			}
		}
		catch(Exception exc) {
			throw new ServletException(exc);
		}
		
	
	}
	private void insertcourse(HttpServletRequest request, HttpServletResponse response) throws Exception {
		int courseid = Integer.parseInt(request.getParameter("courseid"));
		student thestudent=new student(courseid);
		dbutil.insetcourse(thestudent);
		insertcourse(request,response);
		 

	}
	private void listcourse(HttpServletRequest request, HttpServletResponse response) throws Exception {
		List<student> student=dbutil.getcourse();
	request.setAttribute("select",student);
	RequestDispatcher dispatcher = request.getRequestDispatcher("/course.jsp");
	dispatcher.forward(request,response);
	}

}

// db class
public List <student> getcourse() throws Exception{
	List<student> course=new ArrayList<>();
	Connection myConn = null;
	Statement myStmt = null;
	ResultSet myRs = null;
	try {
		
		myConn=dataSource.getConnection();
		String sql="select id from class";
		myStmt=myConn.createStatement();
		myRs=myStmt.executeQuery(sql);
		while (myRs.next()) {
	int id = myRs.getInt("id");
	student tempstudent = new student(id);

				course.add(tempstudent);
	}
	return course;
}
	finally {
		// close JDBC objects
		close(myConn, myStmt, myRs);
	}		
}

public void insetcourse(student thestudent)throws SQLException  {
	Connection myConn = null;
	PreparedStatement myStmt=null;
	/////////
	try {
		myConn = dataSource.getConnection();
		String sql="insert into test"+"(id)"+"value(?)";
		myStmt=myConn.prepareStatement(sql);

		myStmt.setInt(1,thestudent.getId());
		
		myStmt.execute();
		
	}
	finally {
		close(myConn,myStmt,null);
	}
}
}

//jsp page 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<table>
<c:forEach var="tempstudent" items="${select}">
<c:url var="insert" value="add_course">
		<c:param name="command" value="insert"/>
				<c:param name="courseid" value="${tempstudent.id}"/>
			</c:url> 
<tr>
<td>${tempstudent.id}</td>
<td> 
 	<a href="${insert}" 
 						onclick="if (!(confirm('Are you sure you want to insert this student?'))) return false"> 
						
						insert</a>	 
 						</td>	
</tr>

</c:forEach>




</table>

</body>
</html>

1 Ответ

0 голосов
/ 31 января 2020

, если вы хотите вставить несколько записей в таблицу, почему бы не использовать for loop вместо рекурсивного метода.

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);


}

когда вставка завершена, вы отправляете результат в forntend, чтобы пользователь получал уведомление,

, если вы хотите вставить только одну запись, просто вызовите insert onlyonce.

но, глядя на ваш код 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...