Crud JSF 2.0 com @RequestScoped

Olá pessoal,

Alguém sabe de um tutorial que ensine como fazer CRUD em JSF 2.0 com o escope de requisição?

Todos que encontro em revistas e na internet usam o escopo de sessão. E pelo que eu pode perceber em muitos comentários em foruns, não é aconselhável utilizar somente o escopo de sessão.

Agradeço a ajuda.

qual seria o problema em usar o escopo de Request?

você tentou montar alguma coisa ja ?

ou copiar um desses de Session, mudar pra Request e ver o que acontece? hehehe

Cara, o escopo só irá interferir na vida dos objetos … nada mais …

Se você quiser usar com request scope é tranquilo, mas você irá precisa de setar o ID dos objetos o tempo todo e não utilizar nenhum richfaces, primefaces da vida.

O ideal mesmo é utilizar view scope.

OBS.: Nesse post aqui não é com sessão, é com RequestScoped mas sem primefaces. Aplicação Web Completa JSF EJB JPA JAAS

Funciona que uma beleza. [=

[quote=jakefrog]Se você quiser usar com request scope é tranquilo, mas você irá precisa de setar o ID dos objetos o tempo todo e não utilizar nenhum richfaces, primefaces da vida.

O ideal mesmo é utilizar view scope.[/quote]
Amigo não entendi o motivo de não poder utilizar primefaces com RequestScoped. Poderia explicar melhor ?

[quote=hugo.hlcxcx][quote=jakefrog]Se você quiser usar com request scope é tranquilo, mas você irá precisa de setar o ID dos objetos o tempo todo e não utilizar nenhum richfaces, primefaces da vida.

O ideal mesmo é utilizar view scope.[/quote]
Amigo não entendi o motivo de não poder utilizar primefaces com RequestScoped. Poderia explicar melhor ?[/quote]O primefaces dá todos os exemplos utilizando session. Ele precisa das informações do datatable na memória para funcionar, por isso ele funciona também com viewscoped também.

Faça um exemplo em que um h:datatable que funcione com requestscoped e depois troque de h:datatable para p:datatable que você vai ver o resultado, o trem não funciona por nada. [=

Se quiser um modo mais rápido ainda, nesse post: Lazy JSF Datatable Pagination (Primefaces) tem um código pronto para download. Faça o download e execute uma vez com viewscoped. Depois tente trocar para requestscope, você verá erros acontecendo no seu console.

Olá pessoal,

Obrigado por terem respondido. Irei fazer um teste como exemplo do blog do jakefrog.

Tentei fazer fazer uma paginação utilizando beans no scopo de requisição e não funcionou. só funcionou quando utilizei a tag t:saveState, para manter o estado bean.

diante disso, eu gostaria de saber se @viewScoped e mesma coisa que usar o t:saveState.

No caso do t:saveState, o estado do objeto é mantido na memoria do servidor?

Obrigado.

Galera, vou aproveitar para tirar uma dúvida, Sou iniciante no JSF com prime faces…

Tenho uma tabela e gostaria de ter um botao nesta tabela que quando o usuario clicar neste botão ele seta um cliente no meu bean… só isso!

<p:dataTable id=“tbCliente” var=“cli” value="#{ordemServicoBean.listaCliente}" emptyMessage=“Nenhum registro encontrado.” paginator=“true” rows=“10”>
<f:facet name=“header” >
Clientes
</f:facet>
<p:column headerText=“Nome”>
<h:outputText value="#{cli.nome}" />
</p:column>
<p:column style=“width:30px; text-align: center”>
<h:commandLink title=“Selecionar” actionListener="#{ordemServicoBean.selecionaCliente(cli)}" oncomplete=“dlgBuscaCliente.hide()” update=":formPrincipal:campoFiltro">
<p:graphicImage value=“tema/icons/ok.png” />
</h:commandLink>
</p:column>

Se coloco o Bean dessa tela como ViewScoped funciona que é uma beleza! Mas queria trabalhar com @RequestScoped e ai é o problema!
Se o bean ta request parece que eu perco a referencia dos “objetos” da tabela"…
Quando coloco como request ele mata a arvore de componentes que estao na tela? é isso? já li bastante sobre os escopos mas não sei se entendi bem essa nova maneira de pensar!

Não entendi…

Não entendi…[/quote]Tipo aqui: http://uaihebert.com/?p=836&page=9 .

Com h:datatable eu sei que funciona.

Não entendi…[/quote]Tipo aqui: http://uaihebert.com/?p=836&page=9 .

Com h:datatable eu sei que funciona. [/quote]

Certo,mas pq não funcionaria com rich:dataTable?

Não entendi…[/quote]Tipo aqui: http://uaihebert.com/?p=836&page=9 .

Com h:datatable eu sei que funciona. [/quote]

Certo,mas pq não funcionaria com rich:dataTable?[/quote]Com rich não sei te falar. Com primefaces não funcionou de modo normal não. Por algum motive ele não aceita que o scope seja request e não consegue localizar os dados selecionados no datatable.

Eu ouvi alguém falando que a solução era setar o rowIndex do primefaces antes de que ele tente localizar os dados no datatable, mas não testei.

Achei melhor colocar ViewScoped. [=

JakeFrog, dá uma mão aki.
É o seguinte; tenho uma consulta, que funciona da seguinte maneira:
Quando o usuário submeter o valor através de um autocomplete do primefaces, deverá retornar uma pesquisa através de um like.
Gostaria de paginar o resultado, mas estou infrentando um problema. Quero faze-lo com primefaes, então, quando uso o scopo View o autocomplete pára de funcionar e a página não é direcionada. se uso requestScoped, o autocomplete funciona, porém não pagina.
e aí o que eu faço?

meu bean:

package com.portal.web;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import com.portal.empresa.Empresa;
import com.portal.empresa.EmpresaRN;

@ManagedBean
@RequestScoped
public class EmpresaBean {

	private Empresa empresa = new Empresa();
	private EmpresaRN empresaRN = new EmpresaRN();
	private List&lt;Empresa&gt; empresas;
	private List&lt;Empresa&gt; pesquisa;

	private String destinoSalvar;

	// Retorna a página para a inserçao de novos valores
	public String novo() {
		this.destinoSalvar = "empresaSucesso";
		this.empresa = new Empresa();
		return "empresa";
	}

	// Persiste objetos
	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		if (isEmpresaCadastrada(empresa)) {
			FacesMessage facesMessage = new FacesMessage(
					"Digite um nome diferente de empresa, esta já está cadastrada.");
			context.addMessage(null, facesMessage);
			return null;
		}
		empresaRN.salvar(this.empresa);
		return "empresaSucesso";
	}

	// Direciona à pagina editar
	public String editar() {
		return "/admin/empresa";

	}

	// Exclui objetos
	public String excluir() {
		empresaRN.excluir(this.empresa);
		this.empresas = null;
		return null;
	}

	// Autocompleta
	public List&lt;Empresa&gt; autocompleteEmpresa(String query) {
		List&lt;Empresa&gt; queryResults = new ArrayList&lt;Empresa&gt;();
		if (this.empresas == null) {
			this.empresas = empresaRN.complete();
		}
		for (Empresa e : empresas) {
			if (e.getNome().startsWith(query)) {
				queryResults.add(e);
			}
		}
		return queryResults;
	}

	// Lista todos os valores
	public List&lt;Empresa&gt; getLista() {
		if (this.empresas == null) {
			this.empresas = empresaRN.listar();
		}
		return this.empresas;
	}

	// Lista com base nos nomes
	public List&lt;Empresa&gt; buscarPorNome() {
		if (this.empresas == null) {
			String nome = empresa.getNome();
			empresas = empresaRN.buscaPorNome(nome);
		}
		return this.empresas;
	}

	// Verifica se já está cadastrada, caso positivo, valida na view.
	public boolean isEmpresaCadastrada(Empresa empresa) {
		return empresaRN.verificaEmpresa(empresa.getNome());
	}

	// GETERS/SETERSS
	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public EmpresaRN getEmpresaRN() {
		return empresaRN;
	}

	public void setEmpresaRN(EmpresaRN empresaRN) {
		this.empresaRN = empresaRN;
	}

	public List&lt;Empresa&gt; getEmpresas() {
		return empresas;
	}

	public void setEmpresas(List&lt;Empresa&gt; empresas) {
		this.empresas = empresas;
	}

	public String getDestinoSalvar() {
		return destinoSalvar;
	}

	public void setDestinoSalvar(String destinoSalvar) {
		this.destinoSalvar = destinoSalvar;
	}

	public List&lt;Empresa&gt; getPesquisa() {
		return pesquisa;
	}

	public void setPesquisa(List&lt;Empresa&gt; pesquisa) {
		this.pesquisa = pesquisa;
	}

}

página:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui"&gt;
&lt;ui:composition template="/templates/templatePrincipal.xhtml"&gt;
	&lt;ui:define name="corpo"&gt;
		&lt;h:head&gt;
			&lt;title&gt;Luziânia OnLine&lt;/title&gt;
		&lt;/h:head&gt;
		&lt;h:body&gt;
			&lt;f:view&gt;
				&lt;p:growl id="messages" autoUpdate="true" /&gt;
				&lt;h:form&gt;
					&lt;div id="campos"&gt;
						&lt;p:autoComplete id="complete" value="#{empresaBean.empresa}"
							var="empresa" completeMethod="#{empresaBean.autocompleteEmpresa}"
							itemLabel="#{empresa.nome}" itemValue="#{empresa}"
							onkeyup="this.value = this.value.toUpperCase();" maxResults="9"
							size="82" converter="Converter" required="true"
							requiredMessage="Digite um nome para pesquisa."&gt;
						&lt;/p:autoComplete&gt;
					&lt;/div&gt;
					&lt;div id="botaopesq"&gt;
						&lt;h:commandLink actionListener="#{empresaBean.buscarPorNome}"
							title="Pesquisar" value="#{nome}" action="pesquisa"&gt;
							&lt;h:graphicImage library="images" name="botao.png" width="118"
								height="27" style="border:0" /&gt;
							&lt;f:setPropertyActionListener target="#{empresaBean.empresa}"
								value="#{empresa.nome}" /&gt;
						&lt;/h:commandLink&gt;
					&lt;/div&gt;
				&lt;/h:form&gt;
			&lt;/f:view&gt;
		&lt;/h:body&gt;
	&lt;/ui:define&gt;
&lt;/ui:composition&gt;
&lt;/html&gt;

Ressucitando,

Pegando o exemplo do Hebert Aplicação Web Completa JSF EJB JPA JAAS, não sei se alguém já resolveu, mas aí vai!

Exemplo:

&lt;p:dataTable id="tableFuncionario"
				emptyMessage="Nenhum funcionario cadastrado." var="funcionario"
				value="#{funcionarioBean.funcionarios}" rowKey="#{funcionario.id}"
				selection="#{funcionarioBean.funcionario}" selectionMode="single"&gt;

				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Funcionarios" /&gt;
				&lt;/f:facet&gt;

				&lt;p:column headerText="Nome" style="text-align: center; width: 45%"&gt;
					&lt;h:outputText value="#{funcionario.nome}" /&gt;
				&lt;/p:column&gt;

				&lt;p:column headerText="Email" style="text-align: center; width: 45%"&gt;
					&lt;h:outputText value="#{funcionario.email}" /&gt;
				&lt;/p:column&gt;

				&lt;p:column style="text-align: center; width: 10%"&gt;
					&lt;h:inputHidden value="#{funcionario.id}" /&gt;
					&lt;p:commandButton image="ui-icon-pencil" ajax="false"
						action="#{funcionarioBean.editarFuncionario}"&gt;
						&lt;f:setPropertyActionListener value="#{funcionario}"
							target="#{funcionarioBean.funcionario}" /&gt;
					&lt;/p:commandButton&gt;

					&lt;p:commandButton image="ui-icon-trash" ajax="false"
						action="#{funcionarioBean.excluirFuncionario}"&gt;
						&lt;f:setPropertyActionListener value="#{funcionario}"
							target="#{funcionarioBean.funcionario}" /&gt;
					&lt;/p:commandButton&gt;
				&lt;/p:column&gt;
			&lt;/p:dataTable&gt;

action="#{funcionarioBean.editarFuncionario}"> retorna uma String e direciona para a página de edicao.
action="#{funcionarioBean.excluirFuncionario}"> retorna uma String e direciona para a página de exclusao.

O ajax que tava melando tudo! Daí só foi setar o bichin false que funcionou blz.