How to pass a parameter between two views with @Viewscoped

Asked

Viewed 124 times

0

I need to pass an id of an object between the views, the Beans of both are view scoped, I’m trying to pass via f:param, but I can’t. The value always arrives null in the other view

View 1

<ui:define name="titulo">
        ARTs Aptas a Livro de Ordem
</ui:define>

<script type="text/javascript">    
    PrimeFaces.locales['pt_BR'] = {
        closeText: 'Fechar',
        prevText: 'Anterior',
        nextText: 'Próximo',
        monthNames: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
        monthNamesShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
        dayNames: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
        dayNamesShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
        dayNamesMin: ['D', 'S', 'T', 'Q ', 'Q', 'S ', 'S'],
        weekHeader: 'Semana',
        FirstDay: 1,
        isRTL: false,
        showMonthAfterYear: false,
        yearSuffix: '',
        timeOnlyTitle: 'Só Horas',
        timeText: 'Tempo',
        hourText: 'Hora',
        minuteText: 'Minuto',
        secondText: 'Segundo',
        currentText: 'Data Atual',
        ampm: false,
        month: 'Mês',
        week: 'Semana',
        day: 'Dia',
        allDayText: 'Todo dia'
    };
</script>

<ui:define name="content">
    <h:form>
        <p:dataTable value="#{artsAptasLivroOrdemController.artsAptas}" 
                 id="tableArtsAptas" 
                 rowKey="#{item.numeroArt}" var="item"
                 emptyMessage="Você não possui ARTs aptas a Livro de Ordem"
                 paginator="true" rows="20">

            <f:facet name="header">
                ARTs Aptas a Livro de Ordem
            </f:facet>

            <p:column headerText="Numero da ART" sortBy="#{item.numeroArt}">
                  <h:outputText value="#{item.numeroArt}" />
            </p:column>

            <p:column headerText="Tipo de ART" sortBy="#{item.tipoArt.descricao}">
                  <h:outputText value="#{item.tipoArt.descricao}" />
            </p:column>

            <p:column headerText="Subtipo de ART" sortBy="#{item.subtipoArt.descricao}">
                  <h:outputText value="#{item.subtipoArt.descricao}" />
            </p:column>

            <p:column headerText="Data de Elaboração" sortBy="#{item.dataElaboracao}">
                  <h:outputText value="#{item.dataElaboracao}">
                        <f:convertDateTime pattern="dd/MM/yyyy" />
                  </h:outputText>
            </p:column>

            <p:column headerText="Profissional Contratado" sortBy="#{item.nomeProfissionalContratado}">
            </p:column>

            <p:column headerText="Empresa Contratada" sortBy="#{item.nomeEmpresaContratada}">
                  <h:outputText value="#{item.nomeEmpresaContratada}" />
            </p:column>

            <p:column headerText="Contratante" sortBy="#{item.contrato.identificacaoContratante.nome}">
                  <h:outputText value="#{item.contrato.identificacaoContratante.nome}" />
            </p:column>

            <p:column headerText="Proprietário" sortBy="#{item.nomeProprietario}">
                  <h:outputText value="#{item.nomeProprietario}" />
            </p:column>

            <p:column headerText="Criar/Ver Livro de Ordem">
                <p:commandLink id="criarLivroOrdemButton"
                               immediate="true"
                               onclick="dialogLivroOrdem.show();"
                               update="#{artsAptasLivroOrdemController.componentes}">

                    <f:setPropertyActionListener value="#{item}" target="#{artsAptasLivroOrdemController.artApta}"/>

                    <f:param name="numeroArt" value="#{item.numeroArt}" />

                    <p:graphicImage alt="Criar/Ver" value="../imagens/site/edit.gif" />

                </p:commandLink>

                <p:commandLink immediate="true"
                               update="#{livroOrdemController.componentes}"
                               action="livroOrdem.xhtml?faces-redirect=true">

                    <f:param name="numeroArt" value="#{item.numeroArt}"/>

                    <f:setPropertyActionListener value="#{item}" target="#{livroOrdemController.art}"/>

                    <p:graphicImage alt="Ver Livro de Ordem" value="../imagens/site/detail.png" />

                </p:commandLink>

            </p:column>

        </p:dataTable>

        <p:dialog id="dialogLivroOrdem"
                  showEffect="fade" hideEffect="fade"
                  modal="true" header="Novo Livro de Ordem"
                  widgetVar="dialogLivroOrdem" minHeight="40">

            <h:form id="formCriarNovoLivro">

                <b>
                    <h:outputLabel value="Numero da ART: " />
                </b>
                <h:outputText id="numeroArt" value="#{artsAptasLivroOrdemController.artApta.numeroArt}" />
                <br />
                <br />

                <b>
                    <h:outputLabel value="Nome do Proprietário: " />
                </b>
                <h:outputText id="nomeProprietario" value="#{artsAptasLivroOrdemController.artApta.nomeProprietario}" />
                <br />
                <br />

                <b>
                    <h:outputLabel value="Endereço da Obra: " />
                </b>
                <h:outputText id="enderecoObra" value="#{artsAptasLivroOrdemController.artApta.enderecoObraServico.tipoLogradouro} #{artsAptasLivroOrdemController.artApta.enderecoObraServico.logradouro}, 
                              Nº #{artsAptasLivroOrdemController.artApta.enderecoObraServico.numero}, 
                              CEP: #{artsAptasLivroOrdemController.artApta.enderecoObraServico.cep}, 
                              #{artsAptasLivroOrdemController.artApta.enderecoObraServico.bairro}, 
                              #{artsAptasLivroOrdemController.artApta.enderecoObraServico.cidade} - #{artsAptasLivroOrdemController.artApta.enderecoObraServico.uf}" />
                <br />
                <br />

                <b>
                    <h:outputLabel for="dataPrevistaConclusaoObra" value="Data Prevista para Conclusão da Obra*: " />
                </b>
                <p:calendar id="dataRealInicioObra"
                            required="true"
                            requiredMessage="Campo Obrigatório"
                            pattern="dd/MM/yyyy"
                            locale="pt_BR"
                            showOn="button"
                            value="#{artsAptasLivroOrdemController.dataRealInicioObra}"/>
                <br />
                <br />

                <b>
                    <h:outputLabel for="dataPrevistaConclusaoObra" value="Data Prevista para Conclusão da Obra*: " />
                </b>
                <p:calendar id="dataPrevistaConclusaoObra"
                            required="true"
                            requiredMessage="Campo Obrigatório"
                            pattern="dd/MM/yyyy"
                            locale="pt_BR"
                            showOn="button"/>
                <br />
                <br />

                <p:commandButton value="Criar Novo Livro"
                                 action="#{artsAptasLivroOrdemController.criarLivroOrdem()}"                                   
                                 oncomplete="dialogLivroOrdem.hide();"
                                 update="#{artsAptasLivroOrdemController.componentes}">

                    <f:setPropertyActionListener value="#{artsAptasLivroOrdemController.artApta}" target="#{livroOrdemController.art}"/>    

                </p:commandButton>

                <p:commandButton value="Cancelar"
                                 onclick="dialogLivroOrdem.hide();" />

            </h:form>

        </p:dialog>


    </h:form>

</ui:define>

View 2

<ui:define name="titulo">
    Livro de Ordem
</ui:define>

<ui:define name="content">

    <f:metadata>
        <f:viewParam name="i" value="#{livroOrdemController.numeroArt}" />
    </f:metadata>
    <h:form>
    <p:panel header="DADOS DO LIVRO DE ORDEM">

        <h:panelGrid columns="2" cellpadding="10">

            <h:outputLabel value="Numero da ART: "/>

            <h:outputText
                id="numeroArt1"
                value="#{livroOrdemController.numeroArt}"/>          

            <h:outputLabel value="Nome do Proprietário: "/>
            <h:outputText
                id="nomeProprietario1"
                value="#{artsAptasLivroOrdemController.artApta.nomeProprietario}"/>

            <h:outputLabel value="Endereço da Obra: "/>
            <h:outputText
                id="enderecoObra1"
                value="#{artsAptasLivroOrdemController.artApta.enderecoObraServico.tipoLogradouro} #{artsAptasLivroOrdemController.artApta.enderecoObraServico.logradouro}, 
                              Nº #{artsAptasLivroOrdemController.artApta.enderecoObraServico.numero}, 
                              CEP: #{artsAptasLivroOrdemController.artApta.enderecoObraServico.cep}, 
                              #{artsAptasLivroOrdemController.artApta.enderecoObraServico.bairro}, 
                              #{artsAptasLivroOrdemController.artApta.enderecoObraServico.cidade} - #{artsAptasLivroOrdemController.artApta.enderecoObraServico.uf}"/>

           <p:commandButton value="Adicionar Relato"
                            onclick="dialogRelato.show();"/>

        </h:panelGrid>

    </p:panel>

    <p:dialog id="dialogRelato"
                  showEffect="fade" hideEffect="fade"
                  modal="true" header="Novo Relato"
                  widgetVar="dialogRelato" minHeight="40">

            <h:form id="formCriarNovoLivro">

                <b>
                    <h:outputLabel value="Tipo de Relato: " />
                </b>
                <h:inputText id="tipoRelato" value="#{artsAptasLivroOrdemController.tipoRelato}" />
                <br />
                <br />

                <b>
                    <h:outputLabel for="dataRelato" value="Data do Relato: " />
                </b>
                <p:calendar id="dataRelato"
                            required="true"
                            requiredMessage="Campo Obrigatório"
                            pattern="dd/MM/yyyy"
                            locale="pt_BR"
                            showOn="button"
                            value="#{artsAptasLivroOrdemController.dataRelato}"/>
                <br />
                <br />

                <b>
                    <h:outputLabel for="etapaObra" value="Etapa da Obra: " />
                </b>
                <h:inputText id="etapaObra" value="#{artsAptasLivroOrdemController.etapa}" />
                <br />
                <br />

                <b>
                    <h:outputLabel for="inicioEtapa" value="Inicio da Etapa: " />
                </b>
                <p:calendar id="inicioEtapa"
                            required="true"
                            requiredMessage="Campo Obrigatório"
                            pattern="dd/MM/yyyy"
                            locale="pt_BR"
                            showOn="button"
                            value="#{artsAptasLivroOrdemController.dataIncioEtapa}"/>
                <br />
                <br />

                <b>
                    <h:outputLabel for="fimEtapa" value="Términio da Etapa: " />
                </b>
                <p:calendar id="fimEtapa"
                            required="true"
                            requiredMessage="Campo Obrigatório"
                            pattern="dd/MM/yyyy"
                            locale="pt_BR"
                            showOn="button"
                            value="#{artsAptasLivroOrdemController.dataTerminioEtapa}"/>
                <br />
                <br />

                <b>
                    <h:outputLabel value="Descrição: " />
                </b>
                <h:inputText id="numeroArt" value="#{artsAptasLivroOrdemController.descricao}" />
                <br />
                <br />

                <p:commandButton value="Adicionar Relato"                                   
                                 oncomplete="dialogRelato.hide();"
                                 update="#{artsAptasLivroOrdemController.componentes}">

                    <f:setPropertyActionListener value="#{artsAptasLivroOrdemController.artApta}" target="#{livroOrdemController.art}"/>    

                </p:commandButton>

                <p:commandButton value="Cancelar"
                                 onclick="dialogRelato.hide();" />

            </h:form>

        </p:dialog>
        </h:form>
</ui:define>

  • I may be mistaken, but I think it makes sense to be null in the other Managedbean precisely because the first is ViewScoped. From the moment you left the view, everything related to it dies at that time. Already experienced putting a wider scope? SessionScoped for example

  • I didn’t want something so broad. With Requestscoped I could do it?

  • I think the RequestScoped is minor that the ViewScoped, is not?

1 answer

0


Work and a legacy system that 99% of the screens are request scoped and whenever I need to share information between two views, I do as follows:

View 1

    //Seta seu atributo na view 1 através de um método, etc...
    HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    session.setAttribute("meuAtributo", new Object());

View 2

    //No construtor do MB da view 2, recupero o atributo
    HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    Object obj = session.getAttribute("meuAtributo");
    //depois de usar é bom remover o atributo da session
    session.removeAttribute("meuAtributo");
  • Thank you! Solved.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.