H:commandButton não navega entre as páginas

8 respostas
M

Olá pessoal,

Estou desenvolvendo um projeto novo em JSF e sou novato na tecnologia.
Estou desenvolvendo em JSF 2.1.4 com Primefaces 3.4 + Spring Security.

Tenho uma listagem de usuários bem simples abaixo:

<!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: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"
>
<h:head>
	<title>Sistema XXX</title>
	<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon" />
	<link href="#{request.contextPath}/css/login.css" rel="stylesheet" type="text/css" />
	<link href="#{request.contextPath}/css/Default.css" rel="stylesheet" type="text/css" />
</h:head>
<h:body>
	<ui:composition template="MainTemplate.xhtml">
		<ui:define name="conteudo">
			<h2>Usuários</h2>
			<h:form id="lstUsuarios" style="overflow:none;">
			<p:dataTable id="dgListadoUsuarios" scrollHeight="300" var="item" bgcolor="#FFFFFF" border="1" cellpadding="5" cellspacing="3" first="0" width="100%" rows="10"
				frame="box" rules="all" selection="#{flash.usuarioSelecionado}" selectionMode="single" value="#{listagemUsuariosBean.usuarioDataModel}" paginator="true" rowKey="#{item.id}"
			>
				<p:column width="150">
					<f:facet name="header">
						<div align="left">
							<h:outputText value="Usuário" />
						</div>
					</f:facet>
					<h:outputText value="#{item.id}"></h:outputText>
				</p:column>
				<p:column style="width: 100%;">
					<f:facet name="header">
						<div align="left">
							<h:outputText value="Nome Completo" />
						</div>
					</f:facet>
					<h:outputText value="#{item.nomeCompleto}"></h:outputText>
				</p:column>
				<p:column>
					<f:facet name="header">
						<h:outputText value="Ativo" />
					</f:facet>
					<center>
						<h:selectBooleanCheckbox disabled="true" style="" value="#{item.enable}"></h:selectBooleanCheckbox>
					</center>
				</p:column>
				<f:facet name="footer">
				</f:facet>
			</p:dataTable>
			<table width="100%" style="margin-top: 10px;">
				<tr>
					<td>
						<h:commandButton style="width:75px;" value="Incluir" action="#{listagemUsuariosBean.editarUsuario()}" styleClass="btn" />
					</td>				
					<td>
						<h:commandButton style="width:75px;" immediate="true" value="Alterar" action="#{listagemUsuariosBean.editarUsuario()}" styleClass="btn" />						
					</td>
					<td>
						<h:commandButton style="width:75px;" value="Excluir" styleClass="btn" />
					</td>
					<td width="100%">
					</td>				
				</tr>
			</table>
			</h:form>
		</ui:define>
	</ui:composition>
</h:body>
</html>

O managed Bean listagemUsuariosBean está aqui:

package br.com.alltrade.ebuy.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import br.com.alltrade.ebuy.datamodel.UsuarioDataModel;
import br.com.alltrade.ebuy.dataservice.UsuarioDataService;
import br.com.alltrade.ebuy.entity.EUsuario;

import com.sun.faces.context.flash.ELFlash;

@ManagedBean(name="listagemUsuariosBean")
@RequestScoped
public class ListagemUsuariosBean {

	private EUsuario usuarioSelecionado;
	
	public EUsuario getUsuarioSelecionado() {
		return usuarioSelecionado;
	}

	public void setUsuarioSelecionado(EUsuario usuarioSelecionado) {
		this.usuarioSelecionado = usuarioSelecionado;
	}

	public UsuarioDataModel getUsuarioDataModel() {
		UsuarioDataService oUsuarioDataService = new UsuarioDataService();
		UsuarioDataModel dataModel = new UsuarioDataModel(oUsuarioDataService.search(EUsuario.class));
		return dataModel;
	}
	
	public String editarUsuario(){
		ELFlash.getFlash().put("usuarioSelecionado", usuarioSelecionado);
		return "EdicaoUsuario";
	}
	
	public String incluirUsuario(){
		return "EdicaoUsuario";
	}
	
}

No meu faces-config, já configurei de diversas formas.
Assim:

<navigation-rule>
 	<from-view-id>/ListagemUsuarios.xhtml</from-view-id>
 	<navigation-case>
 		<from-action>#{listagemUsuariosBean.editarUsuario()}</from-action>
 		<to-view-id>/EdicaoUsuario.xhtml</to-view-id> 		
 	</navigation-case>
 </navigation-rule>

e também já tentei assim:

<navigation-rule>
 	<from-view-id>/ListagemUsuarios.xhtml</from-view-id>
 	<navigation-case>
 		<from-outcome>EdicaoUsuario</from-outcome>
 		<to-view-id>/EdicaoUsuario.xhtml</to-view-id> 		
 	</navigation-case>
 </navigation-rule>

Mas nenhum dos meus h:CommandButton’s executa nenhuma ação/navegação!

Já levantei problemas parecidos na web, dentro deles:

-Os botôes devem estar dentro de um form: OK, eles estão.
-A navegação deve estar definida no faces-config: OK, ela está.

Parece que está faltando compreender algum conceito ou algum detalhe.
O estranho é que o grid do primefaces mapeado acima dos botões funciona normalmente.

Alguma idéia?
Agradeço qualquer atenção.

8 Respostas

felipef

Cara

Não sei se pode ser isso

mas em

action="#{listagemUsuariosBean.editarUsuario()}

tenta trocar por

action="#{listagemUsuariosBean.editarUsuario}

e as regras de navegacao

<navigation-case> <from-outcome>EdicaoUsuario</from-outcome> <to-view-id>/EdicaoUsuario.xhtml</to-view-id> <redirect/> </navigation-case>

eu uso assim

J

Não analisei seu código mas vou tentar te dar uma noção do funcionamento do JSF. Quando você realiza um action, neste caso voce está fazendo pelo commandButton, o JSF faz uma validação da sua tela inteira e caso possua algum problema ele aborta a requisição. Essa validação incluí todos os componentes da tela, tanto que se voce colocar no botão a propriedade immediate=“true” ele vai funcionar. Porém isso nao soluciona o problema, pois com isso voce está apenas informando ao compilador para pular essa validação, porém os valores das propriedades não são persistidos no Bean, ou seja, não é populado o Bean. Tente criar algumas telas simples e ir adicionando os componentes por etapas e verificar o funcionamento que voce irá descobrir em qual componente está o problema. Espero ter ajudado :smiley:

yhhik

só olhei sua navegation-rule…

ta falatando o:

<redirect/>
M

felipef:
Cara

Não sei se pode ser isso

mas em

action="#{listagemUsuariosBean.editarUsuario()}

tenta trocar por

action="#{listagemUsuariosBean.editarUsuario}

e as regras de navegacao

<navigation-case> <from-outcome>EdicaoUsuario</from-outcome> <to-view-id>/EdicaoUsuario.xhtml</to-view-id> <redirect/> </navigation-case>

eu uso assim

Obrigado pela resposta, mas realizei várias combinações dentre elas essas que tu apontaste mas não obtive sucesso.

M

[quote=yhhik]só olhei sua navegation-rule…

ta falatando o:

<redirect/>

Obrigado pela contribuição mas infelizmente o problema continua com a alteração.

M

Oi Jonathan,

Obrigado pela ajuda e atenção.
Acredito que estejas me apontando na direção correta.
Existe alguma forma de acompanhar a validação dos componentes JSF via debug?
Algum PhaseListener customizado talvez?

J

Oi marcelo,

Isso eu não sei dizer. Terei que pesquisar e se encontrar algo parecido entro em contato. Acredito que a melhor maneira é verficiar qual componente pode estar te causando problemas...
M

Descobri que meu problema está com o meu template.

As páginas que são incluídas com ui:include funcionam perfeitamente.
Porém as páginas que são incluídas com ui:insert não funcionam…

Alguém tem alguma idéia porque?

Criado 18 de setembro de 2012
Ultima resposta 24 de set. de 2012
Respostas 8
Participantes 4