JSF + Richface - Comportamento estranho

6 respostas
erick.pessoa

Olá pessoal ...

Estou iniciando o uso de richfaces com JSF Facelets rodando no Jboss 5 ... E tenho uma aplicação bem simples, na qual tenho um formulário com alguns campos. Submetido esse formulário uma outra área da mesma Página sobre um reRender.

O que acontece é que na execução da aplicação o Jboss me dá um WARNING:

WARN [component] facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE is set to 'true' but facelets.BUILD_BEFORE_RESTORE is set to 'false' or unset. To use facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE you must also set facelets.BUILD_BEFORE_RESTORE to 'true'!

Sem problema... Identifiquei o que preciso acrescentar no arquivo web.xml, mas quando acrescento essas propriedades. O reRender não funciona mais, tenho que clicar duas vezes sobre o botão ou link para exibir as informações.

Alguém já passou por isso que poderia me ajudar ?

index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!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:c="http://java.sun.com/jstl/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich">
    <head>
        <link href="/resources/css/default.css" rel="stylesheet" type="text/css" />
        <link href="/resources/css/cssLayout.css" rel="stylesheet" type="text/css" />
        <link href="/resources/css/style.css" rel="stylesheet" type="text/css" media="screen" />
        <title>Pesquisa</title>
    </head>
    <body>
        <f:view>
        <ui:composition template="templates/pesquisa.xhtml">
            <ui:define name="top">
                <ui:decorate template="templates/form.xhtml">
                    <a4j:form id="formPesquisa" ajaxSubmit="true">
                        <ui:decorate template="templates/campo.xhtml">
                            <ui:define name="nome"><h:outputText value="Texto:" /></ui:define>
                            <h:inputText styleClass="texto" value="#{indexBean.texto}" size="50"></h:inputText>
                        </ui:decorate>
                        <ui:decorate template="templates/campo.xhtml">
                            <ui:define name="nome"><h:outputText value="Caderno:" /></ui:define>
                            <h:selectOneMenu value="#{indexBean.diario}">
                                <f:selectItem itemValue="TD" itemLabel="Todos" />
                                <f:selectItem itemValue="EX" itemLabel="Automotor" />
                                <f:selectItem itemValue="JU" itemLabel="Hidroviario" />
                            </h:selectOneMenu>
                        </ui:decorate>
                        <ui:decorate template="templates/campo.xhtml">
                            <ui:define name="nome"><h:outputText value="De:" /></ui:define>
                            <a4j:outputPanel id="calendarDe" layout="block">
                                <rich:calendar value="#{indexBean.de}"
                                locale="#{calendarBean.locale}"
                                popup="#{calendarBean.popup}"
                                datePattern="#{calendarBean.pattern}"
                                showApplyButton="#{calendarBean.showApply}" cellWidth="24px" cellHeight="22px" style="width:200px"/>
                            </a4j:outputPanel>
                        </ui:decorate>
                        <ui:decorate template="templates/campo.xhtml">
                            <ui:define name="nome"><h:outputText value="Até:" /></ui:define>
                            <a4j:outputPanel id="calendarAte" layout="block">
                                <rich:calendar value="#{indexBean.ate}"
                                locale="#{calendarBean.locale}"
                                popup="#{calendarBean.popup}"
                                datePattern="#{calendarBean.pattern}"
                                showApplyButton="#{calendarBean.showApply}" cellWidth="24px" cellHeight="22px" style="width:200px"/>
                            </a4j:outputPanel>
                        </ui:decorate>
                        <ui:decorate template="templates/botoes.xhtml">
                            <a4j:commandButton id="btPesquisar" action="#{indexBean.pesquisar}" value="Pesquisar" reRender="painelConteudo" status="indicator" />
                            <a4j:status id="indicator">
                                <f:facet name="start">
                                    <h:graphicImage value="imagens/indicator.gif"/>
                                </f:facet>
                            </a4j:status>
                        </ui:decorate>
                    </a4j:form>
                </ui:decorate>
            </ui:define>
            <ui:define name="content">
                <a4j:outputPanel id="painelConteudo" ajaxRendered="true">
                    <c:if test="#{indexBean.tempoPesquisa != 0}" var="0" >
                    <a4j:form id="Paginacao" ajaxSubmit="true">
                        <c:forEach begin="1" end="#{indexBean.paginador.totalPages}" step="1" var="numPage">
                            <a4j:commandLink action="#{indexBean.paginador.acessaPagina}" value=" #{numPage} ">
                                <a4j:actionparam value="#{numPage}" assignTo="#{indexBean.paginador.pageAtual}" />
                                <a4j:support event="onclick" reRender="painelConteudo" />
                            </a4j:commandLink>
                        </c:forEach>
                        <div class="estatistica_pesquisa">
                            <h:outputText value="Foram localizadas ocorrências de sua pesquisa em " />
                            <h:outputText value="#{indexBean.qtdDocumentos}" />
                            <h:outputText value=" documentos." />
                        </div>
                        <div class="qResultado">
                            <a4j:log name="log" />
                            <a4j:outputPanel id="painelResultado" ajaxRendered="true">
                                <c:if test="#{indexBean.qtdDocumentos != 0}" >
                                    <c:forEach items="#{indexBean.todosResultados}" begin="#{indexBean.paginador.itemInicial}" end="#{indexBean.paginador.itemFinal}" step="1" var="item">
                                        <ui:decorate template="templates/resultado.xhtml">
                                            <ui:define name="titulo"><h:outputLink target="_blank" value="#{item.path}">#{item.titulo}</h:outputLink></ui:define>
                                            <ui:define name="diario">
                                                <h:outputText value="Caderno: "></h:outputText>
                                                <h:outputText value="#{item.diario}"></h:outputText>
                                            </ui:define>
                                            <c:if test="#{item.fragmentos.length != 0}" >
                                                <ui:define name="fragmento">
                                                    <h:outputFormat escape="false" value="#{item.fragmentos}"></h:outputFormat>
                                                    <h:outputText value="..."></h:outputText>
                                                </ui:define>
                                            </c:if>
                                        </ui:decorate>
                                    </c:forEach>
                                </c:if>
                            </a4j:outputPanel>
                        </div>
                    </a4j:form>
                    </c:if>
                </a4j:outputPanel>
            </ui:define>
        </ui:composition>
        </f:view>
    </body>
</html>

6 Respostas

andii.brunetta

qual a versão do JSF?
se for a 2.0, pode deixar o RichFaces para mais pra frente, ainda não está pronto para o JSF 2.0… neste caso use o PrimeFaces 2.x (mais leve, mais fácil de programar)

erick.pessoa

Olá andii.brunetta,

To usando a versão JSF 1.2 … Mas vou dar uma olhada na sua sugestão PrimeFaces … Já perdi um bocado de tempo por causa desse problema.

muito obrigado…

E

Cara duas sugestões :

Ao invés disso

<a4j:commandLink action="#{indexBean.paginador.acessaPagina}" value=" #{numPage} ">  
                                 <a4j:actionparam value="#{numPage}" assignTo="#{indexBean.paginador.pageAtual}" />  
                                 <a4j:support event="onclick" reRender="painelConteudo" />  
                             </a4j:commandLink>

Você pode usar isso : reRender=“painelConteudo” direto no commandLink

<a4j:commandLink action="#{indexBean.paginador.acessaPagina}" value=" #{numPage} "   reRender="painelConteudo"  >  
                                 <a4j:actionparam value="#{numPage}" assignTo="#{indexBean.paginador.pageAtual}" />  
                             </a4j:commandLink>

Outra coisa que geralmente dá problema no JSF 1.* é a questão de misturar tags JSTL com JSF elas não tem um sincronismo legal, até pela questão de serem de ciclo de vidas diferentes, etc e tals:

  • Ao inves do for each use o a4j:repeat
  • Ao inves de c:if use a tag rendered

Olhando assim por cima acredito que o problema não está no RichFaces em si, mas sim na forma como a página está estruturada, e como você esta utilizando o jsf.

Dá uma olhada nos exemplos do richfaces de repente pode te ajudar a entender melhor funcionamento + codigo:

http://livedemo.exadel.com/richfaces-demo/richfaces/dataTableScroller.jsf?c=dataTableScroller&tab=usage

Apresentação legal do Rafael Ponte que tem umas dicas de JSF também:

http://www.slideshare.net/rponte/os-10-maus-hbitos-dos-desenvolvedores-jsf-presentation

erick.pessoa

Valeu Eduardo …

Era esse o problema muito obrigado pelas orientações e dicas …

Problema resolvido.
Valeu…

HarryPodre

Boa tarde!

Estou com um problema parecido.

Tenho uma pagina de login:

<h:form id="form">
				<rich:panel id="painelLogin" rendered="#{!loginBean.esqueceuSenha}">
					<fieldset class="fieldsetLogin">
						<legend>Login</legend> 
						<h:outputLabel for="login" value="Login:" /> 
						<h:inputText id="login" value="" /> 
						<br />
						<h:outputLabel for="senha" value="Senha:" /> 
						<h:inputSecret id="senha" value="" /> 
						<br />
						<div class="botoes">
							<h:commandButton id="bntEntrar" value="Entrar" /> 
							<h:commandButton id="bntLembrar" value="Lembrar" actionListener="#{loginBean.lembrarSenha}" />
						</div>
						<br />
					</fieldset>
				</rich:panel>
				<rich:panel id="painelLembrarSenha" rendered="#{loginBean.esqueceuSenha}">
					<fieldset class="fieldsetLogin">
						<legend>Lembrar senha</legend> 
						<h:outputLabel for="email" value="Informe seu email:" /> 
						<h:inputText id="email" value="" /> 
						<h:commandButton id="bntEnviar" value="Enviar" actionListener="#{loginBean.enviarLembrete}" /> 
						<br />
					</fieldset>
				</rich:panel>
			</h:form>

Por enquanto o que interessa são os botões de “Lembrar Senha” e “Enviar Lembrete”.

Meu Bean:

public class LoginBean
{
	private boolean	esqueceuSenha	= false;
	
	public boolean isEsqueceuSenha()
	{
		return esqueceuSenha;
	}
	
	public void lembrarSenha(ActionEvent event)
	{
		System.out.println("lembrarSenha");
		this.esqueceuSenha = true;
	}
	
	public void enviarLembrete(ActionEvent event)
	{
		System.out.println("enviarLembrete");
		this.esqueceuSenha = false;
	}
}

Quando clico no botão “Lembrar senha” o Bean é acessado normalmente, printa o syso e retorna para a pagina renderizando o campo e botão para enviar o lembrete, porém quando clico no botão “Enviar Lembrete” nada acontece, o botão não faz a chamada ao método enviarLembrete() no bean.

Já passaram por isso?

erick.pessoa

Passando por aqui … para agradecer a andii.bruneta … pela dica Primefaces… show de bola …

Mas to tendo um dificuldade com o primefaces … vou abrir um tópico … para essa nova …

Criado 4 de janeiro de 2011
Ultima resposta 19 de jan. de 2011
Respostas 6
Participantes 4