[resolvido]WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw

Não consigo mostrar os dados de uma consulta usando jsp:useBean, quando listo da forma normal, mostra tudo corretamente, é só adicionar o <jsp:useBean id=“dao” class=“pack.modelo.ContatoDAO” /> que dá pau.

[code]INFO: Conectannnnndo ao banco!

WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception
java.lang.InstantiationException: class pack.modelo.ContatoDAO : java.lang.InstantiationException: pack.modelo.ContatoDAO
at org.apache.jsp.lista_002dcontatos_jsp._jspService(lista_002dcontatos_jsp.java:85)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at pack.filtro.FiltroConexao.doFilter(FiltroConexao.java:22)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)[/code]

assim funciona:

[code]<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt”%>
<%@page import=“java.util., pack.modelo.”%>

<c:import url=“header.jsp” />

Lista de Contatos

<% ContatoDAO dao = new ContatoDAO(null); List contatos = dao.getLista(); for (Contato contato : contatos ) { %> <% } %>
<%=contato.getNome() %> <%=contato.getEmail() %> <%=contato.getEndereco() %> <%=contato.getDataNascimento().getTime() %>

<c:import url=“footer.jsp” />[/code]

assim não:

[code]<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt”%>
<%@page import=“pack.modelo.ContatoDAO”%>

<c:import url=“header.jsp” />

Lista de Contatos

<jsp:useBean id=“dao” class=“pack.modelo.ContatoDAO” />

Nome Email Endereço Nascimento Editar Excluir
${contato.nome} ${contato.email} Email não informado ${contato.endereco} Alterar Remover

<c:import url=“footer.jsp” />[/code]

Alguém pode me dar uma luz?

Fala andreacerqueira!

A exceção foi essa: java.lang.InstantiationException
e porque não foi possível instanciar o objeto?

Assim funciona:

ContatoDAO dao = new ContatoDAO(null); 

e assim não:

<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" />

Será que não é porque o objeto ContatoDAO espera que vc passe algum parâmetro para o construtor dele?
Repara no código que funciona, lá vc passa um null para o construtor :wink:

vai ver é isso…
tenta criar um construtor vazio para esse objeto… pode ser que assim o código funcione :smiley:

ou se precisar passar algum valor para o construtor, tenta isso:

<jsp:useBean id="beanName" class="fully_qualified_classname" scope="scope"> <jsp:setProperty .../> </jsp:useBean>
Obj.: Não sei se desse jeito é passado o valor direto para o construtor do objeto ou se ele cria um objeto vazio e depois passa os valores :frowning:

Dá uma olhada nesse link, pode ser que te ajude:
http://docs.oracle.com/javaee/1.3/tutorial/doc/JSPIntro11.html

oi thiago, muito obrigado por ter respondido.
então, a conexão é aberta e fechada por um filtro, por isso que tem o parametro a ser passado, eu fiz uma gambiarra pra testar a página sem scriptlet com um if e else e funcionou, mas eu tirei isso da DAO, o ideal serial ela pegar os dados da conexão pelo filtro.
dai com a sua linha de raciocinio eu coloquei assim no jsp que lista:

<% Connection connection = (Connection)request.getAttribute("connection"); %> <jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" value="${connection}" /> </jsp:useBean>
mas continua dando erro.
nas minhas lógicas a conexão é pega assim:

Connection connection = (Connection) request.getAttribute("connection"); ContatoDAO dao = new ContatoDAO(connection);
mas no usebean eu ainda vou passar o valor né, ele já deve ir como tipo connection pois o construtor pede o parametro desse tipo.

Ola André!!

Cara eu dei uma pesquisada por ai e pelo que entendi, não é possível passar parametros para um construtor de um Bean, porque segundo a especificação dos javaBeans, todo Bean tem que ter um construtor padrão (sem parametros), ai a tag <jsp:setProperty /> vai passar os valores para as propriedades do bean depois que ele for criado através de se construtor padrão (sem parametros)

Tenta criar um construtor padrão para a sua classe ContatoDAO e depois seta o atributo connection nela desse mesmo jeito que vc mencionou:

<% Connection connection = (Connection)request.getAttribute("connection"); %> <jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" value="${connection}" /> </jsp:useBean>
E será que não tem como melhorar esse trecho de código? tipo assim:

<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" param="connection"/> </jsp:useBean>
Repara que ali na tag o atributo param pega um atributo do objeto request: ai não precisa dessa linha de código:

<% Connection connection = (Connection)request.getAttribute("connection"); %> Não sei se isso funciona, mas é o que a documentação ta dizendo (naquele link que passei para vc)

Resumindo… cria um construtor padrão (sem parâmetros) para sua classe ContatoDAO e veja se o erro continua, se não der erro (aquele erro java.lang.InstantiationException)
ai já descobrimos que o problema era o construtor padrão que tava faltando :wink:

Mmmmmm entendi Thiago.
Putz, o problema é que eu tenho um filtro que abre e fecha as conexões, e ele deixa esse connection no “ar” que eu resgato no construtor da DAO pra passar para os outros métodos.

Tipo meu filtro é assim:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ try{ Connection connection = new ConnectionFactory().getConnection(); request.setAttribute("connection", connection); chain.doFilter(request, response); connection.close(); }catch(SQLException e){ throw new ServletException(e); } }

eu tô iniciando agora e talvez seja uma pergunta muito idiota, mas como eu conseguiria pegar esse atributo ao chamar a DAO?

Hehehe não sei se entendi direito sua pergunta :smiley:

mas só para me deixar dentro do seu contexto…

Essa classe:
pack.modelo.ContatoDAO
Não tem um construtor padrão né, tipo isso:

[code]public class ContatoDAO {

// esse é o construtor padrão do qual to falando... bem cru, sem nenhum parametro, só serve para criar um objeto vazio mesmo
public ContatoDAO() {}
// ...
// ... outros contrutores aqui ...
// ...
// ... metodos da classe

}[/code]

Ai quando vc tenta criar um Bean com a instrução:

<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" value="${connection}" /> </jsp:useBean> O seu programa lança a exceção: java.lang.InstantiationException
Porque sua classe ContatoDAO não possui aquele construtor padrão que eu mencionei la em cima, Correto??? (e a tag pede para sua classe ter um construtor daquele)

Se vc criar um construtor daquele, vc só precisa criar um método na sua classe ContatoDAO, tipo esse:

[code]public class ContatoDAO {
// sua propriedade (atributo) “connection”
Connection connection = null;

// esse é o construtor padrão do qual to falando... bem cru, sem nenhum parametro, só serve para criar um objeto vazio mesmo
public ContatoDAO() {}
// ...
// ... outros contrutores aqui ...
// ...
// ... metodos da classe
// ... metodo que adiciona o objeto connection na classe ContatoDAO
public void setConnection(Connection connection) {
    this.connection = connection;
}

}[/code]

ai o código abaixo é para funcionar:

<jsp:useBean id="dao" class="pack.modelo.ContatoDAO" scope="request"> <jsp:setProperty name="dao" property="connection" param="connection"/> </jsp:useBean>

O seu Filter tá certo!!
ele tá passando o objeto Connection para a pagina do ContatoDAO?
se tiver, ta tudo certo… era para funcionar…

tenta codificar a ideia doo contrutor padrão lá e se continuar dando erro, posta a msn de erro aqui de novo blz? :smiley:

Tá complicado :slight_smile:
Na verdade funcionou perfeitamente o que vc me falou, mas até eu achar o pq parecia estar errado foi um custo.
O problema é o seguinte, só funciona no glassfish, e eu fiquei tentando no tomcat por horas, eu já apaguei a pasta work do tomcat e não adianta, já dei um clean no projeto e fez uns estragos que tive que arrumar.
Sua solução foi perfeita, o que me falta conseguir agora é fazer os beans funcionarem no meu tomcat, pois nenhum funciona nele, e todos funcionam no glassfish :frowning:
Agora começa a saga tomcat.

Thiago, muito muito muito obrigado

hehe ola de novo andré!!

Se tem algo relacionado a beans que funciona no GlassFish e não funciona no Tomcat é o EJB (Enterprise JavaBeans)
não manjo muito de EJBs mas se vc estiver tentando usar no tomcat, esquece, não vai rolar :frowning:
porque o tomcat é só um servlet container, ou seja, um contêiner que executa servlets…
ja o glassfish é um autentico servidor de aplicações, que possui um servlet container junto.
seria como se vc tivesse um tomcat dentro do glassfish e muito mais coisas além disso :smiley:
glassfh está em outro patamar… tomcat não concorre com esse cara 8)
glassfish está no patamar do JBoss (redhat) e WebLogic (Oracle)

mas se vc não está usando EJB, o tomcat tá de bom tamanho porque é extremamente leve comparado aos outros que mencionei :smiley:

Dá uma lida nisso:
http://pt.wikipedia.org/wiki/Enterprise_JavaBeans
http://pt.wikipedia.org/wiki/Servidor_de_aplica%C3%A7%C3%A3o
http://pt.wikipedia.org/wiki/Glassfish
http://pt.wikipedia.org/wiki/Apache_Tomcat

mmmmm :slight_smile:
nem sei como faz pra usar ejb hehehehe, mas vou ver se fiz alguma cagada.
vou ver o que faço pra usar o que estou fazendo no tomcat, pois como é estudo, é melhor fazer funcionar nele.
muito obrigado pelas explicações.
tópico resolvido :wink: