Como fazer <rich:panelMenuItem> executar metodo do MBean e reRenderizar um <a4j:outputpanel:>

13 respostas
Malkav.Felipe

Bom pessoal… to apanhando muuuuuito desse negocio de reRender. Tentei varias formas de tentar reRenderizar apenas uma parte da página. Principalmente agora que to tentando usar o rich:panelMenu… To completamente confuso e perdido.

Gostaria da ajuda de vocês. Qualquer coisa é bem vinda.

:arrow: 1º - A minha maior dúvida no momento é fazer um rich:panelMenuItem executar um método do meu managedBean… Pra testar fiz meu método retornar uma String com a regra de navegação definida lá no faces-config e então quando clico no rich:panelMenuItem não acontece nada… não muda de página. É como se o método não fosse executado.

:arrow: 2º - O teste acima foi apenas um…teste 8) , pois minha real intenção é fazer com que ao clicar em um rich:panelMenuItem seja executada uma ação, mas que eu pode-se dar um reRender apenas em um a4j:outputpanel: que tenho na página… mas acontece o mesmo problema acima… ao clicar no rich:panelMenuItem não acontece nada…

Gostaria de saber o que necessariamente deve ser definido em cada uma das tags (rich:panelMenuItem e a4j:outputpanel:) para que eu possa dar um reRender no a4j:outputpanel:… que tipo de parametros devo colocar em cada um dos componentes…

Não sei se fui claro. Mas espero anciosamente qualquer tipo de ajuda…

Abraços.

13 Respostas

Malkav.Felipe

Vou tentar exemplificar o que eu não to conseguindo fazer:

Tenho o seguinte partes na página:

<rich:panelMenu expandSingle="true" mode="Ajax">
            <rich:panelMenuItem label="Teste" action="#{meuBean.testar}" reRender="meuPainel"/>
<rich:panelMenu expandSingle="true" mode="Ajax">


<a4j:outputPanel ajaxRendered="true" id="meuPainel">
            <h:outputText value="#{meuBean.valorTeste} />
</a4j:outputPanel>

Um exemplo de bean:
MeuBean.java

public class MeuBean{
      private int valorTeste;
      
      public void testar(){
             testar++;
      }

      //get e set
}

O que que ta faltando pra que meu outputpanel atualiza-se ao cliar no panelmenuitem??? Por que ao clicar no panelmenuitem não acontece nada!

VAleu pessoal!!

rponte

Talvez esteja faltando o componente de form.

MarceloNeo

Por que as pessoas não voltam ao seus tópios e respondem como resolveram o problema!

O possivel problema que esta acontecendo é as regras de navegação não estão mapeada corretamente!
O uso das tags estão incorretas!

Tenho um problema semelhate, resolvido todo o mapeamento

Tenho 3 arquivos step1.xhtml, step2.xhtml, step3.xhtml

Tenho um arquivo: layout.xhtml. onde tenho meus menus… e em uma certa tag…
quero que reiderize estes arquivos!

menus mapeados no arquivo faces-config.xml
estão todos funcionado, porque reiderizam os arquivos isolandos corretamente.

Uso a versão do richFaces 3.3.3

Dicas são bem vindas!

felipe.sodre

Estou com uma duvida parecida a dias, talvez vcs possam me ajudar:

Seguinte quero que ao selecionar um item do tree atualize um panel que esta do lado, porem ele da erro ao renderizar o a4j:include

segue o codigo:

<%@taglib uri="http://richfaces.org/rich" prefix="rich1"%><%@taglib
	uri="http://richfaces.org/a4j" prefix="a4j"%><%@ page language="java"
	contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib uri="http://richfaces.ajax4jsf.org/rich" prefix="rich"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<f:view>
	<h:form>
		<table style="width: 100%" id="tableMenu">
			<tr align="left" style="width: 100%">
				<td width="180px" align="left" valign="top">
				<rich:panel header="Menu Principal" style="width: 180px">
					<rich:tree nodeSelectListener="#{treeBean.processSelection}"
						reRender="includeTest" ajaxSubmitSelection="true" switchType="client"
						value="#{treeBean.treeNode}" var="item" ajaxKeys="#{null}"
						icon="images/logomenu.png" iconLeaf="images/iconLeaf.png"
						rendered="true">
					</rich:tree>
				</rich:panel>
				</td>
				<td align="left" valign="top" id="columnPages">
				<rich:panel header="TESTE"
					style="width:100%" id="pnlPages" rendered="true">
					<a4j:include viewId="#{treeBean.page}" id="includeTest" />
				</rich:panel>
				</td>
			</tr>
		</table>
	</h:form>
</f:view>
</body>
</html>

Bean:

package br.com.sigga.test.tree;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.TreeSet;

import org.richfaces.component.html.HtmlTree;
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.TreeNode;
import org.richfaces.model.TreeNodeImpl;

import br.com.sigga.util.PropertiesLoader;

@SuppressWarnings("unchecked")
public class TreeBean {

	private TreeNode rootNode = null;
	private List<String> selectedNodeChildren = new ArrayList<String>();
	private static String PROPERTIES_NAME = "/resources/tree.properties";
	private String page = "barraFiltro.jsp";
	private ArrayList<String> idAllowedApp;
	private Properties properties;

	public TreeBean() {
		properties = new PropertiesLoader(PROPERTIES_NAME).getProps();
		if (idAllowedApp == null)
			idAllowedApp = getKeyAppAllowed();
	}

	public String getPage() {
		return page;
	}

	public void setPage(String page) {
		this.page = page;
	}

	private String nodeTitle;

	private void addNodes(String path, TreeNode node, Properties properties) {
		boolean end = false;
		int counter = 1;

		while (!end) {
			String key = path != null ? path + '.' + counter : String
					.valueOf(counter);

			String value = properties.getProperty(key);
			if (value != null) {
				TreeNodeImpl nodeImpl = new TreeNodeImpl();
				nodeImpl.setData(value);
				if (idAllowedApp.contains(key))
					node.addChild(new Integer(counter), nodeImpl);
				addNodes(key, nodeImpl, properties);
				counter++;
			} else {
				end = true;
			}
		}
	}

	private ArrayList<String> getKeyAppAllowed() {
		ArrayList<String> apps = new ArrayList<String>();
		apps.add("Admin".toUpperCase());
		//apps.add("Tratamento".toUpperCase());

		ArrayList<String> result = new ArrayList<String>();
		Enumeration e = properties.propertyNames();
		e = Collections.enumeration(new TreeSet(Collections.list(e)));

		String value = null;
		int cont = 0;

		while (e.hasMoreElements()) {
			value = (String) e.nextElement();
			int aux = Integer.parseInt("" + value.charAt(0));
			if(aux - 1 > cont){
				cont = aux;
			}
			
			if (apps.contains(properties.getProperty(value).toUpperCase())){
				result.add(value);
			}
			else {
				String s = result.get(result.size() -1);
				s = Character.toString(s.charAt(0));
				if (value.startsWith(s)) {
					result.add(value);
				} 
			}
		}

		return result;
	}

	public void processSelection(NodeSelectedEvent event) {
		HtmlTree tree = (HtmlTree) event.getComponent();
		nodeTitle = (String) tree.getRowData();
		selectedNodeChildren.clear();
		TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
		if (currentNode.isLeaf()) {
			selectedNodeChildren.add((String) currentNode.getData());
		} else {
			Iterator<Map.Entry<Object, TreeNode>> it = currentNode
					.getChildren();
			while (it != null && it.hasNext()) {
				Map.Entry<Object, TreeNode> entry = it.next();
				selectedNodeChildren.add(entry.getValue().getData().toString());
			}
		}		
		setPage("login.jsp");
	}
	
	public String test(){
		setPage("controles.jsp");
		return page;
	}

	public TreeNode getTreeNode() {
		if (rootNode == null) {
			rootNode = new TreeNodeImpl();
			addNodes(null, rootNode, properties);

		}

		return rootNode;
	}

	public String getNodeTitle() {
		return nodeTitle;
	}

	public void setNodeTitle(String nodeTitle) {
		this.nodeTitle = nodeTitle;
	}
}

Pirmeira parte do erro (é grande demais a pilha):

javax.servlet.ServletException: Servlet execution threw an exception
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)


root cause 

java.lang.StackOverflowError
	java.util.HashMap$KeySet.size(HashMap.java:870)
	java.util.AbstractCollection.toArray(AbstractCollection.java:168)
	java.util.ArrayList.<init>(ArrayList.java:136)
	javax.faces.component.UIComponentBase$FacetsMap.keySetIterator(UIComponentBase.java:2204)
	javax.faces.component.UIComponentBase$FacetsMapValuesIterator.<init>(UIComponentBase.java:2559)
	javax.faces.component.UIComponentBase$FacetsMapValues.iterator(UIComponentBase.java:2543)
	javax.faces.component.UIComponentBase$FacetsAndChildrenIterator.update(UIComponentBase.java:2102)
	javax.faces.component.UIComponentBase$FacetsAndChildrenIterator.hasNext(UIComponentBase.java:2120)
	javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:719)
	javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
	javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
	javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
	javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
	javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
	javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
	javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
	org.ajax4jsf.component.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:551)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:277)
	org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:258)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:279)
MarceloNeo

O que consigo ver que esta ocorrendo no segundo erro
e um estouro de memória.

Tente limitar o numero de objetos em sua arvore, para fazer um teste e ver se resolve!

Limite os objetos do Hash!

felipe.sodre

Por favor ninguem?

o arquivo properties que ele le pra montar o tree
1=Admin
1.1=Robinson Crusoe
1.2=Start In Life
1.3=Slavery And Escape
2=Config
2.1=Plays
2.2=Politian
2.3=Short storiesal Ballad
3=Tratamento
3.1=The Song of Hiawatha
3.2=Introduction
3.3=I. The Peace-Pipe
3.4=II. The Four Winds

felipe.sodre

Marcelo obrigado

fiz o mesmo teste assim:

<f:view>
<a4j:form id="testFrm">
	<a4j:outputPanel ajaxRendered="true" id="panel" title="TESTE">
	<f:subview id="tst">
		<a4j:include viewId="#{treeBean.page}" id="centro" ajaxRendered="true" rendered="true"/>
	</f:subview>	
		<a4j:commandLink value="click" action="#{treeBean.test}" id="btn"/>
	</a4j:outputPanel>
</a4j:form>
</f:view>
</body>
</html>
package br.com.sigga.test.tree;

import javax.faces.event.ActionEvent;

public class TestPage {

	private String page;
	
	public TestPage() {
		if(page == null)
			page = "menuPrincipal.jsp";
	}
	public String test(){
		page = "barraFiltro.jsp";
		return "Sucess";
	}
	
	public void action(ActionEvent e){
		page = "barraFiltro.jsp";
		System.out.print(e.getComponent().toString());
	}

	public String getPage() {		
		return page;
	}

	public void setPage(String page) {
		this.page = page;
	}
}

e da o mesmo erro, pra mim eh o a4j:include

naum consegue renderizar.

naum sei por que…

tirando ele funciona tudo

felipe.sodre

Ops fazendo os testes aki apaguei o rerender do ultimo exemplo:

<a4j:commandLink value="click" action="#{treeBean.test}" id="btn" reRender="testFrm"/>

mas o erro eh o mesmo

MarceloNeo

Opa Felipe

<a4j:include viewId="#{treeBean.page}" id="centro" ajaxRendered="true" rendered="true"/>

<a4j:include viewId="/step1.xhtml"/>

Coloca o caminho real desse arquivo xhtml, que você tem, por que eu tenho aqui da forma que coloquei e funciona.

parece que falta a barra!

felipe.sodre

Uma duvida marcelo todas paginas estao no mesmo diretorio so colocando / resolve e outra vejo todo mundo importar XHTML tem diferenca?

obrigado

felipe.sodre

Colocando a barra deu o mesmo erro

MarceloNeo

Você precisa enteder a sua aplicação, se usa JSP, deve importar JSP.

se usa outro formato, deve importar tal formato!

Existe diferenca sim! só na sintaxe, mas o resultado deve ser o mesmo!

Sugestão! só importa o arquivo sem nada, com Html simples. ve se da erros!
Depois vai para a próxima etapa!

Seu arquivo web.xml tem que saber tratar arquivos JSP!
Veja no forum tem varias post neste sentido!

Também veja. Se o componte suporta importar outros formatos de arquivo!

felipe.sodre

Estou com um warning na aplicação:

log4j:WARN No appenders could be found for logger (org.ajax4jsf.renderkit.ChameleonRenderKitFactory).
log4j:WARN Please initialize the log4j system properly.

Acho que o erro eh causado por este problema alguem sabe o que eh isso?

Ah to rodando no tomcat 6 e minhas libs são:

commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-collections-3.2.jar
commons-digester-1.8.jar
commons-discovery-0.4.jar
commons-logging-1.0.4.jar
ejb3-persistence.jar
hibernate3.jar
hibernate-annotations.jar
hibernate-cglib-repack-2.1_3.jar
hibernate-commons-annotations.jar
javax.servlet-5.1.11.jar
jhighlight-1.0.jar
jsf-api.jar
jsf-facelets-1.1.15.B1.jar
jsf-impl.jar
jstl.jar
junit-3.8.1.jar
log4j.jar
myfaces-api-1.2.8.jar
nekohtml-1.9.6.jar
richfaces-api-3.3.3.CR1.jar
richfaces-impl-3.3.3.CR1.jar
richfaces-ui-3.3.3.CR1.jar
servlet-api.jar
standard.jar
stringtemplate-3.0.jar
themes-3.3.3.CR1.jar
violetRays-3.3.3.CR1.jar
xercesImpl-2.9.1.jar
xml-apis-1.0.b2.jar
xpp3_min-1.1.3.4.O.jar
xstream-1.1.3.jar

Obrigado marcelo e desculpe o incomodo.

Criado 5 de julho de 2009
Ultima resposta 30 de abr. de 2010
Respostas 13
Participantes 4