<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
Verifique sua classe dao tem o nome do método get da mesma forma que o definido vc EL ex.: getNome() e getTelefone(), pois a EL vai chamar esses métodos.
Espero ter ajudado…
Fallow
aajjbb
pela stacktrace, acho que o erro esta nessa linha de codigo, mas ainda nao sei qual.
Eu acho que o problema está no seu construtor.
Pelo que diz aqui a tag useBean espera um Java Bean.
E como sabemos, Java Beans precisam ter um construtor default (sem argumentos).
Provavelmente por isso ele não está conseguindo instanciar seu DAO. Como ele não tem um construtor default, é um valor inválido.
aajjbb
vou tentar isso…
aajjbb
agora a stacktrace é outra… criei um construtor default no meu dao. e agora a stacktrace aponta para meu jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
Stacktrace:] with root cause
java.lang.NullPointerException
at com.dao.PessoaDAO.getLista(PessoaDAO.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:106)
at org.apache.jsp.lista_002dpessoa_jsp._jspx_meth_c_005fforEach_005f0(lista_002dpessoa_jsp.java:113)
at org.apache.jsp.lista_002dpessoa_jsp._jspService(lista_002dpessoa_jsp.java:82)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:332)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
paulo1911
Olá amigo,
É melhor vc colocar uma Action e um controlador entre sua view e seu dao pra vc nao ter problemas depois de escalabilidade e manutenção…
Mas com relação ao erro sua lista está retornando nula…ou seja o hibernate nao está achando nada na sua base e sua lista está nula e vc tb nao está tratando as exception de forma correta…por isso que as exception estão explodindo na view…
Crie uma classe de teste maisn e chame seu dao e chame seu método getLista pra ver se retorna algo…
FAllow
aajjbb
eu ja tenho os controladores… criei umas servlets, uma para adicionar, outra para remover, e outra para atualizar. nao sei se essa é a forma correta. e como eu criaria uma action?
aajjbb
alterei meu forEach, nao recebo mais a exception. mas agora minha list retorna vazia, e no meu teste em um metodo main, ela retorna os contatos normalmente.
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
O que o paulo1911 quer dizer é que você precisa colocar a chamada para o seu DAO num servlet e adicionar a lista recebida no request como em:
// Dentro do doPost ou doGetList<Pessoa>pessoas=dao.getLista();request.setAttribute("pessoas",pessoas);// Redireciona para o JSP aqui, usando um RequestDispatcher por exemplo
A sua exception está ocorrendo porque agora, no seu DAO, ninguém está inicializando sua session. Como ela é nula, não pode chamar nenhum método nela, por isso a exceção.
Você precisa inicializar a sua session. Isso poderia ser feito no método init do seu Servlet.
aajjbb
estranho, nunca criei uma servlet para listagem. isso ta certo?
visola
Sim, por que não? Normalmente se cria servlets/actions para qualquer acesso a camada de dados/serviço, qualquer acesso, salvar, carregar, apagar, listar, etc.
Os dados acessados de dentro da JSP, normalmente vêm do request ou da sessão.
Não é uma boa prática acessar a camada de dados/serviço de dentro do JSP.
aajjbb
fiz um esboço mais ou menos assim, mas ainda ta confuso pra mim
A criação e controle da transação deveria ser transparente para o Servlet.
Talvez fosse melhor colocar isso dentro do DAO (quando necessário).
Mas pelo que entendi, você está passando para o JSP uma pessoa vazia. Acredito que não seja isso que você quer.
Talvez fosse melhor fazer o seguinte:
publicvoiddoPost(....)throws...{PessoaDAOdao=newPessoaDAO(newHibernateUtil().getSession());// No load você não precisa de uma transaçãorequest.setAttribute("pessoas",dao.getLista());RequestDispatcherrd=request.getRequestDispatcher("/lista-pessoa.jsp");rd.forward(request,response);}
E dentro do seu JSP, mudar para o seguinte código:
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
Você não precisa mais da tag useBean criando o seu DAO na sua JSP.
Se já tinha, não precisa adicionar a linha que falei.
Vocẽ consegue ver o SQL que o Hibernate gera no console ou no log da sua aplicação?
Tentou executá-lo no bando de dados?
aajjbb
sim, agora ja retirei o taga “useBean”…
sim. quando eu insiro um contato. o sql aparece no meu console. já quando executo a listagem. nao aparece nada. e a lista retorna vazia.
aajjbb
nao sei o por que da minha lista estar retornando vazia, sendo que o banco esta populado… nao vejo erro no meu foreach. veja o jsp corrigido
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>