[RESOLVIDO] Problema para renderizar view JSF + PRIMEFACES

3 respostas
L

Então pessoal, sempre acompanho o GUJ pra poder fortalecer as idéias e ver o que ta sendo usado e recomendado!

ja estou a 3 dias com esse problema, tenho 2 views, 2 beans, um para cada view e passo os dados entre uma e outra com o ELFlash, mas não consigo restaurar os dados na outra view, o OBjeto é configurado corretamente, é atribuido corretamente mas não exibe, queria saber de vocês se tem como me ajudar, eu acho que é algo besta, mas não consegui enxergar:

segue código:

bean processocontroller

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sdv.controller;

import com.sdv.model.dao.EnderecoDAO;
import com.sdv.model.dao.ProcessoDAO;
import com.sdv.model.entidades.Processo;
import com.sdv.util.Mensagens;
import com.sun.faces.context.flash.ELFlash;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;


@ManagedBean(name = "pController")
@ViewScoped
public class ProcessoController implements Serializable {
    
    private Processo processo;
    private Mensagens mensagens;
    private String logradouro;

    public ProcessoController() {
        mensagens = new Mensagens();
    }

    @PostConstruct
    public void checkExternalParam(){
        if(ELFlash.getFlash().get("processo") != null){
        this.setProcesso((Processo) ELFlash.getFlash().get("processo"));
        ELFlash.getFlash().clear();
        }else {
        this.setProcesso(new Processo());
        }
    }
    
    public void novoProcesso() {
        this.processo = new Processo();
    }

    /**
     * @return the ocorrencia
     */
    public Processo getProcesso() {
        return processo;
    }

    /**
     * @param processo the ocorrencia to set
     */
    public void setProcesso(Processo parametro) {
        this.processo = parametro;
    }

    public void checkAction(ActionEvent evento) {
        if (this.processo.getId() != null) {
            this.atualizar();
        } else {
            this.salvar();
        }

    }

    public void salvar() {
        this.processo.setProcesso(this.gerarNomeProcesso());
        if (new ProcessoDAO().salvar(getProcesso())) {
            getMensagens().reportar(true, "Processo cadastrado com sucesso");
        } else {
            getMensagens().reportar(false, "Falha ao cadastrar");
        }

    }

    public void atualizar() {
        if (new ProcessoDAO().alterar(getProcesso())) {
            getMensagens().reportar(true, "Processo cadastrado com sucesso");
        } else {
            getMensagens().reportar(false, "Falha ao cadastrar");
        }
    }

    public List<Processo> getList() {
        List<Processo> lista = new ProcessoDAO().listaProcesso();
        return lista;
    }
    //public List<Processo> getList(){}

    public List<String> autoCompleteLogradouro(String consulta) {
        EnderecoDAO listaLogradouros = new EnderecoDAO();
        
        List<String> resultados = listaLogradouros.getLogradouroList(consulta);
        return resultados;
    }

    public void checarBairro() {
        this.processo.setEndereco(new EnderecoDAO().getEndereco(this.logradouro));
    }

    /**
     * @return the mensagens
     */
    public Mensagens getMensagens() {
        return mensagens;
    }

    /**
     * @param mensagens the mensagens to set
     */
    public void setMensagens(Mensagens mensagens) {
        this.mensagens = mensagens;
    }

    /**
     * @return the logradouro
     */
    public String getLogradouro() {
        return logradouro;
    }

    /**
     * @param logradouro the logradouro to set
     */
    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    private String gerarNomeProcesso() {
       Integer ultimoCodRegistrado = new ProcessoDAO().getLastProcessoID();
   
       
       StringBuilder montarCodigo = new StringBuilder();
       SimpleDateFormat dataFormatada = new SimpleDateFormat("MM.yyyy");
       montarCodigo.append(ultimoCodRegistrado);
       montarCodigo.append("/");
       montarCodigo.append(dataFormatada.format(this.processo.getDataEntrada()));
       return montarCodigo.toString();
    }
}

bean pesquisacontroller

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sdv.controller;

import com.sdv.model.dao.EnderecoDAO;
import com.sdv.model.dao.ProcessoDAO;
import com.sdv.model.entidades.Processo;
import com.sdv.util.Mensagens;
import com.sun.faces.context.flash.ELFlash;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

/**
 *
 * @author leandro
 */
@ManagedBean(name = "pesquisaController")
@ViewScoped
public class PesquisaController implements Serializable {

    private Mensagens mensagens;
    private String nomeProcesso;
    private String nomeBairro;
    private String numeroLogradouro;
    private List<Processo> listaProcesso;
    private List<String> listaBairros;
    private Processo processoSelecionado;
    private boolean render;

    public PesquisaController() {
        mensagens = new Mensagens();
    }

    public void pesquisaProcessoPorNome(ActionEvent evento) {
        this.setListaProcesso(new ProcessoDAO().getProcessoByName(this.getNomeProcesso()));
        this.setRender(true);
    }

    public void pesquisaProcessoPorBairro(ActionEvent evento) {
        this.setListaProcesso(new ProcessoDAO().getProcessoByBairro(this.getNomeBairro()));
        this.setRender(true);
    }
    
    public void pesquisaProcessoPorLogradouro(ActionEvent evento) {
        this.setListaProcesso(new ProcessoDAO().getProcessoByLogradouro(this.getNumeroLogradouro()));
        this.setRender(true);
    }

    public final List<String> listarBairros() {
        this.setListaBairros(new EnderecoDAO().getBairroList());
        return this.listaBairros;
    }

    /**
     * @return the mensagens
     */
    public Mensagens getMensagens() {
        return mensagens;
    }

    
    /**
     * @Metodo que passa o objeto para managed bean 
     */
    public String visualizar(){
        
     ELFlash.getFlash().put("processo", processoSelecionado);
     return "/faces/reservado/cadastroprocesso?faces-redirect=true&amp;includeViewParams=true";
    }
    /**
     * @param mensagens the mensagens to set
     */
    public void setMensagens(Mensagens mensagens) {
        this.mensagens = mensagens;
    }

    /**
     * @return the nomeProcesso
     */
    public String getNomeProcesso() {
        return nomeProcesso;
    }

    /**
     * @param nomeProcesso the nomeProcesso to set
     */
    public void setNomeProcesso(String nomeProcesso) {
        this.nomeProcesso = nomeProcesso;
    }

    /**
     * @return the nomeBairro
     */
    public String getNomeBairro() {
        return nomeBairro;
    }

    /**
     * @param nomeBairro the nomeBairro to set
     */
    public void setNomeBairro(String nomeBairro) {
        this.nomeBairro = nomeBairro;
    }

    /**
     * @return the numeroLogradouro
     */
    public String getNumeroLogradouro() {
        return numeroLogradouro;
    }

    /**
     * @param numeroLogradouro the numeroLogradouro to set
     */
    public void setNumeroLogradouro(String numeroLogradouro) {
        this.numeroLogradouro = numeroLogradouro;
    }

    /**
     * @return the listaProcesso
     */
    public List<Processo> getListaProcesso() {
        return listaProcesso;
    }

    /**
     * @param listaProcesso the listaProcesso to set
     */
    public void setListaProcesso(List<Processo> listaProcesso) {
        this.listaProcesso = listaProcesso;
    }

    /**
     * @return the listaBairros
     */
    public List<String> getListaBairros() {
        return listaBairros;
    }

    /**
     * @param listaBairros the listaBairros to set
     */
    public void setListaBairros(List<String> listaBairros) {
        this.listaBairros = listaBairros;
    }


    /**
     * @return the render
     */
    public boolean isRender() {
        return render;
    }

    /**
     * @param render the render to set
     */
    public void setRender(boolean render) {
        this.render = render;
    }

    /**
     * @return the processoSelecionado
     */
    public Processo getProcessoSelecionado() {
        return processoSelecionado;
    }

    /**
     * @param processoSelecionado the processoSelecionado to set
     */
    public void setProcessoSelecionado(Processo processoSelecionado) {
        this.processoSelecionado = processoSelecionado;
    }
    
    
}

as views de cadastramento/ visualização:
cadastroprocesso.xhtml

<?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:p="http://primefaces.org/ui"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:include src="/templates/menubar.xhtml" />

    <h:head>
        <title>Vistoria</title>
    </h:head>
    <h:body style="background-color: aliceblue">
        <f:view>


           <p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();"/>  

            <p:dialog modal="true" widgetVar="statusDialog" header="Status"   
                      draggable="false" closable="false">  
                <p:graphicImage value="/design/ajaxloadingbar.gif" />  
            </p:dialog>  

            <div id="divCentro" style="margin-left :-400px;">
                <h:form id="form" prependId="false">
                    <p:panel id="panel">
                        <p:messages id="messages" showDetail="true" autoUpdate="true" />
                        <p:panelGrid columns="2">
                            <f:facet name="header">
                                <h1>Cadastro de Processos</h1>
                            </f:facet>
                            <p:column>
                                <p:panelGrid columns="2">
                                    <h:outputLabel for="processo" value="Nome:"/>
                                    <p:inputText id="processo" value="#{pController.processo.processo}" label="Nome do Processo" disabled="true"/>
                                    <h:outputLabel for="dataEntrada" value="Data de Entrada:"/>
                                    <p:calendar id="dataEntrada" value="#{pController.processo.dataEntrada}" navigator="true" pattern="dd/MM/yyyy" />
                                    <h:outputLabel for="resultadosLogradouro" value="Nº Logradouro:"/>
                                    <p:row>
                                        <p:inputText id="resultadosLogradouro" value="#{pController.logradouro}"/>
                                        <p:commandButton id="botaoChecarBairro" value="Checar Bairro" actionListener="#{pController.checarBairro}" update="panel" style="width:20;height:1;"/>
                                    </p:row>
                                    <h:outputLabel for="bairro" value="Bairro:"/>
                                    <p:inputText id="bairro" value="#{pController.processo.endereco.bairro}" disabled="true"/>
                                    <h:outputLabel for="rua" value="Rua:"/>
                                    <p:inputText id="rua" value="#{pController.processo.endereco.rua}" disabled="true"/>
                                </p:panelGrid>
                            </p:column>
                            <p:column>
                                <p:panelGrid columns="2">
                                    <h:outputLabel for="assunto" value="Assunto:"/>
                                    <p:inputText id="assunto" value="#{pController.processo.assunto}" label="Orgão do Processo"/>
                                    <h:outputLabel for="interessado" value="Interessado:"/>
                                    <p:inputText id="interessado" value="#{pController.processo.interessado}" label="Orgão do Processo"/>
                                    <h:outputLabel for="valor" value="Valor:"/>
                                    <p:inputText id="valor" value="#{pController.processo.valor}" label="Orgão do Processo" />
                                    <h:outputLabel for="tecnico" value="Técnico:"/>
                                    <p:inputText id="tecnico" value="#{pController.processo.tecnico}" label="Orgão do Processo"/>
                                    <h:outputLabel for="dataSaida" value="Data de Saida:"/>
                                    <p:calendar id="dataSaida" value="#{pController.processo.dataSaida}" navigator="true" pattern="dd/MM/yyyy" />
                                </p:panelGrid>
                            </p:column>
                        </p:panelGrid>
                        <f:facet name="footer">
                            <p:commandButton id="botaoSalvar" value="Validar" actionListener="#{pController.checkAction}"/>
                            <p:commandButton id="botaoVoltar" value="Voltar" action="#{central.redirectTOmenu()}" />
                        </f:facet>
                    </p:panel>

                </h:form>
            </div>
        </f:view>
    </h:body>
</html>

view de pesquisa que tem 1 command link que envia os dados pelo flash
pesquisarprocesso.xhtml

<?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:p="http://primefaces.org/ui"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:include src="/templates/menubar.xhtml" />
    <h:body style="background-color: aliceblue">
        <f:view>
            <div id="divCentro">
                <h:form id="formMensagens">
                    <p:messages id="messages" showDetail="true" autoUpdate="true" />    
                </h:form>
            </div>
            <div id="divConsultaProcesso" class="divCentro">
                <h:form id="formConsultaProcesso">
                    <p:panelGrid columns="1">
                        <p:row>
                            <p:outputLabel for="processo" value="Código do processo:"/>
                            <p:inputText id="processo" value="#{pesquisaController.nomeProcesso}" label="nome"/>
                            <p:commandButton id="botaoProcessoPorNome" value="Pesquisar" update="panelListaProcesso" actionListener="#{pesquisaController.pesquisaProcessoPorNome}"  />
                        </p:row>
                        <p:row>
                            <p:outputLabel for="bairro" value="Bairro:               "/>
                            <p:selectOneMenu id="bairro" value="#{pesquisaController.nomeBairro}" effect="fade">  
                                <f:selectItem itemLabel="Selecione" itemValue="" />  
                                <f:selectItems value="#{pesquisaController.listarBairros()}"/>  
                            </p:selectOneMenu>
                            <p:commandButton id="botaoProcessoPorBairro" value="Pesquisar" update="panelListaProcesso" actionListener="#{pesquisaController.pesquisaProcessoPorBairro}"  />
                        </p:row>
                        <p:row>
                            <p:outputLabel for="logradouro" value="Logradouro: "/>
                            <p:inputText id="logradouro" value="#{pesquisaController.numeroLogradouro}" label="nome"/>
                            <p:commandButton id="botaoProcessoPorlogradouro" value="Pesquisar" update="panelListaProcesso" actionListener="#{pesquisaController.pesquisaProcessoPorLogradouro}"  />
                        </p:row>
                    </p:panelGrid>

                    <p:outputPanel id="panelListaProcesso">  
                        <p:dataTable var="processo" value="#{pesquisaController.listaProcesso}" id="tabelaProcesso" tableStyle="width:auto"  rendered="#{pesquisaController.render}" 
                                     paginator="true" rows="10"  
                                     paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                                     rowsPerPageTemplate="5,10,15">
                            <p:column headerText="Processo" filterBy="#{processo.processo}" filterMatchMode="contains" id="processo">
                                
                                <h:inputHidden id="id" value="#{processo.id}"/>
                                <h:commandLink value="#{processo.processo}" action="#{pesquisaController.visualizar()}" >
                                    <f:setPropertyActionListener value="#{processo}" target="#{pesquisaController.processoSelecionado}" />
                                </h:commandLink>
                            </p:column>  
                            <p:column headerText="Data Entrada" filterBy="#{processo.dataEntrada}" filterMatchMode="contains" id="orgao">  
                                <h:outputText value="#{processo.dataEntrada}" >
                                    <f:convertDateTime pattern="dd/MM/yyyy"/>                                
                                </h:outputText>    
                            </p:column>  
                            <p:column headerText="Bairro" id="bairro">  
                                <h:outputText value="#{processo.endereco.bairro}" />  
                            </p:column>
                        </p:dataTable> 
                    </p:outputPanel>
                </h:form>
            </div>
        </f:view>
    </h:body>
</html>

facesconfig

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->

 <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
                version="2.0">

</faces-config>

web xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

ja dei uma debugada no codigo, o parametro pelo flash ta ok, mais não tem santo que faça renderizar o objeto atualizado na tela cadastroprocesso.xhtml
ajuda ai pessoal! não queria usar sessionscoped, com o session eu faço isso em 2 tapas.

o problema está com os 2 beans? está na pagina? alguem da uma ajuda!!!!!!!!

3 Respostas

M

Opa leandro cara se achar alguma coisa relacionada a isso manda ai, mas no meu ver so @Session mesmo.

L

com @sessionscope é tranquilo resolver, mais o ideal é utilizar o recurso somente quando solicitado, e nisso o sessionscope não resolve, teria de ser @viewscope

é como eu falei, os dados são passados pro MB, testei isso no debug, mais não sei como fazer isso aparecer na tela.

L

Resolvi ler o codigo todo denovo, tem uma parte que não foi postada aqui. que tinha isso:

menubar.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.org/ui"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <!--<f:view contentType="text/html"/>-->
    <link href="#{facesContext.externalContext.requestContextPath}/projeto.css" rel="stylesheet" type="text/css" />

    <h:head/>
    <h:body>
        <h:form>
            <f:view>
                <p:graphicImage id="imagen" value="/imagens/logo.PNG" width="100%" height="110px"/>    
            </f:view>
            <p:growl id="messages" showDetail="false" showSummary="false"/> 
            <p:menubar id="menubar"> 
                <p:menuitem value="Home" ajax="false" icon="ui-icon-close" url="/faces/index.xhtml" />  
                <p:submenu label="Processo" icon="ui-icon-document">
                    <p:menuitem id="menuprocesso" value="Novo Processo" ajax ="false" icon="ui-icon-document" 
                                onclick="#{pController.novoProcesso()};" action="#{central.redirectTOcadastroProcesso()}"/>
                </p:submenu>
                <p:menuitem value="Consultas" icon="ui-icon-document" url="/faces/reservado/pesquisarprocesso.xhtml"/>
                
            </p:menubar>  
        </h:form>
    </h:body>    
</html>
este
<p:menuitem id="menuprocesso" value="Novo Processo" ajax ="false" icon="ui-icon-document" 
                                onclick="#{pController.novoProcesso()};" action="#{central.redirectTOcadastroProcesso()}"/>
era o câncer, pois eu começei como @sessionscope, então toda vez que o usuário quisesse cadastrar um novo processo, o onclick instanciava um novo processo e com isso ficava ok então resolvi por recomendação de muitos usar o @viewscope, e ai, o bean ja era feito nesse include acima, então quando ele renderizava a page cadastroprocesso.xhtml ele realmente não exibiria os dados pois ja tinha instanciado, eu precisaria re-renderizar a pagina, e teria mais trabalho, então tirei o onclick deixando assim:
<p:menuitem id="menuprocesso" value="Novo Processo" ajax ="false" icon="ui-icon-document" 
                                action="#{central.redirectTOcadastroProcesso()}"/>

agora ele instancia o MB em cadastroprocesso e não mais em menubar, tinha certeza que era uma besteira!

@mixcleiton pode usar dessa forma ai que funciona que é uma beleza o pessoal usa o @conversationscope e outros ai do CODI e seam, mais como o jsf ja deixa disponivel o ELFlash, que você pode armazenar teus objetos então não é necessário injetar outras coisas em seu projeto, a não ser que seja necessário.

Criado 14 de agosto de 2012
Ultima resposta 14 de ago. de 2012
Respostas 3
Participantes 2