Problema com navegação jsf

8 respostas
S

E aí pessoal, estou com um problema que parecia ser simples.
Tenho uma página (INDEX), que tém um autoComplete, do primefaces, juntamente com um botão que submete ou parte ou o valor selecionado do autocomplete para pesquisa, abaixo:
(INDEX):

<div id="campos"> <p:autoComplete id="complete" value="#{empresaBean.empresa}" var="empresa" completeMethod="#{empresaBean.autocompleteEmpresa}" itemLabel="#{empresa.nome}" itemValue="#{empresa}" onkeyup="this.value = this.value.toUpperCase();" maxResults="5" size="82" converter="Converter" effect="slide" required="true" requiredMessage="Digite um nome para pesquisa."> </p:autoComplete> </div> <div id="botaopesq"> <p:commandLink actionListener="#{empresaBean.buscaPorNome}" title="Pesquisar" value="#{nome}" action="pesquisa"> <h:graphicImage library="images" name="botao.png" width="118" height="27" style="border:0" /> <f:setPropertyActionListener target="#{empresaBean.empresa}" value="#{empresa.nome}" /> </p:commandLink>

A action pesquisa, está abaixo, direcionaria para a página pesquisa:

<navigation-case> <from-outcome>pesquisa</from-outcome> <to-view-id>/publico/pesquisa.xhtml</to-view-id> </navigation-case>

(PESQUISA)

<?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">
<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">
<ui:composition template="/templates/templatePesquisa.xhtml">
	<ui:define name="corpo">
		<h:head>
			<title>Luziânia OnLine</title>
		</h:head>
		<h:body>
			<p:growl id="messages" autoUpdate="true" />
			<h:inputHidden value="#{empresaBean.destinoSalvar}" />
			<h:form>
				<div id="campos">
					<p:autoComplete id="complete" value="#{empresaBean.empresa}"
						var="empresa" completeMethod="#{empresaBean.autocompleteEmpresa}"
						itemLabel="#{empresa.nome}" itemValue="#{empresa}"
						onkeyup="this.value = this.value.toUpperCase();" maxResults="5"
						size="60" converter="Converter" required="true"
						requiredMessage="Valor obrigatório." autocomplete="true" />

					<p:commandLink
						actionListener="#{empresaBean.buscarPorNome}"
						update="empresasTable">
						<h:graphicImage library="images" name="botao.png" width="118"
							height="27" style="border:0" />
					</p:commandLink>

				</div>

				<h:outputLabel rendered="#{empty empresaBean.listaPesquisa}"
					value="Refina sua pesquisa." />

				<h:dataTable value="#{empresaBean.listaPesquisa}" var="empresa"
					id="empresasTable" style="width:700px;">
					<h:column>
						#{empresa.nome} - #{empresa.email}
					</h:column>
				</h:dataTable>
				<div class="container">
					<ul >
						<li>&lt;h:graphicImage library="imagensgalerialateral"
								name="1.jpg" /&gt;</li>
					</ul>
				&lt;/div&gt;
			&lt;/h:form&gt;
		&lt;/h:body&gt;
	&lt;/ui:define&gt;
&lt;/ui:composition&gt;
&lt;/html&gt;

Obtenho esse fluxo normalmente até aqui, o problema é que quando tento ir até a segunda página, a impressão que passa é a sessão “morrer” ali, ou seja, o autocomplete não funciona até que tenha uma interação com a página, como submeter um valor no campo e clicar sobre o botão CommandLInk e para fazer com que o botão funcione, preciso clicar duas vezes sobre ele. abaixo posto o ManagedBean.

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 javax.faces.event.ActionEvent;

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; listaPesquisa;
	private List&lt;Empresa&gt; lista;
	private String destinoSalvar;

	public String novo() {
		this.destinoSalvar = "empresaSucesso";
		this.empresa = new Empresa();
		return "empresa";
	}

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

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

	}

	public String excluir() {
		EmpresaRN empresaRN = new EmpresaRN();
		empresaRN.excluir(this.empresa);
		this.lista = null;
		return null;
	}

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

	public List&lt;Empresa&gt; getLista() {
		if (this.lista == null) {
			EmpresaRN empresaRN = new EmpresaRN();
			this.lista = empresaRN.listar();
		}

		return this.lista;
	}

	public List&lt;Empresa&gt; buscarPorNome(ActionEvent event) {
		if (this.listaPesquisa == null) {
			this.listaPesquisa = empresaRN.buscaPorNome(empresa.getNome());
		}

		return this.listaPesquisa;
	}

	public boolean isEmpresaCadastrada(Empresa empresa) {
		return empresaRN.verificaEmpresa(empresa.getNome());
	}

	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; getListaPesquisa() {
		return listaPesquisa;
	}

	public void setListaPesquisa(List&lt;Empresa&gt; listaPesquisa) {
		this.listaPesquisa = listaPesquisa;
	}

	public void setLista(List&lt;Empresa&gt; lista) {
		this.lista = lista;
	}
}

Agradeço desde já os que puderem ajudar.

8 Respostas

alves.Felipe

cara… pelo jeito vc esta usando JSF2 certo?
e pq esta usando isto?

<navigation-case> <from-outcome>pesquisa</from-outcome> <to-view-id>/publico/pesquisa.xhtml</to-view-id> </navigation-case>
ta mas vamos la, qdo vc clica no botao ele tem que enviar para próxima página?
não entendi muito bem, explique o que tem que acontecer depois que clicar no botao.

S

Olá, Felipe, tudo bem?
Bem, acreditava, que já que retornava uma lista, seria a melhor forma de direcionar à página pesquisa.
O que você acha mais interessante sugerir?

S

Felipe, a idéia é que quando possa clicar sobre o botão deve submeter o que houver no campo para um método que traz uma lista a partir da string obtida.
Este método é uma pesquisa tipo Like.

Tenho um objeto do tipo empresa, com nome, telefone, endereço, e-mail, site e descrição.
Ao submeter o nome ou parte dele devo retornar todos os atributos.

este fluxo hoje acontece normalmente, este não é o meu problema, o meu problema é que o mesmo deve acontecer na pagina, e ao chegar até a proxima página o autocomplete não funciona até que eu pesquise algo, e o botão para pesquisa só funciona a partir de um segundo clique.

Porque não funcionaria diretamente, assim que a página é carregada é a minha dúvida e como resolver isso.

S

Obtenho essa excessão quando executo na segunda página na primeira vez que executo, como se a lista que buscasse já estivesse cheia, isto no autocomplete…:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1958) at com.sun.faces.renderkit.ServerSideStateHelper.getState(ServerSideStateHelper.java:266) at com.sun.faces.renderkit.ResponseStateManagerImpl.getState(ResponseStateManagerImpl.java:100) at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:232)

S

Sem resposta?NInguém?

marlon_patrick

smnj,

Passei por esse mesmo problema agora a pouco e não entendi bem porque ele acontece, se é um bug do primefaces ou não…enfim…o que percebi foi o seguinte…isso acontecia quando a página era redirecionada para uma outra página através de uma requisição ajax.

O commandLink do primefaces faz uma requisição ajax por default, pra mudar isso basta você acrescentar o atributo ajax=“false”. Não cheguei a testar, mas, acredito que outra solução é usar o faces-redirect=true, nesse caso, deve funcionar com ou sem requisição ajax.

Espero que você consiga resolver dessa forma. Flw!

S

Muito obrigado, meu caro, resolvi usando um h:commandLink ao invés de P:commandLink.
Sucesso, valew, fica com Deus.

marlon_patrick

Pois é, como h:commandLink não faz uma requisição ajax, então, o problema não acontece. Vlw, abraços!

Criado 6 de julho de 2012
Ultima resposta 1 de ago. de 2012
Respostas 8
Participantes 3