[Resolvido]Carregar dados em uma tela com view scoped

7 respostas
D

Boa Tarde.
Estou fazendo um cadastro de nota fiscal, para fazer esse cadastro utilizei o componente p:wizard do primefaces.
O escopo dessa tela de cadastro é @ViewScoped, e para efetuar o cadastro está funcionando certinho.

Meu problema ocorre quando tenho que efetuar a alteração de uma nota a partir de uma tela de listagem.
Tenho um dataTable que lista as notas cadastradas, e um link para o método do bean, segue código abaixo.

<h:commandLink action="#{NotaFiscalCadastroBean.Editar}" >
	<h:graphicImage url="../../comum/img/edit.png"/>
	<f:setPropertyActionListener target="#{NotaFiscalEditBean.notaFiscal}" value="#{notaFiscal}"/>
</h:commandLink>

Como faço para carregar os dados que o usuário escolheu no dataTable ?

obs.: Já mudei o scope para Request, mas dai o componente p:wizard não funciona corretamente pois perde os dados ao passar de aba, tambem tentei usar o session, e dai o problema que ocorre é que ao tentar cadastrar uma nova nota fiscal o sistema abre a nota fiscal que estava sendo editada…

att

7 Respostas

WRYEL

A primeira alternativa que me vem a cabeça é: @SessionScoped, e no metodo de cadastro, antes de direcionar para algum lugar, limpar a referencia do bean.

rogeriopaguilar

Bom, eu tive um problema parecido em uma tela aqui. Eu não sei se é a forma mais correta de fazer, mas no meu caso eu fiz o seguinte.

1 - Quando o usuário vem da tela anterior (a tela de listagem) eu chamo um método no managed bean:

...
    //Usuário veio da tela de solicitacao (solicitação feita pelo cliente)
    public String iniciarPelaSolicitacao(Long idSolicitacao) {
        log.info("Usuário entrou na tela pela tela de solicitação! ID --> " + idSolicitacao);
        tipoAberturaFormulario = TipoAberturaFormulario.PREENCHIMENTO;
        try {
            formulario = SpringFacesUtil.getFormularioService().getFormularioAtual();
            JsfUtil.addRequestAtribute(CHAVE_FORMULARIO, formulario);
   ...

A última linha acima adiciona o bean vindo da tela anterior no escopo de request “na marra”, ou seja, chamando

FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(chave, obj);

2 - No método get do managedbean que retorna o bean para cadastro ou edição, eu verifico se o mesmo existe no
escopo de request antes e caso exista eu retorno ele:

public Formulario getFormulario() {
        Formulario frmTmp = (Formulario) JsfUtil.getRequestAtribute(CHAVE_FORMULARIO);
        if(frmTmp != null) {
            formulario = frmTmp;
        }
        return formulario;
    }

Na primeira linha do método acima eu verifico se o bean existe no escopo de request e se existir eu coloco ele no campo do managedbean que está
com escopo viewscope. A declaração do bean para o formulário é a seguinte:

@ManagedBean
@ViewScoped
public class FormularioBean implements Serializable{

    private static Logger log = Logger.getLogger(FormularioBean.class);
    private static final String CHAVE_FORMULARIO = "CHAVE_FORMULARIO";    
    private static final String CHAVE_TIPO_ABERTURA = "CHAVE_TIPO_ABERTURA";
    private static final String CHAVE_ID_SOLICITACAO = "CHAVE_ID_SOLICITACAO";
    private static final String CHAVE_IDS_RESPOSTAS_INVALIDAS = "CHAVE_IDS_RESPOSTAS_INVALIDAS";
    
    static enum TipoAberturaFormulario{PREENCHIMENTO, EDICAO_FORMULARIO, VALIDACAO, REVISAO_FORMULARIO_REPROVADO, PREENCHIMENTO_PARA_PUBLICACAO_SITE};
    
    private Formulario formulario = new Formulario();

Como eu sempre crio ele (new Formulario()), quando entro na tela de inclusão ele cria um novo e quando eu entro para edição como visto no item 1 eu coloco o bean da tela anterior no escopo de request e este é substituído no método get.

Esse método eu utilizei em uma das telas, mas depois eu percebi que o melhor é deixar tudo na mesma tela, sendo que a edição eu coloco em um p:dialog que fica invisível e passei a fazer assim nas outras.

rogeriopaguilar

dupliquei sem querer a resposta…

D

WRYEL já fiz essa ideia tbm, mas não foi aprovada pelo pessoal do teste, porque se o usuario abrir 2 abas, logicamente as duas irao estar com os dados do registro que esta sendo editado. Mas obrigado pela força

D

Gente, obrigado pelas repostas, mas consegui resolver da seguinte maneira…

no xhtml fiz assim (passando parametros)

<h:commandLink action="notaFiscalCadastro" >
		<h:graphicImage url="../../comum/img/edit.png"/>
		<f:setPropertyActionListener target="#{NotaFiscalCadastroBean.notaFiscal}" value="#{notaFiscal}"/>
		<f:param value="#{notaFiscal.numeroNota}" name="numeroNota"/>
		<f:param value="#{notaFiscal.dataEmissao}" name="dataEmissao"/>
		<f:param value="#{notaFiscal.fornecedor.pessoaID}" name="fornecedor"/>
</h:commandLink>

e no bean, capiturei os mesmos assim (usando a annotation @PostConstruct), digo que ele deve executar esse metodo assim que a pagina for carregada, e pego os parametros passado no xhtml

@PostConstruct
public void Init(){
	
	String numeroNota			=	FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("numeroNota");
	String dataEmissaoTemp		=	FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("dataEmissao");
	String fornecedorTemp		=	FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("fornecedor");
}
D

Deverling:
Boa Tarde.
Estou fazendo um cadastro de nota fiscal, para fazer esse cadastro utilizei o componente p:wizard do primefaces.
O escopo dessa tela de cadastro é @ViewScoped, e para efetuar o cadastro está funcionando certinho.

Meu problema ocorre quando tenho que efetuar a alteração de uma nota a partir de uma tela de listagem.
Tenho um dataTable que lista as notas cadastradas, e um link para o método do bean, segue código abaixo.

<h:commandLink action="#{NotaFiscalCadastroBean.Editar}" >
	<h:graphicImage url="../../comum/img/edit.png"/>
	<f:setPropertyActionListener target="#{NotaFiscalEditBean.notaFiscal}" value="#{notaFiscal}"/>
</h:commandLink>

Como faço para carregar os dados que o usuário escolheu no dataTable ?

obs.: Já mudei o scope para Request, mas dai o componente p:wizard não funciona corretamente pois perde os dados ao passar de aba, tambem tentei usar o session, e dai o problema que ocorre é que ao tentar cadastrar uma nova nota fiscal o sistema abre a nota fiscal que estava sendo editada…

att

danilo.akamine

pq vocês não usam o @ConversationScoped do CDI?
é o escopo maior que @View e menor que @Session.
a ideia dele é justamente essa, trafegar diversos dados por telas diferentes.
e ainda não terá o problema de abrir duas abas e ver a mesma informação.

Criado 15 de fevereiro de 2012
Ultima resposta 17 de fev. de 2012
Respostas 7
Participantes 4