[Resolvido]Primefaces: URL não muda quando sai da página lista de usuários para a do formulário

2 respostas
T

Possuo uma tela, que tem uma p:dataTable e tem botões que vão para edição ou removem o usuário. Existe um link[ ]abaixo da tabela que vai para a página de cadastro.
O link funfa blz, cadastra novo usuário e volta para a tabela. O botão de remover também ta sussa, remove ajax mesmo, uma blz. O problema é o botão de atualizar. Ele carrega o formulário(mesmo formulário de cadastro), preenche com o usuário especificado, tudo blz. Mas na hora de gravar ele atualiza a página, zera o usuário e não executa o método, ficandoo somente o formulário vazio. Como o usuário da sessão foi zerado o botão do formulário vazio agora cadastra e não atualiza(o que é correto). Já percebi que no cadastro funciona pq quando uso o link(em baixo da tabela) ele direciona pra tela com a url: http://localhost:8080/FabricaJSF/cliente/clienteEdit.xhtml. Já com o botão atualizar de cada usuário da tabela ele me direciona para a página de ediçao(exatamente a mesma da de cadastro) mas com a url: http://localhost:8080/FabricaJSF/cliente/clienteList.xhtml, que é a url da tabela, ou seja, pelo botão ele não atualiza a url. Dai quando clico no botão atualizar(de dentro do formulario), ele recarrega a página e ai sim aparece a url correta: http://localhost:8080/FabricaJSF/cliente/clienteEdit.xhtml.

Alguém já passou por isso? Ou isso deve acontecer e eu sou noob?

Segue os codigos:

Primeiro o da clienteList.xhtml
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui"
	xmlns:stella="http://stella.caelum.com.br/faces2">
<h:body>
	<ui:composition template="/resources/template/main.xhtml">

		<ui:define name="divMain">
			<p:panel header="Clientes">
				<p:dataTable id="clienteTable" var="cliente"
					value="#{clienteBean.clientes}" paginator="true" rows="10"
					paginatorPosition="bottom">
					<p:column headerText="Nome">
						<h:outputText value="#{cliente.nome}" />
					</p:column>
					<p:column headerText="Sobrenome">
						<h:outputText value="#{cliente.sobrenome}" />
					</p:column>
					<p:column headerText="Email">
						<h:outputText value="#{cliente.email}" />
					</p:column>/
					<p:column>
						<h:form>
							<p:commandButton value="Visualizar" icon="ui-icon-search">
								<f:setPropertyActionListener target="#{clienteBean.cliente}"
									value="#{cliente}" />
							</p:commandButton>
							<p:spacer width="10px" />
							<p:commandButton value="Editar" icon="ui-icon-pencil"
								action="#{clienteBean.goEdit}">
								<f:setPropertyActionListener target="#{clienteBean.cliente}"
									value="#{cliente}" />
							</p:commandButton>
							<p:spacer width="10px" />
							<p:commandButton value="Excluir" icon="ui-icon-trash"
								update=":clienteTable" action="#{clienteBean.remove}">
								<f:setPropertyActionListener target="#{clienteBean.cliente}"
									value="#{cliente}" />
							</p:commandButton>
						</h:form>
					</p:column>
				</p:dataTable>
				<br />
				<a
					href="${facesContext.externalContext.request.contextPath}/cliente/clienteEdit.xhtml">Cadastre-se</a>
			</p:panel>
			<p:dialog widgetVar="clienteEditDialogWidget"
				id="clienteEditDialogId" modal="true" closable="true"
				draggable="false" resizable="false">
				<ui:include src="/cliente/widget/clienteForm.xhtml" />
			</p:dialog>
		</ui:define>

	</ui:composition>
</h:body>
</html>
ClienteForm.xhtml
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui"
	xmlns:stella="http://stella.caelum.com.br/faces2">
<h:body>

	<p:panel
		header="#{clienteBean.cliente.id == 0?'Cadastro de clientes':'Edição de clientes'}">
		<h:form id="clienteForm" prependId="false">
			<h:panelGrid columns="3">
				<p:outputLabel value="Nome:" />
				<p:inputText id="txtNome" value="#{clienteBean.cliente.nome}">
					<f:validateLength minimum="3" maximum="15" />
				</p:inputText>
				<p:message for="txtNome" />

				<p:outputLabel value="Sobrenome:" />
				<p:inputText id="txtsobrenome"
					value="#{clienteBean.cliente.sobrenome}">
					<f:validateLength minimum="3" maximum="15" />
				</p:inputText>
				<p:message for="txtsobrenome" />

				<p:outputLabel value="Email:" />
				<p:inputText id="txtEmail" value="#{clienteBean.cliente.email}">
					<f:validateLength minimum="3" />
				</p:inputText>
				<p:message for="txtEmail" />

				<p:outputLabel value="CPF:" />
				<p:inputMask id="txtCpf" value="#{clienteBean.cliente.cpf}"
					mask="[CPF removido]">
					<stella:validateCPF formatted="true" />
				</p:inputMask>
				<p:message for="txtCpf" />

				<p:outputLabel value="Telefone Fixo:" />
				<p:inputMask id="txtTel" value="#{clienteBean.cliente.tel}"
					mask="([telefone removido]" />
				<p:message for="txtTel" />

				<p:outputLabel value="Celular Fixo:" />
				<p:inputMask id="txtCel" value="#{clienteBean.cliente.cel}"
					mask="([telefone removido]" />
				<p:message for="txtCel" />
			</h:panelGrid>
			<p:commandButton value="Salvar"
				rendered="#{clienteBean.cliente.id == 0}"
				action="#{clienteBean.salva}" ajax="false" />
			<p:commandButton value="Atualiza"
				rendered="#{clienteBean.cliente.id != 0}"
				action="#{clienteBean.atualiza}" ajax="false" />
		</h:form>
	</p:panel>
</h:body>
</html>
clienteEdit.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="/resources/template/main.xhtml"
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui"
	xmlns:stella="http://stella.caelum.com.br/faces2">

	<ui:define name="divMain">
		<ui:include src="widget/clienteForm.xhtml" />
	</ui:define>
</ui:composition>

ClienteBean.java

@ManagedBean
public class ClienteBean {

	private Cliente cliente;
	private List<Cliente> clientes;

	private MessageUtil message;

	private ClienteController controller;

	@PostConstruct
	public void init() {
		cliente = new Cliente();
		controller = new ClienteController();
		clientes = controller.getAll();
		message = new MessageUtil();
	}

	public Cliente getCliente() {
		if (cliente == null) {
			cliente = new Cliente();
		}
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public String salva() {
		controller.salva(cliente);
		message.sendInfoMessageToUser(cliente.getNome() + " cadastrado!");
		limpaForm();
		return "/cliente/clienteList.xhtml";
	}

	public String atualiza() {
		controller.atualiza(cliente);
		message.sendInfoMessageToUser(cliente.getNome() + " atualizado!");
		limpaForm();
		return "/cliente/clienteList.xhtml";
	}

	public void remove() {
		controller.remove(cliente);
		message.sendInfoMessageToUser(cliente.getNome() + " removido!");
		limpaForm();
	}

	public void limpaForm() {
		cliente = new Cliente();
		clientes = controller.getAll();
	}

	public String goEdit() {
		return "/cliente/clienteEdit.xhtml";
	}
}

2 Respostas

T

Resolvi trocando o escopo do managedBean. Agora ele é Session ao invés do defual que é request.

@ManagedBean
@SessionScoped
public class ClienteBean {

	private Cliente cliente;
	private List<Cliente> clientes;

Acho que deve ser pq o ao chamar o método goEdit() do clienteBean já esta em request, dai carrega os dados do usuário da lista no formulário, e quando chamo outro método no formulário para gravar o usuário ja não está mais no request, pois já acabou o escopo na requisição anterior. Logo o usuário vem em branco. Só não sei pq ele recarrega o formulário ao invés de ir para a lista, já que com o usuário preenchido ele volta à lista.

T

Bom, verificando direito o código, percebi que mudei o ajax do botão de edição da lista para false. Isso resolveu o problema do recarregamento que não tinha sacado na resposta anterior. Por isso não recarrega no final, quando submeto o botão de atualização do formulario.

<p:commandButton value="Editar" icon="ui-icon-pencil" ajax="false" action="#{clienteBean.goEdit}">

Criado 10 de julho de 2013
Ultima resposta 11 de jul. de 2013
Respostas 2
Participantes 1