Include Dinâmico com Ajax4JSF, Funciona e Não Funciona

9 respostas
A

Estou fazendo um sistema utilizando a biblioteca RichFaces pois foi a melhor lib ajax que encontrei até agora para jsf. Bom, estou tentando fazer um sistema que tem um layout padrão, mas que so modifica o conteúdo central, ou seja, o cabeçalho e o menu esquerdo ficam inalterados durando a interação do usuario e o sistema. Já fiz este tipo de aplicação utilizando ajax normal sem jsf, mas agora com o RichFaces, estou tentando implementar este tipo de recurso.

Desenvolvi o seguinte layout:

<table cellpadding="0" cellspacing="0" border="0" width="100%">
		<tr>
			<td id="topo" colspan="2">
				<img src="resources/img/logo.png"/>
			</td>
		</tr>
		<tr>
			<td colspan="2" id="toolbar">
				<div class="tool-page"><a href="javascript:void(null);">Janela 1</a></div>
					<div class="tool-page"><a href="javascript:void(null);">Janela 2</a></div>
					<div class="tool-page"><a href="javascript:void(null);">Janela 3</a></div>
					<div class="tool-page_selected"><a href="javascript:void(null);">Janela 4</a></div>
				<div class="tool-page"><a href="javascript:void(null);">Janela 5</a></div>
			</td>
		</tr>
		<tr>
			<td id="menu" valign="top">
				<h:form>
	  				<rich:panelBar height="480px" width="300px" contentStyle="padding:0px">
		  				<rich:panelBarItem label="Sites">
							<rich:tree style="width:200px" value="#{treeNodeCms.data}" var="item" nodeFace="#{item.type}">
								<rich:treeNode type="site" iconLeaf="resources/img/sites.png" icon="resources/img/sites.png">
									<a4j:commandLink value="#{item.name}" reRender="content" eventsQueue="foo2">
										<a4j:actionparam name="link" value="/content_list.xhtml" assignTo="#{linkBean.link}"/>
										<a4j:actionparam name="oidSite" value="#{item.site.oid}" assignTo="#{contentListSite.oidSite}"/>
									</a4j:commandLink>
								</rich:treeNode>
								<rich:treeNode type="page" iconLeaf="resources/img/page.png" icon="resources/img/page.png" reRender="inc">
									<h:outputText value="#{item.name}" />
								</rich:treeNode>
								<rich:treeNode type="directory" iconLeaf="resources/img/folder.gif" icon="resources/img/folder.gif" reRender="content">
									<a4j:commandLink value="#{item.name}" reRender="content">
										<a4j:actionparam name="link" value="/content_list.xhtml" assignTo="#{linkBean.link}"/>
									</a4j:commandLink>
								</rich:treeNode>
							</rich:tree>
						</rich:panelBarItem>
						
						<rich:panelBarItem label="Gerenciador de Arquivos">
						</rich:panelBarItem>
						
						<rich:panelBarItem label="Serviços">
						</rich:panelBarItem>
						
						<rich:panelBarItem label="Configurações">
						</rich:panelBarItem>
					</rich:panelBar>
				</h:form>
			</td>
			<td valign="top" style="padding:5px">
				<h:form>
		    		<a4j:include viewId="#{linkBean.link}" id="content"/>
		    	</h:form>
			</td>
		</tr>
		</table>

O <a4j:include viewId="#{linkBean.link}" id=“content”/> funcionou legal, toda vez que eu clico no link, altero o LinkBean.link, e mando fazer um reRender do include (content), e o include é renderizado corretamente, alterando para uma nova página, só que tem um porem, se a nova página tem um dataTable, com rich:datascroller, ou qualquer coisa parecida, a página incluida não funciona, o datascroller nao faz a paginação, e qualquer recurso ajax que a nova página tenha, não funciona.

Alguém poderia me ajudar? O Include já funciona, mas a página que é incluida não funciona como tem que ser, senão vou ter que colocar um iframe pra poder funcionar, mas aí perde a graça, pois a página incluida não vai poder interagir com a treeview e o menu acima.

A outra página incluída tem um código como esse, mas o rich:datascroller não funciona.

<rich:dataTable id="table" value="#{contentListSite.content}" var="lista" width="100%" rows="4">
		<f:facet name="header">
			<h:outputText value="#{contentListSite.title}" />
		</f:facet>
		<f:facet name="footer">
			<rich:datascroller for="table" maxPages="4">
				<a4j:actionparam name="oidSite" value="#{contentListSite.oidSite}" assignTo="#{contentListSite.oidSite}"/>
			</rich:datascroller>
		</f:facet>
		<rich:column width="2%">
			<f:facet name="header">
				<h:outputText value="" />
			</f:facet>
			<h:graphicImage value="#{lista.icon}"/>
		</rich:column>
		<rich:column headerClass="colunaLeft" sortable="true">
			<f:facet name="header">
				<h:outputText value="Nome" />
			</f:facet>
			<h:outputText value="#{lista.name}" />
		</rich:column>
		<rich:column headerClass="colunaLeft" sortable="true">
			<f:facet name="header">
				<h:outputText value="Tipo" />
			</f:facet>
			<h:outputText value="#{lista.type}" />
		</rich:column>
		<rich:column headerClass="colunaLeft" sortable="true">
			<f:facet name="header">
				<h:outputText value="Data de Modificação" />
			</f:facet>
			<h:outputText value="" />
		</rich:column>
	</rich:dataTable>

9 Respostas

Javabuntu

colega já tive um problema parecido… por acaso a sua página que contem o dataTable… ela está dentro da tag … se tiver é esse o problema… tem que estar num … senão ai não sei o que pode ser ok…

só uma dúvida: vc está usando o netbeans + RichFaces, se tiver poderia dar uma mão aqui neste tópico…
to tentando a 2 semanas fazer funcionar netbeans + RichFaces
http://www.guj.com.br/posts/list/77956.java

p.s. eu tive um problema por precisar usar um include dinâmico… e ai optei por Facelets, será que este não te ajudará?

A

Legal, pensei que ninguem iria me responder, bom, na página que eu to chamando não contém nada, nenhuma , nunca utilizei uma , mas vou dar uma pesquisada, e testar pra ver se funciona.

Também estou utilizando facelets, mas so pra facilitar a criação de componentes, e não para criação de templates, é que com o include dinâmico com ajax, a página, acredito eu, fica mais rápída, pois somente aquela área é atualizada.

Estou utilizando o Eclipse3.3 + JSF 1.2, e tive bastante problemas pra colocar os JAR certos pra poder funcionar, ainda não testei o netbeans, mas vou dar uma olhada no tópico pra ver se posso te ajudar. Ja tem tempo que eu to querendo mexer um pouco com ele, pois nessas ultimas versões ele tem melhorado muito.

Cabazzo

Olha, eu estou fazendo justamente um sistema mais ou menos neste formato que vc está tentando fazer e estou usando Facelets como template, EJB 3.0, Richfaces e jboss 4.2.2, e está funcionado tudo blz.
Eu estou salvando as páginas com a extensão .xhtml, oq melhora o include dinâmico.

Eu criei um Bean em que tem uma propriedade com o path da página em que eu altero no include.
O que faz carregar a página dentro dele, e tudo está fucionando bzl, aparece dataTable, etc…

A

Você poderia dar um exemplo de como você está fazendo? Pois comigo ainda não funcionou direito, estou utilizando facelets, e na página em que incluo tem um rich:datatable com rich:datascroller, a tabela com os dados ele mostra legal, mas na hora de páginar com o scroller, não funciona, e qualquer página que eu inclua dinamicamente, que utiliza ajax, não presta, ele inclui a página estática, mas se ela tiver alguma coisa dinâmica, não tem acordo.

Cabazzo

Ôpa! Desculpe a demora, mas eu estava em Porto de Galinhas passando o Reveillon, rs…

Vê só…
1 - Criei o layout e no topo coloquei ‘um rich:dropDownMenu’ com os ‘rich:menuItem’ com o ‘submitMode=“ajax”’, e no action os métodos de Bean (que no seu acaso é linkBean.link, a diferença é que não passo parâmetotro).
2 - O back Bean que gerencia os links deve ser declarado no escopo do faces-config.xml como “session” (acredito ser aí a causa do seu problema)
3 - No include coloque assim:

<a4j:outputPanel ajaxRendered="true">
            <a4j:include viewId="#{linkBean.link}" />
        </a4j:outputPanel>

Testa aí e qualquer coisa é só perguntar…

A

Funcionou legal, o problema realmente era que o bean que tem o path para a página tinha que está em sessão, mas ainda fiquei com uma dúvida, o bean não tinha que guardar sempre o ultimo path acessado pelo usuário? Eu pensei que o JSF mantinha o estado dos objetos mesmo que o escorpo fosse request.

Cabazzo

No começo também achava isso… Mas ele só guarda quando o escope é “session” ou “aplication”, pelo menos no rich faces funciona assim.

stairway

Estou tentando fazer o include dinâmico, porém não estou entendendo como devo escrever o bean que fará o include na página.

será que algum de vocês poderia postar o código do mesmo?

[]'s

brynner

Pra começar, destrói esse código porque formatação deve ficar em arquivo css especifico.

Criado 24 de dezembro de 2007
Ultima resposta 20 de ago. de 2008
Respostas 9
Participantes 5