Fala galera, tudo beleza?
Galera, to com um problema aqui, que pra vocês vai até parecer meio bobo, mas pra mim que estou começando agora em WEB fica um pouco mais complicado rsrsrsrs
É o seguinte:
Meu sistema é feito com JSF+Hibernate+PrimeFaces.
Meu sistema deve cadastrar instituições de ensino da minha cidade. No meu menu, quando seleciono a opção de visualizar as instituições cadastradas, aparece um dataTable com os dados das escolas.
Esse dataTable tem uma coluna chamada “Ações”, que contém 2 botões: Visualizar e Editar.
Vejam:
<p:column headerText="Acoes" styleClass="column-small">
<p:commandButton icon="ui-icon-search"
oncomplete="dlgVisualizar.show()"
title="Visualizar"
update=":formulario:dialogVisualizar">
<f:setPropertyActionListener value="#{instituicoes}"
target="#{instituicaoMB.instituicaoBean}" />
</p:commandButton>
<p:commandButton update=":formulario:dialogEditar"
icon="ui-icon-pencil"
oncomplete="dlgEditar.show()"
title="Editar">
<f:setPropertyActionListener value="#{instituicoes}"
target="#{instituicaoMB.instituicaoBean}" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:dialog header="Detalhes"
id="dialogVisualizar"
widgetVar="dlgVisualizar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:panelGrid columns="2">
<p:outputLabel value="Nome: "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</p:dialog>
<p:dialog header="Editar"
id="dialogEditar"
widgetVar="dlgEditar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:panelGrid columns="2">
<p:outputLabel value="Nome: "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</p:dialog>
ManagedBean:
@ManagedBean
@RequestScoped
public class InstituicaoMB {
private String nomeInstituicao;
private String enderecoInstituicao;
private String diretorInstituicao;
private String telefoneInstituicao;
private InstituicaoBean instituicaoBean;
A ideia aqui é quando eu clicasse no botão Visualizar aparecesse os dados da escola em um dialog. A mesma coisa com o botão Editar, só que daí os dados apareceriam em inputText para edição.
O que eu acho estranho é o seguinte:
1 - quando eu deixo o código do botão Editar comentado, deixo apenas o botão Visualizar e clico nele, aparece o dialog mostrando as informações dele, legal e bonito. Quando eu descomento o código, deixando os dois botões aparecendo na tela, nem um nem outro funcionam! Onde é o problema?
Estou a dias tentando resolver isso, porque é pro meu TCC =/
Obrigado pela ajuda galera
[]`s
Manda o início do xhtml, onde estão as propriedades que você usou no <p:datatable …
Sem isso nao da pra te ajudar.
Flw
Ta ai amigo =D
<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<ui:composition template="template.xhtml">
<ui:define name="Centro">
<p:layoutUnit position="center" closable="false" resizable="false" collapsible="false">
<p:panel id="painel"
header="Instituicoes Cadastradas"
styleClass="form-panel">
<h:form id="formulario">
<p:dataTable id="tabela"
var="instituicoes"
value="#{instituicaoMB.exibirTodasInstituicoes()}"
paginator="true"
rows="6"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink}
{PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
<f:facet name="header">
Lista de Instituicoes
</f:facet>
<p:column headerText="Nome"
styleClass="column-big">
<h:outputText value="#{instituicoes.nomeInstituicao}" />
</p:column>
<p:column headerText="Diretor(a)"
styleClass="column-big">
<h:outputText value="#{instituicoes.diretorInstituicao}" />
</p:column>
<p:column headerText="Endereco"
styleClass="column-big">
<h:outputText value="#{instituicoes.enderecoInstituicao}" />
</p:column>
<p:column headerText="Telefone"
styleClass="column-big">
<h:outputText value="#{instituicoes.telefoneInstituicao}" />
</p:column>
<p:column headerText="Acoes"
styleClass="column-small">
<p:commandButton icon="ui-icon-search"
oncomplete="dlgVisualizar.show()"
title="Visualizar"
update=":formulario:dialogVisualizar">
<f:setPropertyActionListener value="#{instituicoes}"
target="#{instituicaoMB.instituicaoBean}" />
</p:commandButton>
<!-- <p:commandButton icon="ui-icon-pencil"
oncomplete="dlgEditar.show()"
title="Editar"
update=":formulario:dialogEditar">
<f:setPropertyActionListener value="#{instituicoes}"
target="#{instituicaoMB.instituicaoBean}" />
</p:commandButton>-->
</p:column>
</p:dataTable>
<p:dialog header="Detalhes"
id="dialogVisualizar"
widgetVar="dlgVisualizar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:panelGrid columns="2">
<p:outputLabel value="Nome: "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</p:dialog>
<!--<p:dialog header="Editar"
id="dialogEditar"
widgetVar="dlgEditar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:panelGrid columns="2">
<p:outputLabel value="Nome: "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</p:dialog>-->
</h:form>
</p:panel>
</p:layoutUnit>
</ui:define>
</ui:composition>
</html>
Então, como eu faria.
No <p:datatable, coloca selectionMode=“single” selection="#{instituicaoMB.selected}" rowKey="#{instituicoes.nomeInstituicao}".
O rowKey é o campo que á chave na tabela.
OK, com isso, você pode tirar o f:setPropertyActionListener dos seus commandButton.
Pois a propriedade “selection” do primefaces já relaciona o item que você seleciona no grid com a variável “selected” que está no servidor.
Aí nos seus dialogs, pra carregar os valores, ao invés de:
<h:outputText value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
mude para :
<h:outputText value="#{instituicaoMB.selected.nomeInstituicao}" />
E no lado do servidor, cria a variável “selected”, assim:
private InstituicaoBean selected;
E os gettes e setters:
public InstituicaoBean getSelected() {
return selected;
}
public void setSelected(InstituicaoBean selected) {
this.selected = selected;
}
Tenta isso. Retorna pra mim se deu certo, pois tambem estou começando a estudar java.
E nada melhor do que resolver problemas pra verificar se estou bom ou não no negócio…rsrs…
Valew
Beleza meu camarada =D
Obrigado pela ajuda!
Vou fazer os testes e retorno o mais rapido possivel! =D
bruno_bert , boa iniciativa de ajudar o pessoal…
Só uma dica, use a tag CODE para postar teus códigos!
Se naõ souber oq estou falando, leia as regras do forum, o how-to…
Vale a pena investir 2 minutos !!
abraços
Foi mal…to começando aqui…rsrs…
No <p:datatable, coloca selectionMode=“single” selection="#{instituicaoMB.selected}" rowKey="#{instituicoes.nomeInstituicao}".
O rowKey é o campo que á chave na tabela.
OK, com isso, você pode tirar o f:setPropertyActionListener dos seus commandButton.
Pois a propriedade “selection” do primefaces já relaciona o item que você seleciona no grid com a variável “selected” que está no servidor.
Aí nos seus dialogs, pra carregar os valores, ao invés de:
><h:outputText value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
mude para :
<h:outputText value="#{instituicaoMB.selected.nomeInstituicao}" />
E no lado do servidor, cria a variável “selected”, assim:
private InstituicaoBean selected;
E os gettes e setters:
public InstituicaoBean getSelected() {
return selected;
}
public void setSelected(InstituicaoBean selected) {
this.selected = selected;
}
Mas me diga uma coisa, eu tenho que manter o
value="#{instituicaoMB.exibirTodasInstituicoes()}"
?
bruno_bert,
fiz como você havia me falado, e o problema persistiu!
Na verdade, coloquei aqueles atributos no dataTable, e tirei os <f:setPropertyActionListener dos commandButton. Deu certo, perfeitamente.
Só que aquele problema, de quando tenho dois dialogs, um para editar e outro para visualizar, continua!
Quando tenho os dois no meu código, nenhum funciona =/
Veja como ficou o codigo:
<h:form id="formulario">
<p:dataTable id="tabela"
var="instituicoes"
value="#{instituicaoMB.exibirTodasInstituicoes()}"
selectionMode="single"
selection="#{instituicaoMB.instituicaoBean}"
rowKey="#{instituicoes.nomeInstituicao}"
paginator="true"
rows="6"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink}
{PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
<f:facet name="header">
Lista de Instituicoes
</f:facet>
<p:column headerText="Nome"
styleClass="column-big">
<h:outputText value="#{instituicoes.nomeInstituicao}" />
</p:column>
<p:column headerText="Diretor(a)"
styleClass="column-big">
<h:outputText value="#{instituicoes.diretorInstituicao}" />
</p:column>
<p:column headerText="Endereco"
styleClass="column-big">
<h:outputText value="#{instituicoes.enderecoInstituicao}" />
</p:column>
<p:column headerText="Telefone"
styleClass="column-big">
<h:outputText value="#{instituicoes.telefoneInstituicao}" />
</p:column>
<f:facet name="footer">
<p:commandButton icon="ui-icon-search"
update=":formulario:dialogVisualizar"
oncomplete="dlgVisualizar.show()"/>
<p:commandButton icon="ui-icon-pencil"
update=":formulario:dialogEditar"
oncomplete="dlgEditar.show()"/>
</f:facet>
</p:dataTable>
<p:dialog header="Detalhes"
id="dialogVisualizar"
widgetVar="dlgVisualizar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:panelGrid columns="2">
<p:outputLabel value="Nome: "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</p:dialog>
<p:dialog header="Editar"
id="dialogEditar"
widgetVar="dlgEditar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:panelGrid columns="2"
id="pn">
<p:outputLabel value="Nome: "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</p:dialog>
</h:form>
Cara, então tenta tirar os dialogs de dentro do seu h:form.
E coloca os componentes do dialog dentro de um form.
Daí, no atributo “update”, Ao invés do :formulario:dialog, você deixa apenas o :dialog.
Outra coisa que ajudaria é você enviar o log do server.
Zera o log. Daí faz as operações de clicar nos botões. E ve se o log apresenta algum erro.
Posta o erro aqui.
Assim:
<h:form id="formulario">
<p:dataTable id="tabela"
var="instituicoes"
value="#{instituicaoMB.exibirTodasInstituicoes()}"
selectionMode="single"
selection="#{instituicaoMB.instituicaoBean}"
rowKey="#{instituicoes.nomeInstituicao}"
paginator="true"
rows="6"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink}
{PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
<f:facet name="header">
Lista de Instituicoes
</f:facet>
<p:column headerText="Nome"
styleClass="column-big">
<h:outputText value="#{instituicoes.nomeInstituicao}" />
</p:column>
<p:column headerText="Diretor(a)"
styleClass="column-big">
<h:outputText value="#{instituicoes.diretorInstituicao}" />
</p:column>
<p:column headerText="Endereco"
styleClass="column-big">
<h:outputText value="#{instituicoes.enderecoInstituicao}" />
</p:column>
<p:column headerText="Telefone"
styleClass="column-big">
<h:outputText value="#{instituicoes.telefoneInstituicao}" />
</p:column>
<f:facet name="footer">
<p:commandButton icon="ui-icon-search"
update=":dialogVisualizar"
oncomplete="dlgVisualizar.show()"/>
<p:commandButton icon="ui-icon-pencil"
update=":dialogEditar"
oncomplete="dlgEditar.show()"/>
</f:facet>
</p:dataTable>
</h:form>
<p:dialog header="Detalhes"
id="dialogVisualizar"
widgetVar="dlgVisualizar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:form id="formView">
<h:panelGrid columns="2">
<p:outputLabel value="Nome: "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<h:outputText value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</h:form>
</p:dialog>
<p:dialog header="Editar"
id="dialogEditar"
widgetVar="dlgEditar"
closable="true"
modal="true"
appendToBody="true"
showEffect="clip"
hideEffect="clip"
resizable="false">
<h:form id="formEdit">
<h:panelGrid columns="2"
id="pn">
<p:outputLabel value="Nome: "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.nomeInstituicao}" />
<p:outputLabel value="Diretor(a): "
styleClass="labels" />
<p:inputText id="txtEditarNome"
value="#{instituicaoMB.instituicaoBean.diretorInstituicao}" />
</h:panelGrid>
</h:form>
</p:dialog>
Eis o erro
Mar 30, 2013 7:55:09 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [] threw exception
java.lang.IllegalStateException: CDATA tags may not nest
at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:664)
at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:172)
at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:342)
at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:155)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:200)
at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:124)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Tenta isso:
Coloca isso no seu web.xml
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
Outra coisa, vi que no seu primeiro post você usa @RequestScoped
Tenta mudar pra @SessionScoped ou @ViewScoped
Falow
Nada parceiro =/
Tentei todos os tipos de escopo, e nada =/
Hummm, vou tentar lhe ajudar, espero que de certo:
- Coloque um ID para cada commandButton (os que estao dando problema)
- Ao inves de usar commandButton, tente usar <p:graphicImage> (ou p:image, nao lembro ‘-’).
Flw!
Ainda nao deu certo =/
To aceitando qualquer sugestao, porque é pro meu TCC rsrsrs
Gustavo, você tirou os dialogs de dentro do form “formulario”, como eu havia comentado?
Cara, desculpa se nao estou conseguindo te ajudar…tambem estou começando…rs
Faz seguinte, coloca o seu código server side completo aí…
Falow
Que isso bruno, você está me ajudando muito rsrsrs
Estou fazendo umas mudanças no meu código, e brevemente postarei aqui para você =D