Caelum - FJ21 - Exercicio 7.4

14 respostas
acidotherwise

Bom galera o exercicio 7.4 da apostila da caelum trata sobre interação do BD com a jsp mas ele pede para importar um arquivo .zip se alguem ja fez o curso ou se tiver um instrutor que possa me dizer oque eu tenho que fazer pra gerar esse arquivo .zip, desde ja grato abaixo envio a questão na sua forma original

  1. Precisamos das classes do projeto anterior de JDBC para prosseguir. Para facilitar, vamos importar um
    arquivo ZIP que já tem tudo preparado corretamente.

14 Respostas

S

Olá, voce pode um novo projeto e adicionar as classes que voce criou no capitulo de jdbc, e colocar o jar do mysql e da jstl no seu projeto, ou se não me passa seu email que eu te mando o projeto…
é o jspteste que eles usam…
abraços

acidotherwise

[email removido]

desde ja grato

sergiolopes

é realmente o que o levi falou: só colocar os jars do mysql e da jstl no pasta lib e copiar as classes do cap de jdbc para a pasta src

acidotherwise

valeow Sergio! Grande ajuda, essa comunidade sempre me ajudando eu espero um dia poder ajudar!

metanolbr

E ae galera,

Tipo, eu sei que vocês ja responderam a dúvida acima mas estou com o mesmo problema (apesar de vocês ja terem explicado o mesmo).

É o seguinte, também estou seguindo a apostila FJ21 e parei no mesmo exercicio.
Assim como ele, não possuo o .zip sugerido mas possuo o projeto jdbc criado nos primeiros capitulos do tutorial.

O que tentei fazer (e não deu certo):
-Botão direito no projeto jdbc e clicar em Export
-Escolher a opção JAR File
-Flagar todos os pacotes e .classpath e .project (exceção do br.com.caelum.jdbc.teste).
-Deixa flagado apenas a opção "Export Java source files and resources".
-Finalizar Exportação.

Em seguida eu parto para a tarefa de importação
-Sigo os passos do tutorial porém quando se vai escolher o .zip na opção Into Folder eu escolho para o arquivo ser colocado em "jspteste/src"
-Vou em Build Path, Add External Jar File e escolho o driver do mysql ("mysql-connector-java-5.1.7-bin.jar").

Então, após seguir todos estes passos, tento executar o "lista-scriptlet.jsp" no servidor e obtenho as seguintes exceções:

[color=red]SITE[/color]

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

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

exception 

org.apache.jasper.JasperException: javax.servlet.ServletException: java.sql.SQLException: com.mysql.jdbc.Driver
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


root cause 

javax.servlet.ServletException: java.sql.SQLException: com.mysql.jdbc.Driver
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
	org.apache.jsp.lista_002dscriptlet_jsp._jspService(lista_002dscriptlet_jsp.java:98)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


root cause 

java.sql.SQLException: com.mysql.jdbc.Driver
	br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:16)
	br.com.caelum.jdbc.dao.ContatoDAO.<init>(ContatoDAO.java:19)
	org.apache.jsp.lista_002dscriptlet_jsp._jspService(lista_002dscriptlet_jsp.java:69)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


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


--------------------------------------------------------------------------------

Apache Tomcat/6.0.18

[color=red]CONSOLE[/color]

INFO: Server startup in 744 ms
03/06/2009 16:43:11 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.sql.SQLException: com.mysql.jdbc.Driver
	at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:16)
	at br.com.caelum.jdbc.dao.ContatoDAO.<init>(ContatoDAO.java:19)
	at org.apache.jsp.lista_002dscriptlet_jsp._jspService(lista_002dscriptlet_jsp.java:69)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

[color=red]JSP[/color]

<%@ page import="java.util.*, br.com.caelum.jdbc.*, java.sql.*,
		br.com.caelum.jdbc.dao.*, br.com.caelum.jdbc.modelo.*"
	language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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>Testando Scriptlet de Lista</title>
</head>
<body>
	<ul>
		<%
		ContatoDAO dao = new ContatoDAO();
		List<Contato> contatos = dao.getLista();
		
		for (Contato contato: contatos) {
		%>
		
			<li><%=contato.getNome()%>, <%=contato.getEmail()%>:
				<%=contato.getEndereco()%></li>
		<%
		}
		%>
	</ul>
</body>
</html>

É valido mencionar que o ContatoDAO funciona perfeitamente em aplicação java normal.

Alguém saberia me dizer o que está ocorrendo :?:

Muito obrigado,
metanolbr :wink:

B

Ola metanolbr! Como vai!

Bom, sou novo por aqui, para ter uma idéia esta é minha primeira postagem, e assim como você também comecei a estudar JAVA inicialmente através das apostilas da CAELUM.

Bom, tive o mesmo problema que você, quando cheguei nesta parte. O erro esta no momento em que você faz: “Vou em Build Path, Add External Jar File e escolho o driver do mysql (…)”.

Quando você faz isso, esta colocando o .jar dentro de “Referenced Libraries”, ou seja só vai funcionar se a conexão for via classes. (não JSP).

Bom, a regra é: Para projetos WEB, você deve colocar os JAR’s dentro de “WebContent/WEB-INF/lib” (Dá uma olhada no ultimo tópico do cap. 6.2 da apostila FJ21, é o: “Resumo final das pastas”, lá ele diz que nesta pasta deve ficar as bibliotecas .jar.).

Para resolver, você vai ter que jogar o jar do driver do MySQL para dentro da pasta lib. (Pode fazer isso fisicamente, abre a pasta recorte e cole o jar do driver dentro da lib) Pronto! Deve funcionar!

Se preferir fazer pelo Eclipse, abra a arvore de “Referenced Libraries”, clique no driver do mysql com o botão direito e escolha: “remove from biud path”, o jar vai aparecer como um arquivo solto no projeto (caso esteja assim fisicamente), então basta clicar e arrastar para dentro da pasta lib. Pronto deve funcionar! (não esqueça de restartar o tomcat).

Obs.: Apesar de você ter jogado o arquivo .jar para dentro da pasta lib, você não vai enchergar ele na estrutura de pastas, mas note que agora apareceu: Web App Libraries e lá esta ele!

Espero ter ajudado, depois me diz se deu certo!

Abraço!

Paulo_Silveira

Excelente resposta Ambrozio!

Nao basta colocar no classpath do projeto, pois nesse caso quem vai encontrar o JAR do mysql é o Eclipse (e se voce rodar alguma classe a partir dele). Quando voce esta rodando com o tomcat, ele nao esta achando esse jar (o DriverManager procura pelo driver do mysql que foi digitado, mas nao o encontra). Colocando dentro de WEB-INF/lib, o servlet container vai encontra-lo!

fabiojpoli

Olá pessoal, tive o mesmo problema, apesar de que os comentarios anteriores terem me ajudado muito, ainda estou com problemas,

fiz as importações na mão, copiando e colando para a pasta lib meus .jar’s

mas na apostila diz o seguinte:
“Analise o resultado final. Veja que as classes do projeto anterior agora estão dentro do Eclipse. Repare
também que há três JARs dentro de WebApp Libraries (é aí que o WTP mostra os JARs do WEB-INF/lib).
Um dos JARs é o driver do MySQL que já conhecemos. Os outros dois veremos logo adiante.”

mas na minha pasta só tem 2 jar’s, mas isso não é o problema principal, tentei rodar o código abaixo:

<%@ page import="java.util.*,br.com.caelum.jdbc.*,
	br.com.caelum.jdbc.dao.*, br.com.caelum.jdbc.modelo.*" %>
	
<html><ul>

<%
ContatoDAO dao = new ContatoDAO();
List<Contato> contatos = dao.getLista();

for (Contato contato : contatos ) {
%>

	<li><%=contato.getNome()%>, <%=contato.getEmail()%>:
		<%=contato.getEndereco()%></li>
		
<%
}
%>

</ul></html>

e retornou esse erro no navegador:

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

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

exception 

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 7 in the jsp file: /scriptlet.jsp
ContatoDAO cannot be resolved to a type
4: <html><ul>
5: 
6: <%
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {


An error occurred at line: 7 in the jsp file: /scriptlet.jsp
ContatoDAO cannot be resolved to a type
4: <html><ul>
5: 
6: <%
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {


An error occurred at line: 8 in the jsp file: /scriptlet.jsp
Contato cannot be resolved to a type
5: 
6: <%
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {
11: %>


An error occurred at line: 10 in the jsp file: /scriptlet.jsp
Contato cannot be resolved to a type
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {
11: %>
12: 
13: 	<li><%=contato.getNome()%>, <%=contato.getEmail()%>:


Stacktrace:
	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


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


--------------------------------------------------------------------------------

Apache Tomcat/6.0.20

e este erro no tom cat:

09/01/2010 14:05:36 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 7 in the jsp file: /scriptlet.jsp
ContatoDAO cannot be resolved to a type
4: <html><ul>
5: 
6: <%
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {


An error occurred at line: 7 in the jsp file: /scriptlet.jsp
ContatoDAO cannot be resolved to a type
4: <html><ul>
5: 
6: <%
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {


An error occurred at line: 8 in the jsp file: /scriptlet.jsp
Contato cannot be resolved to a type
5: 
6: <%
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {
11: %>


An error occurred at line: 10 in the jsp file: /scriptlet.jsp
Contato cannot be resolved to a type
7: ContatoDAO dao = new ContatoDAO();
8: List<Contato> contatos = dao.getLista();
9: 
10: for (Contato contato : contatos ) {
11: %>
12: 
13: 	<li><%=contato.getNome()%>, <%=contato.getEmail()%>:


Stacktrace:
	at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
	at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
	at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
	at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)

O estranho é que ao olhar a estrutura do .jar onde deveriam ter os pacotes com as clesses, só possui os pacotes vazios, sem o .class

Se for preciso, eu abro um novo tóipico, desde já agradeço a ajuda. Obrigado!

fabiojpoli

Após incluir os arquivos:

-jstl-api-1.2.jar
-jstl-impl-1.2.jar

funcionou (acredito que seja importante citar a insersão deste jstl na apostila), porém no código diz o erro:

Multiple annotations found at this line:
- ContatoDAO cannot be resolved

e
atos
Contato cannot be resolved to a type

mas mesmo assim, traz a lista de contatos.

leonardoteles

Fala galera…boa noite. Para não abrir outro tópico, vou utilizar este mesmo. Meu problema(na verdade acho que é um help por falta de experiência minha, mesmo!!) está no exercício 9.9 -> 2) da apostila nova. Consegui na boa fazer a remoção e estou adicionando sem problemas tbm os contatos, porém a lógica de recuperar os dados do banco e popular outra jsp, está me tirando o sono.

Na apostila diz pra passar o id do contato pela requisição. Agora vamos as perguntas:
1 - Isto é feito pelo link criado, da mesma forma que se utiliza para remover?
exemplo: pra remover eu tô utilizando o próprio id, assim:

${contato.id}
e para atualizar eu criei um link novo na table só pra isso.

2 - O “passar o id pela requisição” seria desta forma?

clique

Acredito que sim, mas o que está difícil de entrar na cabeça é exatamete o seguinte…o form de atualização será chamado como para retornar preenchido? de dentro da servlet “AlteraContatologica”? Se for, como redireciono novamente de dentro do servlet, para a lista-contatos-elegante.jsp?

O erro que aparece no console é NullPointerException. Deve ser pelo fato de eu estar fazendo m… e não estar vendo, ou pior, sabendo como resolver…

Desde já agradeço a colaboração e paciência de todos nesta noite chuvosa de terça-feira no RIO…abraço

leo_lvieira

leonardoteles:
Fala galera…boa noite. Para não abrir outro tópico, vou utilizar este mesmo. Meu problema(na verdade acho que é um help por falta de experiência minha, mesmo!!) está no exercício 9.9 -> 2) da apostila nova. Consegui na boa fazer a remoção e estou adicionando sem problemas tbm os contatos, porém a lógica de recuperar os dados do banco e popular outra jsp, está me tirando o sono.

Na apostila diz pra passar o id do contato pela requisição. Agora vamos as perguntas:
1 - Isto é feito pelo link criado, da mesma forma que se utiliza para remover?
exemplo: pra remover eu tô utilizando o próprio id, assim:

${contato.id}
e para atualizar eu criei um link novo na table só pra isso.

2 - O “passar o id pela requisição” seria desta forma?

clique

Acredito que sim, mas o que está difícil de entrar na cabeça é exatamete o seguinte…o form de atualização será chamado como para retornar preenchido? de dentro da servlet “AlteraContatologica”? Se for, como redireciono novamente de dentro do servlet, para a lista-contatos-elegante.jsp?

O erro que aparece no console é NullPointerException. Deve ser pelo fato de eu estar fazendo m… e não estar vendo, ou pior, sabendo como resolver…

Desde já agradeço a colaboração e paciência de todos nesta noite chuvosa de terça-feira no RIO…abraço

amigo, eu fiz o seguinte nesse exercício: ao clicar no link, mando a request e pego no AlteraContatoLogica

public class AlteraContatoLogic implements Logica
{

@Override
public void executa(HttpServletRequest request, HttpServletResponse response)
throws Exception {

	ContatoBean contato = new ContatoBean();
	long id = Long.parseLong(request.getParameter("id"));
	contato.setId(id);
	contato.setNome(request.getParameter("nome"));
	contato.setEndereco(request.getParameter("endereco"));
	contato.setEmail(request.getParameter("email"));
	
	String dataEmTexto = request.getParameter("dataNascimento");
	Connection connection = (Connection) request.getAttribute("conexao");
	/*Date dataNascimento= null;
	try {
		dataNascimento = (Date) new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
	} catch (ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	contato.setDataNascimento(dataNascimento);*/
	
	ContatoDAO dao = new ContatoDAO(connection);
	dao.atualiza(contato);
	RequestDispatcher rd = request.getRequestDispatcher("/lista-contatos-elegante.jsp");
	rd.forward(request, response);
	
	System.out.println("Alterando contato ..." + contato.getNome());
}

}

(sorbre o negocio da conexao ser pega na requisicao… nao sei se voce deve fazer isso ainda, soh se ja chegou na parte de FILTROS da apostila!)

Acredito que a parte chave aqui eh essa:

ContatoDAO dao = new ContatoDAO(connection);
	dao.atualiza(contato);
	RequestDispatcher rd = request.getRequestDispatcher("/lista-contatos-elegante.jsp");
	rd.forward(request, response);

espero ter ajudado, se tiver duvida só perguntar aqui denovo! abraços

lucasportela

pela data do tópico… ele já deve ter resolvido o problema

leo_lvieira

sim… mas eu entrei nesse topico justamente para sanar uma dúvida, muita gente pode passar aqui e pode se beneficiar mesmo que não necessariamente fale no tópico…
realmente nao vi a data, mas ajudar nunca é demais.

leonardoteles

Pô…é por isso que eu não deixo essa comunidade!!!..cara, muito obrigado pela resposta. Pelo tempo que postei, como o colega falou logo depois da sua resposta, eu resolvi sim…mas de qualquer forma, fica aqui meu agradecimento pela camaradagem de responder minha pergunta…essa é a segunda que tenho resposta desde que comecei a postar dúvidas aqui!!!..seja feliz e tenha uma boa semana…

Criado 22 de abril de 2009
Ultima resposta 26 de set. de 2011
Respostas 14
Participantes 10