Estou criando uma lógica simples de carrinho de compras, mas estou com um problema que minha lista está simplesmente perdendo o valor após a adição de um ítem novo.
<!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"xmlns:h="http://java.sun.com/jsf/html"><h:head><title>Carrinho de Compras</title></h:head><h:body><h:form><h:outputLabelvalue="Produto: "/><h:inputTextvalue="#{carrinhoMB.produto}"/><h:commandButtonaction="#{carrinhoMB.adiciona}"value="Adicionar ao Carrinho"/><hr/><h:outputLabelvalue="Listagem: "/><h:commandButtonaction="#{carrinhoMB.listagem}"value="Listagem"/><h:outputLabelvalue="Produtos no carrinho :"/><h:dataTablevalue="#{carrinhoMB.produtos}"var="p"><h:column><h:outputTextvalue="#{p}"/></h:column></h:dataTable></h:form></h:body>
Quando chamo o método Listagem() (que so foi criado para tentar resolver o problema) minha lista está vazia. Agora se eu coloco um Sysout no método adicionar(), a lista é preenchida, mas saindo dele já esvazia.
O stateful fica vivo enquanto a referência dele existir.
Vc está injetando esse cara em um ManagedBean request scoped, ao final de cada requisição esse cara morre e com isso morre tb a referência do ejb.
Mude o escopo do ManagedBean.
OBS.: É uma pessima prática injetar algo stateful em algum componente de escopo menor.
dambros
Muito obrigado pelo resposta. Eu trabalhando com SessionScoped a lista parou de perder os valores, apesar de meu JSF ainda não exibir os dados.
Quando disse ser uma má prática fazer o que esou fazendo, qual seria o ideal?
Hebert_Coelho
dambros:
Muito obrigado pelo resposta. Eu trabalhando com SessionScoped a lista parou de perder os valores, apesar de meu JSF ainda não exibir os dados.
Quando disse ser uma má prática fazer o que esou fazendo, qual seria o ideal?
Na boa? Nunca vi um caso que justificasse utilizar Stateful. Então não sei te falar qual seria a melhor prática. [=
dambros
Como eu faria um exemplo de Carrinho de Compra não mantendo o estado então, se eu não usar Stateful?
Hebert_Coelho
dambros:
Como eu faria um exemplo de Carrinho de Compra não mantendo o estado então, se eu não usar Stateful?
Pq não usar o HTTPSession? muito mais simples e fácil. É possível também utilizar cookie, ou uma solução mais radical seria persistir no DB.
dambros
Hebert Coelho:
dambros:
Como eu faria um exemplo de Carrinho de Compra não mantendo o estado então, se eu não usar Stateful?
Pq não usar o HTTPSession? muito mais simples e fácil. É possível também utilizar cookie, ou uma solução mais radical seria persistir no DB.
Faz sentido. Como estou tentando aprender EJB e JSF, estou obrigando-me a utilizar essas tecnologias pra tudo ultimamente.
Você saberia me dizer porque meu método getProdutos() da classe CarrinhoBean retorna 13 outputs vazios se eu coloco um Sysout nele? A lista parece que tem valor após eu ter corrigido o scope, mas no método que deveria preencher meu JSF ela simplesmente está vazia.
Como eu faria um exemplo de Carrinho de Compra não mantendo o estado então, se eu não usar Stateful?
Pq não usar o HTTPSession? muito mais simples e fácil. É possível também utilizar cookie, ou uma solução mais radical seria persistir no DB.
Faz sentido. Como estou tentando aprender EJB e JSF, estou obrigando-me a utilizar essas tecnologias pra tudo ultimamente.
Você saberia me dizer porque meu método getProdutos() da classe CarrinhoBean retorna 13 outputs vazios se eu coloco um Sysout nele? A lista parece que tem valor após eu ter corrigido o scope, mas no método que deveria preencher meu JSF ela simplesmente está vazia.
Não analisei seu código. Apenas analisei o conceito aplicado. [=
D
diego_pereira1
Tu pode usar o @Stateless e usar o scopo de sessão…
Ali no teu metodo listagem, no System.out.pr… bota produtos.size() pra ti saber o tamanho dele.
A produtos só vão aparecer na tabela quando:
Tu add produtos na lista.
Tu atualizar a dataTable.
Pra ti não perde muito tempo só dá um F5 na tela depois que tu add produtos.
Testa ai… qlqer coisa explico melhor.
Abraço!
dambros
diego_pereira:
Tu pode usar o @Stateless e usar o scopo de sessão…
Ali no teu metodo listagem, no System.out.pr… bota produtos.size() pra ti saber o tamanho dele.
A produtos só vão aparecer na tabela quando:
Tu add produtos na lista.
Tu atualizar a dataTable.
Pra ti não perde muito tempo só dá um F5 na tela depois que tu add produtos.
Testa ai… qlqer coisa explico melhor.
Abraço!
Primeiramente obrigado pelo retorno.
Tentei apertar F5 na página, mas mesmo assim o valor não é mostrado. O size() mostra corretamente (usando Stateful), mas o valor não atualiza no JSF.
Mantive igualmente como postei. Há algum erro nele?
Emerzoom
Olá pessoal, dambros, eu não gosto muito de usar o xhtml como vc fez. Prefiro me preocupar apenas com o que vai dentro das tags <f:view></f:view>. Acho que as demais tags como head, body, não precisar vir de facelets. Qdo eu comecei a lidar com isso, alguns dos fields e tables realmente não apareciam. Aí, decidi fazer como fiz abaixo e não tive mais esse tipo de problema.
Se vc quiser, pode tentar usando assim:
<?xml version="1.0" encoding="ISO-8859-1" ?><!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"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"><head><metahttp-equiv="Content-Type"content="text/html; charset=ISO-8859-1"/><title>Área Pública</title></head><body><f:view><!-- Coloque aqui seus facelets --></f:view></body></html>
No mais, tudo que vc fez eu fiz aqui pra testar e deu certo, com lista exibindo e tudo.
Tente tb dar um “clean” no projeto e no seu servidor de aplicação. Pode ser que tenha alguma sujeira atrapalhando tb, que é bastante comum…
Hebert_Coelho
Emerzoom:
Olá pessoal, dambros, eu não gosto muito de usar o xhtml como vc fez. Prefiro me preocupar apenas com o que vai dentro das tags <f:view></f:view>. Acho que as demais tags como head, body, não precisar vir de facelets. Qdo eu comecei a lidar com isso, alguns dos fields e tables realmente não apareciam. Aí, decidi fazer como fiz abaixo e não tive mais esse tipo de problema.
Se vc quiser, pode tentar usando assim:
<?xml version="1.0" encoding="ISO-8859-1" ?><!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"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"><head><metahttp-equiv="Content-Type"content="text/html; charset=ISO-8859-1"/><title>Área Pública</title></head><body><f:view><!-- Coloque aqui seus facelets --></f:view></body></html>
No mais, tudo que vc fez eu fiz aqui pra testar e deu certo, com lista exibindo e tudo.
Tente tb dar um “clean” no projeto e no seu servidor de aplicação. Pode ser que tenha alguma sujeira atrapalhando tb, que é bastante comum…
chefe, blz?
valeu pela ajuda mas esse post tem um ano.
Dê uma lida no guia do GUJ que diz para não postar em posts velhos. [=
Até. [=
Emerzoom
Ops!!! Wrong way!!
Mas fica a info se alguem quiser tentar. Nem me atentei a data, mas, blz.