Erro JSP passar parametro e salvar Banco de Dados

4 respostas
jspmysqljava
R

Boa tarde a todos. Estou tentando criar uma aplicação simples que vai receber valores numa página chamada “login.jsp” e nela o usuário vai selecionar em dois campos select´s uma classe e um bimestre, como mostrado abaixo:
login.jsp

//aqui em cima a conexão com o banco esta OK.
<!-- colocar o select aqui e pegar valor dele e listar as classes pelo Listar -->
<div class="container">
	<div class="col-xs-4 col-sm-4 col-lg-4 p-1 mb-2 bg-white border border-1 border-secondary rounded float-start">
	<h2>Selecione abaixo a classe para lançamentos das notas e faltas</h2>
	<br>
	</div>
	<div class="col-xs-4 col-sm-4 col-lg-4 p-1 mb-2 bg-white border border-1 border-secondary rounded float-start">
	<form method="post" action="abrirClasse.jsp">
	
	<select class="form-select form-select-sm" name="classe">
		<option value="" enabled>Selecione a classe</option>
		<option value="1º ANO A" > ANO A</option>
		<option value="1º ANO B" > ANO B</option>
		<option value="2º ANO A" > ANO A</option>
		<option value="2º ANO B" > ANO B</option>
		<option value="3º ANO A" > ANO A</option>
		<option value="3º ANO B" > ANO B</option>
		<option value="3º ANO C" > ANO C</option>
		<option value="4º ANO A" > ANO A</option>
		<option value="4º ANO B" > ANO B</option>
		<option value="5º ANO A" > ANO A</option>
		<option value="5º ANO B" > ANO B</option>
	</select>
	<br><br>
		<select class="form-select form-select-sm" name="bimestre">
		<option value="" enabled>Selecione o Bimestre</option>
		<option value="1º BIMESTRE"> BIMESTRE</option>
		<option value="2º BIMESTRE"> BIMESTRE</option>
		<option value="3º BIMESTRE"> BIMESTRE</option>
		<option value="4º BIMESTRE"> BIMESTRE</option>
		<option value="5º CONCEITO"> CONCEITO</option>
	</select>
		<br><br>
	        <div class="text-center">
				<input class="btn btn-success w-100" name ="listar" id="listar" type="submit" value="Listar Alunos">
            </div>
	</form>
	<br>
   </div>
</div>

Depois disso vai para a outra página chamada “abrirClasse.jsp” que recebe a classe selecionada acima e o bimestre pelos select´s. E com essas informações ele pega do banco alunos e cria uma TABELA HTML com inputs em cada disciplina, como esta no abaixo:

abrirClasse.jsp

<%
	try
	{//inicio try
		
	if(rs.next() == false){//inicio if
		
		response.sendRedirect("erro2.html");
		
	}//fim if
	else				//VER COMO SALVAR TUDO AO MESMO TEMPO NO BANCO DEPOIS DE CLICAR NO SALVAR
	{//inicio else
		out.println("<h2 class='text-center'>Classe: <strong>"+classe+"</strong> &nbsp&nbsp<strong>"+bimestre+".</strong></h2>");
		out.println("<br>");
		%>
		<!-- AQUI TEM DE CRIAR UMA TABELA, CABEÇALHO ANTES E COLOCAR ESSA PARTE DO BANCO LOGO EM SEGUIDA -->
		<form method="post" class="form-control" action="salvarNotas.jsp">
		<!--<input type="hidden" name="id" size="30" required value="<% //rs.getInt(1); %>"/>-->
		<table id="notas" name="notas" class="border border-dark table text-nowrap table-bordered table-sm table-success table-striped">
		<tr><th></th><th></th><th>Disciplinas</th><th id="Português">Português</th><th id="História">História</th><th id="Geografia">Geografia</th><th id="Ciências">Ciências</th>
		<th id="Matemática">Matemática</th><th id="Ed. Física">Ed. Física</th><th id="Ed. Artística">Ed. Artística</th><th id="Inglês">Inglês</th><th id="Prod. Textual">Prod. Textual</th>
		<th id="Exp. Matemática">Exp. Matemática</th><th></th></tr>
		<tr><th>Id Aluno</th><th> Cl.</th><th>Nomes</th><th>Conceito</th><th>Conceito</th>
		<th>Conceito</th><th>Conceito</th><th>Conceito</th><th>Conceito</th>
		<th>Conceito</th><th>Conceito</th><th>Conceito</th><th>Conceito</th><th>Faltas</th></tr><% 
		do
		{ //inicio do %>	
			<tr><td  id="idAluno" name="idAluno" class="text-center"><%= rs.getInt(1) %></td>
			<td id="quant" class="text-center"><%= i+=1 %></td>
			<td><%= rs.getString(2) %></td>
			<td><input class="form-control" type="text" id="notaPort" name="notaPort" /></td>
			<td><input class="form-control" type="text" id="notaHist" name="notaHist" /></td>
			<td><input class="form-control" type="text" id="notaGeo" name="notaGeo" /></td>
			<td><input class="form-control" type="text" id="notaCien" name="notaCien" /></td>
			<td><input class="form-control" type="text" id="notaMat" name="notaMat" /></td>
			<td><input class="form-control" type="text" id="notaEdFis" name="notaEdFis" /></td>
			<td><input class="form-control" type="text" id="notaEdArt" name="notaEdArt" /></td>
			<td><input class="form-control" type="text" id="notaIng" name="notaIng" /></td>
			<td><input class="form-control" type="text" id="notaProdT" name="notaProdT" /></td>
			<td><input class="form-control" type="text" id="notaExpM" name="notaExpM" /></td>
			<td><input class="form-control" type="text" id="faltas" name="faltas" /></td></tr>

		<%}/*fim do*/ while(rs.next());
	}//fim else %>

		</table>
		<div class="row">
		    <input class="btn btn-success w-100" type="submit" value="Salvar">
		</div>
        </form>
	<%}//fim try
	
	
		catch(Exception e)
							{
							e.getStackTrace();
							}
%>

E depois que o usuário terminar de lançar notas e clicar no botão “SALVAR” ele vai inserir no banco no arquivo “salvarNotas.jsp” que segue e onde vou falar quais as minhas dúvidas:

salvarNotas.jsp

String quant = request.getParameter("quant");
	int quantidade = Integer.parseInt("quant");
	out.println("<br>");
	out.println("<br>");
	out.println("<h3>Elementos em numero de alunos: " + quantidade + "</h2>");
	/*
	
	String bimestre = request.getParameter("bimestre");
	String port = request.getParameter("Português");
	String hist = request.getParameter("História");
	String geo = request.getParameter("Geografia");
	String cien = request.getParameter("Ciências");
	String mat = request.getParameter("Matemática");
	String edfis = request.getParameter("Ed. Física");
	String edart = request.getParameter("Ed. Artística");
	String ing = request.getParameter("Inglês");
	String prodT = request.getParameter("Prod. Textual");
	String expM = request.getParameter("Exp. Matemática");
	String[] idAluno = request.getParameterValues("idAluno");
	String[] notaPort = request.getParameterValues("notaPort");
	String[] notaHist = request.getParameterValues("notaHist");
	String[] notaGeo = request.getParameterValues("notaGeo");
	String[] notaCien = request.getParameterValues("notaCien");
	String[] notaMat = request.getParameterValues("notaMat");
	String[] notaEdFis = request.getParameterValues("notaEdFis");
	String[] notaEdArt = request.getParameterValues("notaEdArt");
	String[] notaIng = request.getParameterValues("notaIng");
	String[] notaProdT = request.getParameterValues("notaProdT");
	String[] notaExpM = request.getParameterValues("notaExpM");
	String[] faltas = request.getParameterValues("faltas");
	
	try{
		Connection con = null;	
		Class.forName("com.mysql.cj.jdbc.Driver");
		con = DriverManager.getConnection("jdbc:mysql://localhost:3306/projetoescola?useTimezone=true&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false", "root", "root");//?useTimezone=true&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
		String sql = "INSERT INTO 'notas' ('conceitos', 'faltas', 'bimestre', 'disciplina', 'FK_idAluno') VALUES (?, ?, ?, ?, ?);";
		PreparedStatement pst = con.prepareStatement(sql);

			for(int i = 0; i < quantidade; i++){
				pst.setString(1, notaPort[i]);
				pst.setString(4, port);
				pst.setString(1, notaHist[i]);
				pst.setString(4, hist);
				pst.setString(1, notaGeo[i]);
				pst.setString(4, geo);
				pst.setString(1, notaCien[i]);
				pst.setString(4, cien);
				pst.setString(1, notaMat[i]);
				pst.setString(4, mat);
				pst.setString(1, notaEdFis[i]);
				pst.setString(4, edfis);
				pst.setString(1, notaIng[i]);
				pst.setString(4, ing);
				pst.setString(1, notaEdArt[i]);
				pst.setString(4, edart);
				pst.setString(1, notaProdT[i]);
				pst.setString(4, prodT);
				pst.setString(1, notaExpM[i]);
				pst.setString(4, expM);
				pst.setString(2, faltas[i]);
				pst.setString(3, bimestre);
				pst.setString(5, idAluno[i]);
				
				pst.addBatch();
		
			}
			
			pst.executeBatch();
	
}  catch (Exception e) {
	 
	
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    String erro = sw.toString(); //Aqui obtenho a String
    out.println("Erro ao cadastrar" + erro);
	//e.printStackTrace();
	//response.sendRedirect( "erro.html?excecao=" + URLEncoder.  encode(e, "ISO-8859-1"));
} */
%>

Esta comentado o trecho que esta com problema.

Minhas dúvidas:
1º Eu preciso que o if do salvarNotas.jsp percorrra a tabela toda no seu tamanho para que p pst…addBatch possa ir fazendo sua parte. De cara da erro de nullpointer. Não estou conseguindo recuperar ali na tabela do arbriClasse.jsp (<td id="quant" class="text-center"><%= i+=1 %></td>) e conveter de String para inteiro (nem com Integer nem com int).

2º Depois que isso resolver, eu também tenho campos no banco que são inteiros e vem das páginas String. É possível resolver isso, antes de guardar no banco? Converter o que veio String para int e depois popular o banco?

3º A melhor maneira de salvar multiplas linhas da tabela no banco é como addBatch()? Teria um outro modo, sem precisar colocar no fim de cada linha da tabela, um salvar?

Se não fui claro, posso me explicar melhor depois. Obrigado desde já.

4 Respostas

L

No início do arquivo abrirClasse.jsp, achei estranho esse if:

if(rs.next() == false){//inicio if
  response.sendRedirect("erro2.html");
}//fim if

O nullPointer talvez seja pq a variável rs esteja null nesse trecho do código.

R

Na verdade isso é apenas para ver se o banco esta ativo. Ali não dá erro algum. Vou postar em separado o erro que esta apresentando, que acho que isso faltou. Obrigado.

R

Um resumo: após o usuário efetuar login com sucesso, selecionar a classe e o bimestre nos dos select´s, ele vai para a página salvarNotas.jsp e nela lança notas (conceitos do tipo String e faltas - tipo inteiro) e ao fim quando clica no salvar, deveria popular o banco mas da esse erro:

org.apache.jasper.JasperException: An exception occurred processing [/salvarNotas.jsp] at line [6]

3: 
4: <%
5: 	String quant = request.getParameter("quant");
6: 	int quantidade = Integer.parseInt("quant");
7: 	out.println("<br>");
8: 	out.println("<br>");
9: 	out.println("<h3>Elementos em numero de alunos: " + quantidade + "</h2>");


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:610)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:499)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:596)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Root Cause

java.lang.NumberFormatException: For input string: "quant"
	java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
	java.base/java.lang.Integer.parseInt(Integer.java:668)
	java.base/java.lang.Integer.parseInt(Integer.java:786)
	org.apache.jsp.salvarNotas_jsp._jspService(salvarNotas_jsp.java:129)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:596)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:596)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Note A pilha de erros completa da causa principal está disponível nos logs do servidor.

De fato no file salvarNotas.jsp tem um comentário grande pq eu estava tentando ver se pelo menos o valor do campo quant onde mostra quantos alunos tem eu consigo recuperar, mas dá o erro acima. E eu queria saber, depois de fazer o if do salvarNotas.jsp funcionar, se dessa forma vai cadastrar no banco correto, assim:

<%
	String quant = request.getParameter("quant");
	int quantidade = Integer.parseInt("quant");
	out.println("<br>");
	out.println("<br>");
	out.println("<h3>Elementos em numero de alunos: " + quantidade + "</h2>");
	//acima eu estou tentando pelo menos recuperar o valor da tabela, do último aluno listado para o if percorrer e começar a adcionar no addBatch() para então, salvar no banco. Isso que eu não sei também se vai dar certo.
	
	String bimestre = request.getParameter("bimestre");
	String port = request.getParameter("Português");
	String hist = request.getParameter("História");
	String geo = request.getParameter("Geografia");
	String cien = request.getParameter("Ciências");
	String mat = request.getParameter("Matemática");
	String edfis = request.getParameter("Ed. Física");
	String edart = request.getParameter("Ed. Artística");
	String ing = request.getParameter("Inglês");
	String prodT = request.getParameter("Prod. Textual");
	String expM = request.getParameter("Exp. Matemática");
	String[] idAluno = request.getParameterValues("idAluno");
	String[] notaPort = request.getParameterValues("notaPort");
	String[] notaHist = request.getParameterValues("notaHist");
	String[] notaGeo = request.getParameterValues("notaGeo");
	String[] notaCien = request.getParameterValues("notaCien");
	String[] notaMat = request.getParameterValues("notaMat");
	String[] notaEdFis = request.getParameterValues("notaEdFis");
	String[] notaEdArt = request.getParameterValues("notaEdArt");
	String[] notaIng = request.getParameterValues("notaIng");
	String[] notaProdT = request.getParameterValues("notaProdT");
	String[] notaExpM = request.getParameterValues("notaExpM");
	String[] faltas = request.getParameterValues("faltas");
	
	try{
		//Conexão com banco
String sql = "INSERT INTO 'notas' ('conceitos', 'faltas', 'bimestre', 'disciplina', 'FK_idAluno') VALUES (?, ?, ?, ?, ?);";
		PreparedStatement pst = con.prepareStatement(sql);

			for(int i = 0; i < quantidade; i++){
				pst.setString(1, notaPort[i]);
				pst.setString(4, port);
				pst.setString(1, notaHist[i]);
				pst.setString(4, hist);
				pst.setString(1, notaGeo[i]);
				pst.setString(4, geo);
				pst.setString(1, notaCien[i]);
				pst.setString(4, cien);
				pst.setString(1, notaMat[i]);
				pst.setString(4, mat);
				pst.setString(1, notaEdFis[i]);
				pst.setString(4, edfis);
				pst.setString(1, notaIng[i]);
				pst.setString(4, ing);
				pst.setString(1, notaEdArt[i]);
				pst.setString(4, edart);
				pst.setString(1, notaProdT[i]);
				pst.setString(4, prodT);
				pst.setString(1, notaExpM[i]);
				pst.setString(4, expM);
				pst.setString(2, faltas[i]);
				pst.setString(3, bimestre);
				pst.setString(5, idAluno[i]);
				
				pst.addBatch();
		
			}
			
			pst.executeBatch();
	
}  catch (Exception e) {
	 
	
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    String erro = sw.toString(); //Aqui obtenho a String
    out.println("Erro ao cadastrar" + erro);
	//e.printStackTrace();
	//response.sendRedirect( "erro.html?excecao=" + URLEncoder.  encode(e, "ISO-8859-1"));
} 
%>

Então é pegar a String na tabela na llinha de numeração dos alunos (o quant) converter em int, percorrer a tabela pegando os valores e colocando no INSERT. Obrigado a todos.

L

Em vez de:

int quantidade = Integer.parseInt("quant");

mude para:

int quantidade = Integer.parseInt(quant);

Provavelmente por falta de atenção, vc está tentando converter a string quant para número, em vez da variável quant.


Comentei sobre o possível nullPointer no IF, pq não vi nenhum código que estaria inicializando a variável rs.

Criado 3 de maio de 2023
Ultima resposta 4 de mai. de 2023
Respostas 4
Participantes 2