Lista com scriplet usando jsp

28 respostas
C

Olá pessoal, tudo bem, estou utilizando a apostila da caelum e desenvolvendo um projeto java para web, e estou tendo o seguinte problema, eu fiz um scriplet em jsp que deveria aparecer uma lista de contatos de uma agenda, só que quando executo no navegador do eclipse luna ou no google chrome, aparece o seguinte erro:

HTTP Status 500 - /lista-contatos-scriplet.jsp (line: 3, column: 17) quote symbol expected


type Exception report

message /lista-contatos-scriplet.jsp (line: 3, column: 17) quote symbol expected

description The server encountered an internal error that prevented it from fulfilling this request.

exception
org.apache.jasper.JasperException: /lista-contatos-scriplet.jsp (line: 3, column: 17) quote symbol expected
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:41)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:275)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:91)
	org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:223)
	org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:163)
	org.apache.jasper.compiler.Parser.parsePageDirective(Parser.java:334)
	org.apache.jasper.compiler.Parser.parseDirective(Parser.java:458)
	org.apache.jasper.compiler.Parser.parseFileDirectives(Parser.java:1782)
	org.apache.jasper.compiler.Parser.parse(Parser.java:136)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227)
	org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:117)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:194)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:570)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:356)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


note The full stack trace of the root cause is available in the Apache Tomcat/8.0.20 logs.

vou mostrar o código em jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import=java.util.*,br.com.caelum.agenda.dao.*,br.com.caelum.agenda.modelo.* %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<table>
		<%
		ContatoDAO dao = new ContatoDAO();
		List<Contato> contatos = dao.getLista();
		
		for(Contato contato : contatos){
		%>
			<tr>
				<td><%= contato.getNome()%></td>
				<td><%= contato.getEmail()%></td>
				<td><%= contato.getEndereco()%></td>
				<td><%= contato.getDataNascimento().getTime() %></td>
			</tr>
		<%
		}
		%>
	</table>
</body>
</html>

Por favor me ajudem

28 Respostas

J

esqueceu as aspas.

C

fiz o que você falou coloquei as aspas, porém apareceu novos erros, que não consegui identificar vou mostrar:

HTTP Status 500 - An exception occurred processing JSP page /lista-contatos-scriplet.jsp at line 13

type Exception report

message An exception occurred processing JSP page /lista-contatos-scriplet.jsp at line 13

description The server encountered an internal error that prevented it from fulfilling this request.

exception
org.apache.jasper.JasperException: An exception occurred processing JSP page /lista-contatos-scriplet.jsp at line 13

10:
11:


12: <%
13: ContatoDAO dao = new ContatoDAO();
14: List contatos = dao.getLista();
15:
16: for(Contato contato : contatos){
Stacktrace:

org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:567)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:469)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause
java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

br.com.caelum.agenda.ConnectionFactory.getConnection(ConnectionFactory.java:16)

br.com.caelum.agenda.dao.ContatoDAO.(ContatoDAO.java:21)

org.apache.jsp.lista_002dcontatos_002dscriplet_jsp._jspService(lista_002dcontatos_002dscriplet_jsp.java:107)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

java.lang.reflect.Constructor.newInstance(Constructor.java:526)

com.mysql.jdbc.Util.handleNewInstance(Util.java:411)

com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)

com.mysql.jdbc.MysqlIO.(MysqlIO.java:348)

com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2391)

com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2428)

com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2213)

com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:797)

com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47)

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

java.lang.reflect.Constructor.newInstance(Constructor.java:526)

com.mysql.jdbc.Util.handleNewInstance(Util.java:411)

com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)

com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)

java.sql.DriverManager.getConnection(DriverManager.java:571)

java.sql.DriverManager.getConnection(DriverManager.java:215)

br.com.caelum.agenda.ConnectionFactory.getConnection(ConnectionFactory.java:12)

br.com.caelum.agenda.dao.ContatoDAO.(ContatoDAO.java:21)

org.apache.jsp.lista_002dcontatos_002dscriplet_jsp._jspService(lista_002dcontatos_002dscriplet_jsp.java:107)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.net.ConnectException: Connection refused: connect

java.net.DualStackPlainSocketImpl.connect0(Native Method)

java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)

java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)

java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)

java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)

java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)

java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

java.net.Socket.connect(Socket.java:579)

java.net.Socket.connect(Socket.java:528)

java.net.Socket.(Socket.java:425)

java.net.Socket.(Socket.java:241)

com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)

com.mysql.jdbc.MysqlIO.(MysqlIO.java:298)

com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2391)

com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2428)

com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2213)

com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:797)

com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47)

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

java.lang.reflect.Constructor.newInstance(Constructor.java:526)

com.mysql.jdbc.Util.handleNewInstance(Util.java:411)

com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)

com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)

java.sql.DriverManager.getConnection(DriverManager.java:571)

java.sql.DriverManager.getConnection(DriverManager.java:215)

br.com.caelum.agenda.ConnectionFactory.getConnection(ConnectionFactory.java:12)

br.com.caelum.agenda.dao.ContatoDAO.(ContatoDAO.java:21)

org.apache.jsp.lista_002dcontatos_002dscriplet_jsp._jspService(lista_002dcontatos_002dscriplet_jsp.java:107)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

note The full stack trace of the root cause is available in the Apache Tomcat/8.0.20 logs.

Apache Tomcat/8.0.20

R

Tenho certeza que o problema não é com o seu jsp. O problema mesmo é com o seu servlet-container, digo o Tomcat-8. Sempre que eu tentei usar essa versão 8 do Tomcat, eu tinha esses problemas. Limpa seu ambiente de trabalho, removendo todas as configurações ou qualquer projeto baseado no Tomcat-8 e coloca o Tomcat-7, depois só volta aqui pra dizer que o problema foi resolvido.

C

Como eu removo as configuraões no tomcat8?

C

Baixei o tomcat 7, porém não consigo adicionar o projeto já existente quando estou configurando o que eu faço?

R

Essas são as configurações que eu disse que você tem que remover.

R

Não da para mim te explicar porque eu não lembro de cabeça onde é, pois eu não uso mais o Java e não tenho nenhuma IDE instalada aqui. Mas faz o seguinte, apenas apaga a pasta do Tomcat-8 e crie um novo workspace para todo o seu ambiente.
Não referencie nenhum projeto antigo que você fez com o Tomcat-8, apenas crie um novo com base somente no Tomcat-7. Você vai poder reaproveitar só as suas classes e arquivos html.

C

troquie o tomcat 8 pelo tomcat 7, mas o erro ainda persiste

A

Parace erro de comunicação com o banco de dados, veja pelos logs:

root cause
java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

root cause
java.net.ConnectException: Connection refused: connect

Da uma verificada se o banco esta de pé, vefifica se a variável dao.getLista(); tem dados nesta lista.

R

Continue usando o tomcat 7, que é mais garantia que vai funcionar. Quando não estiver dando nenhum tipo de erro mais, experimente voltar para o Tomcat-8. Se funcionar, OK!, senão… Quem sabe a versão 9 né!

T

Esta usando jsp puro amigo ? ou mapeando via servelet ?

T

o erro esta na conexao com o banco verifique a linha 16 mostrada abaixo:

br.com.caelum.agenda.ConnectionFactory.getConnection(ConnectionFactory.java:16)

br.com.caelum.agenda.dao.ContatoDAO.(ContatoDAO.java:21)

org.apache.jsp.lista_002dcontatos_002dscriplet_jsp.jspService(lista002dcontatos_002dscriplet_jsp.java:107)
D

Você adicionou o JAR do MySql no seu projeto ?

pode ser na pasta WEB-INF/lib ou ate mesmo direto na pasta lib do seu tomcat.

pois olhei a apostila , e momento algum ele fala sobre aonde colocar o jar do banco no projeto, pode ser isso que esteja faltando.

Q

Olha o erro > The driver has not received any packets from the server.
Manda o código deste dao > ContatoDAO dao = new ContatoDAO();
E por Deus, não use scriplet.

C

Eu adicionei o jar

C

Classe ContatoDAO

package br.com.caelum.agenda.dao;

import java.sql.Connection;

import java.sql.Date;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

import br.com.caelum.agenda.ConnectionFactory;
import br.com.caelum.agenda.modelo.Contato;

public class ContatoDAO {
	
	//a conexão com  banco de dados
	private Connection connection;
	
	public ContatoDAO() throws ClassNotFoundException{
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Contato contato){
		String sql = "insert into contatos " +
					"(nome,email,endereco,dataNascimento)" +
					" values (?,?,?,?)";
		try{
			//prepared statement para a inserção
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			//seta os valores
			stmt.setString(1,contato.getNome());
			stmt.setString(2,contato.getEmail());
			stmt.setString(3,contato.getEndereco());
			stmt.setDate(4,new Date(contato.getDataNascimento().getTimeInMillis()));
			
			//executa
			stmt.execute();
			stmt.close();
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	public List<Contato> getLista(){
		try{
			List<Contato> contatos  = new ArrayList<Contato>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				//criando o objeto contato
				Contato contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				//montando a data através do Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				//adicionando o objeto à lista
				contatos.add(contato);
			}
			rs.close();
			stmt.close();
			return contatos;
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
}
C

vou mandar de novo

package br.com.caelum.agenda.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.agenda.ConnectionFactory;
import br.com.caelum.agenda.modelo.Contato;

public class ContatoDAO {
	
	//a conexão com  banco de dados
	private Connection connection;
	
	public ContatoDAO() throws ClassNotFoundException{
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Contato contato){
		String sql = "insert into contatos " +
					"(nome,email,endereco,dataNascimento)" +
					" values (?,?,?,?)";
		try{
			//prepared statement para a inserção
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			//seta os valores
			stmt.setString(1,contato.getNome());
			stmt.setString(2,contato.getEmail());
			stmt.setString(3,contato.getEndereco());
			stmt.setDate(4,new Date(contato.getDataNascimento().getTimeInMillis()));
			
			//executa
			stmt.execute();
			stmt.close();
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	public List<Contato> getLista(){
		try{
			List<Contato> contatos  = new ArrayList<Contato>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				//criando o objeto contato
				Contato contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				//montando a data através do Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				//adicionando o objeto à lista
				contatos.add(contato);
			}
			rs.close();
			stmt.close();
			return contatos;
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
}
C

Também tô usando uma classe servlet, chamada AdicionaContatoServlet

T

Voce esta usando a urlPatterns com a / ? muitas vezes a falta da barra da alguns erros.

C

Sim, estou usando: vou postar o código

package br.com.caelum.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

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

import br.com.caelum.agenda.dao.ContatoDAO;
import br.com.caelum.agenda.modelo.Contato;

@WebServlet(urlPatterns="/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//busca o writer
		PrintWriter out = response.getWriter();
		
		//buscando os parâmetros no request
		String nome = request.getParameter("nome");
		String endereco = request.getParameter("endereco");
		String email = request.getParameter("email");
		String dataEmTexto = request.getParameter("dataNascimento");
		Calendar dataNascimento = null;
		
		//fazendo a conversão da data
		try{
			Date date = new SimpleDateFormat("dd/MM/yyyy")
					.parse(dataEmTexto);
			dataNascimento = Calendar.getInstance();
			dataNascimento.setTime(date);
		}catch(ParseException e){
			out.println("Erro de conversão de data");
			return;//para a execução do método
		}
		
		//monta um objeto em contato
		Contato contato = new Contato();
		contato.setNome(nome);
		contato.setEndereco(endereco);
		contato.setEmail(email);
		contato.setDataNascimento(dataNascimento);
		
		//salva o contato
		ContatoDAO dao = null;
		try {
			dao = new ContatoDAO();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		dao.adiciona(contato);
		
		//imprime o nome do contato que foi adicionado
		out.println("<html>");
		out.println("<body>");
		out.println("Contato " + contato.getNome() + " adicionado com sucesso");
		out.println("</body>");
		out.println("</html>");
	}
}
C

Fui testar o projeto neste tomcat 7, o que estava funcionando no tomcat 8, agora não está funcionando, deu pau no tomcat 7, o seguinte erro aparece:Server Tomcat v7.0 Server at localhost failed to start.

T

voce nao startou o servico…

T

Manda a classe de conexão …

C

Classe de conexão

package br.com.caelum.agenda;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
	public Connection getConnection() throws ClassNotFoundException{
		try {
			 //Class.forName("com.mysql.jdbc.Driver");
			DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //Essa linha foi a diferença
			 return DriverManager.getConnection(
			 "jdbc:mysql://localhost/fj21", "root", "admin");
		} catch (SQLException e) {
			 e.printStackTrace();
			 throw new RuntimeException(e);
		}
	}
}
J

Pequena sugestão:

Tenta isso, no caso o stack trace informa que não houve nenhum pacote enviado de volta do servidor de BD, ou seja, ele tenta conectar na bagaça, mas não recebe resposta, talvez por não estar alcançando o servidor. Verifica se o usuário e a senha estão corretos, e o nome do Banco informado na string de conexao, verifique também se há algum problema no servidor de BD, tenta logar nele pelo prompt/terminal, veja se ele responde aos comandos SQL, no demais, não creio que seja problema no tomcat, já que você trocou e não adiiantou nada.

C

A falha permanece, eu reinstalei o mysql server pois o servidor realmente não respondia, o mysql server agora funciona, mas a lista que eu queria não gera e a falha no tomcat ainda continua.

J

sim, mas criou o banco e as tabelas denovo? Ele gera o mesmo stack trace? Se não, posta ele aqui.

C

Não, não criei o banco de novo, removi o projeto, reiniciei o tomcat 7 e digitei o link http://localhost:8080 e abriu o site do tomcat, não sei se gera o mesmo stacktrace, como vejo isso?

Criado 14 de fevereiro de 2016
Ultima resposta 25 de fev. de 2016
Respostas 28
Participantes 7