Problemas com Combo Aninhadas (Ajax)

267 views
Skip to first unread message

Arthur Franco Ferreira

unread,
Aug 20, 2011, 10:08:04 PM8/20/11
to jav...@googlegroups.com
Galera,

Eu to com esse problema há alguns dias e venho pesquisando direto por alguma solução na web, mas não consegui nada.

No meu projeto eu estou utilizando JSF 2 com Spring 3 e Primefaces 2.2.1. É o clássico cenário de combo Pais / Região / Estado / Cidade. A mecânica de selecionar uma combo para preencher a outra funciona que é uma maravilha. O que tá pegando é que o meu Bean não enxerga o valor selecionado nas combos preenchidas via Ajax, ou seja, ele só enxerga a combo de país (que sempre vem preenchida). Ao selecionar um País, ela preenche a combo de região perfeitamente e ao selecionar a combo de região, ele chama o método que preencheria a combo de estado, mas o resultado retorna nulo porque ele não recupera a região selecionada.

Eu coloquei um breakpoint na minha classe converter (eu utilizo a SimpleIndexConverter que o Rafael Ponte sugeriu no blog dele) e notei que ele chama o método de conversão três vezes. Na primeira vez ele passa o valor que eu selecionei e nas outras duas ele passa vazio. Provavelmente é por isso que o Bean não enxerga o valor selecionado, mas eu não faço a menor idéia do motivo dele submeter três vezes o valor.

Eu já havia reparado em outras telas do meu sistema que muitas vezes ele realiza uma consulta mais de uma vez (numa grid que eu tenho tem vezes que ele vai buscar o valor da grid cinco vezes).

Alguém já passou por algo desse tipo?

Abraços,

Arthur Franco Ferreira
Analista Desenvolvedor Web Java Pleno
Licenciado em Computação
UNILASALLE-RJ


Matruskan

unread,
Aug 21, 2011, 1:16:33 AM8/21/11
to jav...@googlegroups.com
É por causa dessa consulta que ocorre várias vezes que aconselham não colocar muita lógica nos gets/sets.

Quanto ao problema do pais/região/estado/cidade, talvez um pouco de código nos ajude a procurar o seu problema.


2011/8/20 Arthur Franco Ferreira <arcan...@gmail.com>

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Hedley Luna

unread,
Aug 21, 2011, 9:10:01 AM8/21/11
to jav...@googlegroups.com

O problema dos gets serem chamados varias vezes se nao me engano tem a ver com ciclo de vida do jsf. E esse problema eh agravado em datatables.

>> *Arthur Franco Ferreira*
>> *Analista Desenvolvedor Web Java Pleno*

Arthur Franco Ferreira

unread,
Aug 22, 2011, 9:41:13 AM8/22/11
to jav...@googlegroups.com
Opa, esqueci de copiar o código. Mais tarde eu colo ele aqui e explico melhor.


Arthur Franco Ferreira
Analista Desenvolvedor Web Java Pleno
Licenciado em Computação
UNILASALLE-RJ




2011/8/21 Hedley Luna <hedle...@gmail.com>

Jean Michel

unread,
Aug 22, 2011, 10:25:23 AM8/22/11
to jav...@googlegroups.com

Galera, estou fazendo uma tela de home, onde:

 

  1. 1.     O usuário é saudado;
  2. 2.     É exibido um botão de logout;
  3. 3.     É exibida uma lista com as notas do usuário.

 

Quando eu uso a tag h:dataTable o resultado era o esperado. Quando eu comecei a usar a tag p:dataTable começou a dar erro, me dizendo que a tat p:dataTable deveria estar dentro de uma tag h:form (javax.faces.FacesException: DataTable : "notes" must be inside a form element.).

 

Alguém sabe se é isso mesmo? Não me parece muito lógico isso.

 

Eis meu código:

 

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

                     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"

     xmlns:f="http://java.sun.com/jsf/core"

     xmlns:h="http://java.sun.com/jsf/html"

     xmlns:ui="http://java.sun.com/jsf/facelets"

     xmlns:c="http://java.sun.com/jstl/core"

     xmlns:p="http://primefaces.prime.com.tr/ui">

  <head>

    <title>Notes</title>

  </head>

  <body>

    <f:view>

      <h:outputTextvalue="#{bundle.welcome}#{userAuthenticated.firstName}#{bundle.homeMessage}."/>

       <f:verbatim>

      <p></p>

      </f:verbatim>

      <h:form>

        <h:commandButtonid="action" type="submit"value="#{bundle.logout}"

                        action="#{accessControlBean.doLogoff}" styleClass="actionButton"/>

      </h:form>

      <f:verbatim>

      <p></p>

      </f:verbatim>

     

      <p:dataTable id="notes"value="#{homeBean.userNotes}"var="note">

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.id}" />

          </f:facet>

          <h:outputTextvalue="#{note.id}"/>

        </p:column>

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.creationDate}" />

          </f:facet>

          <h:outputTextvalue="#{note.creationDate}" >

            <f:convertDateTimepattern="dd/MM/yyyy HH:mm:ss" />

          </h:outputText>

        </p:column>

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.text}" />

          </f:facet>

          <h:outputTextvalue="#{note.text}"/>

        </p:column>

      </p:dataTable>

     

    </f:view>

  </body>

</html>

 

Eis o erro:

 

javax.faces.FacesException: DataTable : "notes" must be inside a form element.

         at org.primefaces.component.datatable.DataTableRenderer.encodeScript(DataTableRenderer.java:102)

         at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:86)

         at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)

         at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763)

         at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)

         at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)

         at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)

         at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)

         at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

         at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)

         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)

         at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)

         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)

         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:662)

 


Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)

Igor Thiago

unread,
Aug 22, 2011, 10:26:30 AM8/22/11
to jav...@googlegroups.com
Não necessáriamente. Só precisa estar dentro de um form se tiver submit.

--
Igor Thiago Vulcão da Silva
Bach. em Ciência da Computação
Programador Java
WEB Designer

Contato: (91) 8120-1949
E-mail: vulcaod...@gmail.com
MSN: thiagor...@hotmail.com

Jean Michel

unread,
Aug 22, 2011, 10:39:45 AM8/22/11
to jav...@googlegroups.com
Entoncis nao saquei pq a minha pagina esta com erro.

Valeu.



Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
--

Igor Thiago

unread,
Aug 22, 2011, 10:40:51 AM8/22/11
to jav...@googlegroups.com
Faz teste por partes, tenta exibir apenas a datatable na página.
Ou apenas o botão, tenta limitar a faixa de erro.

Igor Thiago

unread,
Aug 22, 2011, 10:43:17 AM8/22/11
to jav...@googlegroups.com
Outra coisa ... acredito que componentes primefaces não precisam da f:view

May Trevisol

unread,
Aug 22, 2011, 10:57:04 AM8/22/11
to jav...@googlegroups.com
Já tive esse problema quando estava trabalhando com templates...

havia colocado meu form no template e nas paginas que eu incluía, parece q ele não reconhecia o form... então tirei o form do template e coloquei a tag circundando os componentes das minhas subpaginas.

Outra coisa que costuma dar problema é se você declara um form dentro do outro... se não me engano form dentro de div também da problema...

da uma olhada pra ver se seu problema não é similar ;


--
Abraços,

Mayara Madeira Trevisol

Bacharel em Ciência da Computação
Especialista em Engenharia de Projetos de Software
Desenvolvedora Java e professora de Lógica de Programação e Java
Certified ScrumMaster

" Hoje você terá a vitória sobre o que foi ontem; amanhã, triunfará sobre os menos preparados; depois, sobre os mais competentes." Miyamoto Musashi

Bruno Maomeh

unread,
Aug 22, 2011, 11:43:46 AM8/22/11
to jav...@googlegroups.com
o proprio html não permite form's aninhados..
e não há por que um form dar problemas dentro de divs..

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Bruno Maomeh
   http://brunomaomeh.wordpress.com

Jean Michel

unread,
Aug 22, 2011, 12:05:50 PM8/22/11
to jav...@googlegroups.com
Já fiz isso. Quando fica soh o form do botão [Ok], só a dataTable [Not Ok].



Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
--

Igor Thiago

unread,
Aug 22, 2011, 7:54:31 PM8/22/11
to jav...@googlegroups.com
Muito estranho cara. Qual a versão do Primefaces e Facelets que está utilizando? Provavelmente existe algum problema ou nos templates ou no seu código. Acabei de fazer aqui fora de um form a datatable e funcionou normalmente. Tenta colocar apenas a datatable direto na página sem nenhum form e dpois coloca um botão entre a tag h:form ... acredito que irá funcionar.

Jean Michel

unread,
Aug 23, 2011, 11:53:28 AM8/23/11
to jav...@googlegroups.com

Já fiz isso e continua o erro. Tire o form, pelei a página deixando somente a dataTable.

 

 

 

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

                     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"

     xmlns:f="http://java.sun.com/jsf/core"

     xmlns:h="http://java.sun.com/jsf/html"

     xmlns:ui="http://java.sun.com/jsf/facelets"

     xmlns:c="http://java.sun.com/jstl/core"

     xmlns:p="http://primefaces.prime.com.tr/ui">

  <h:head>

    <title>

      <h:outputTextvalue="#{bundle.notesProgram}" />

    </title>

  </h:head>

  <h:body>

   

      <p:dataTable id="notes"value="#{homeBean.userNotes}"var="note">

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.id}" />

          </f:facet>

          <h:outputTextvalue="#{note.id}"/>

        </p:column>

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.creationDate}" />

          </f:facet>

          <h:outputTextvalue="#{note.creationDate}" >

            <f:convertDateTimepattern="dd/MM/yyyy HH:mm:ss" />

          </h:outputText>

        </p:column>

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.text}" />

          </f:facet>

          <h:outputTextvalue="#{note.text}"/>

        </p:column>

      </p:dataTable>

     

  </h:body>

</html>



An Error Occurred:

DataTable : "notes" must be inside a form element.


Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
--

Marcelo Preis Ferreira

unread,
Aug 23, 2011, 12:04:36 PM8/23/11
to jav...@googlegroups.com
 
Jean faz isso que postei em destaque da certo....
veja o erro: DataTable : "notes" must be inside a form element.
http://translate.google.com.br/#en|pt|DataTable%20%3A%20%22notes%22%20must%20be%20inside%20a%20form%20element.
Ingles ta pegando ai eu acho...

 

 

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

                     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"

     xmlns:f="http://java.sun.com/jsf/core"

     xmlns:h="http://java.sun.com/jsf/html"

     xmlns:ui="http://java.sun.com/jsf/facelets"

     xmlns:c="http://java.sun.com/jstl/core"

     xmlns:p="http://primefaces.prime.com.tr/ui">

  <h:head>

    <title>

      <h:outputTextvalue="#{bundle.notesProgram}" />

    </title>

  </h:head>

  <h:body>

   <h:form>

      <p:dataTable id="notes"value="#{homeBean.userNotes}"var="note">

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.id}" />

          </f:facet>

          <h:outputTextvalue="#{note.id}"/>

        </p:column>

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.creationDate}" />

          </f:facet>

          <h:outputTextvalue="#{note.creationDate}" >

            <f:convertDateTimepattern="dd/MM/yyyy HH:mm:ss" />

          </h:outputText>

        </p:column>

        <p:column >

          <f:facet name="header">

            <h:outputTextvalue="#{bundle.text}" />

          </f:facet>

          <h:outputTextvalue="#{note.text}"/>

        </p:column>

      </p:dataTable>

    <h:form>

Jean Michel

unread,
Aug 23, 2011, 1:22:54 PM8/23/11
to jav...@googlegroups.com
Já tentei:

- só a dataTable na pagina [Not Ok]
- só um form e dentro a dataTable [Ok]
- o form englobando o meu botão de sair e a dataTable [Ok]
- o form só com o botão sair e a dataTable fora do form [Not Ok]

O levantamento que eu fiz aqui na lista, é do porque raios eu preciso por um form na pagina para ter uma tabela. 

Se eu nao tiver um botão na tela é muito escroto isso. Uma quebra na semântica do HTML.  Na minha O.D.M. claro.


Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)

Marcelo Preis Ferreira

unread,
Aug 23, 2011, 3:30:07 PM8/23/11
to jav...@googlegroups.com
O p:dataTable tem outros eventos.... até mesmo para ele declarar o var...
se não com ele vai declar isso?

Rafael Pestano

unread,
Aug 23, 2011, 4:38:08 PM8/23/11
to jav...@googlegroups.com
A datatable não precisa estar dentro do form apenas se ele tiver algum botão que submit algo mas apenas para exibição de dados não precisa.

Pelo que vi da da mensagem de erro é um bug do mojarra ou do primefaces (um fica passando a bola pro outro) e se resolve colocando o stage do projeto pra production no web.xml:
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>

Ve se te ajuda
 
Att,

--

Rafael Mauricio Pestano

Graduando em Ciência da Computação
UFRGS


De: Marcelo Preis Ferreira <preis...@gmail.com>
Para: jav...@googlegroups.com
Enviadas: Terça-feira, 23 de Agosto de 2011 16:30
Assunto: Re: [javasf] PrimeFaces p:dataTable - tem q estar dentro de um form?!

O p:dataTable tem outros eventos.... até mesmo para ele declarar o var...
se não com ele vai declar isso?

Rafael Pestano

unread,
Aug 23, 2011, 4:51:29 PM8/23/11
to jav...@googlegroups.com
corrigindo:

apenas se ela tiver algum botão...
 
Att,

--

Rafael Mauricio Pestano

Graduando em Ciência da Computação
UFRGS


De: Rafael Pestano <rmpe...@yahoo.com.br>
Para: "jav...@googlegroups.com" <jav...@googlegroups.com>
Enviadas: Terça-feira, 23 de Agosto de 2011 17:38

Jean Jorge Michel

unread,
Aug 23, 2011, 10:34:17 PM8/23/11
to jav...@googlegroups.com
Amanhã vou testar.
Pq realmente é irritante esse bug e está dando para o menu tb. Ele diz que os itens de menu tem que estar dentro de um form ou algo assim.

Valeu a dica, amanha eu posto o resultado.
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blogs: http://www.jeanjmichel.blogspot.com and http://www.anonymousbiker.wordpress.com
My Twitter: http://twitter.com/jeanjmichel

Marcelo Preis Ferreira

unread,
Aug 24, 2011, 7:04:41 AM8/24/11
to jav...@googlegroups.com
Rafael onde tem isso na documentação?

quanto aos menus eles podem ter action.... e até onde eu seu um action para ser reconhecindo deve esta dentro de um form...
pelo menos é assim que eu faço...

Rafael Pestano

unread,
Aug 24, 2011, 7:10:34 AM8/24/11
to jav...@googlegroups.com
Marcelo, na documentação não tem nada mas em ambos(mojarra e primefaces) bugtrackers tem bug relacionados a este warn. No forum do prime achei este tópico:

 

Att,

--

Rafael Mauricio Pestano

Graduando em Ciência da Computação
UFRGS


De: Marcelo Preis Ferreira <preis...@gmail.com>
Para: jav...@googlegroups.com
Enviadas: Quarta-feira, 24 de Agosto de 2011 8:04

Assunto: Re: [javasf] PrimeFaces p:dataTable - tem q estar dentro de um form?!
Rafael onde tem isso na documentação?

quanto aos menus eles podem ter action.... e até onde eu seu um action para ser reconhecindo deve esta dentro de um form...
pelo menos é assim que eu faço...

Jean Michel

unread,
Aug 24, 2011, 7:56:04 AM8/24/11
to jav...@googlegroups.com
Deu o mesmo problema. 

Foi pras cucuias a chance de usar JSF num projeto interno aqui do setor de TI, vai ser feito em dot NOT ASPX agora :-( takiupariu!!!

O simples exemplo nao saiu do lugar, tudo feito teve um porém, um tempo p desvendar algum misteriozinho e tal... 

To muito frustrado, mas só de raiva vou terminar o exemplo nem q eu mude do Prime pra outra coisa, ou faça roots mesmo só no Majora mesmo. 
 
Valeu a ajuda pessoal.

Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)

Marcelo Preis Ferreira

unread,
Aug 24, 2011, 10:08:31 AM8/24/11
to jav...@googlegroups.com
Só uma dica... Frameworks você se adqua a ela não ela a você...
mesma que ela tenha seus problemas..

Marcelo Preis Ferreira

unread,
Aug 24, 2011, 10:08:53 AM8/24/11
to jav...@googlegroups.com
Lamento muito seu abandono...

Jean Michel

unread,
Aug 24, 2011, 12:38:51 PM8/24/11
to jav...@googlegroups.com
Nao abandonei, vou fazer meu exemplo ateh o fim, porém nao vai mais ser a plataforma do projeto :(



Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)

On 24/08/2011, at 11:08, Marcelo Preis Ferreira <preis...@gmail.com> wrote:

Lamento muito seu abandono...
Reply all
Reply to author
Forward
0 new messages