JSF - passagem parâmetro com ViewScope

Tenho uma página (abaixo) que chama um método passando um parâmetro qualquer (no caso valor 4)

<p:dock id="menuDock" >

      <p:menuitem value="Marcação" action="#{marComp.ver}" ajax="false" update="growl" >
            <f:setPropertyActionListener value="4" target="#{marComp.id}" />
      </p:menuitem>

</p:dock>

No método consigo receber o parâmetro em questão. Entretanto quando a página é exibida (abaixo) o valor fica zerado, como se não tivesse sido recebido nada.

//Página a ser exibida
<h:inputText value="#{arComp.id}" />

Percebi algo interessante, a classe marComp tem o scope @ViewScope fiz a alteração para @RequestScope e simplesmente o parâmetro funcionou! Com isso fiquei na dúvida como passo um parâmetro para uma classe anotada com @ViewScope /

Vc já tentou:

<p:menuitem value="Marcação" action="#{marComp.ver(4)}" ajax="false" update="growl"/>

nem compila! tb testei colocado [4] ao invés do (4)! tb não funciona!

Como pode ñ compilar. Trata-se de um arquivo .xhtml. Ñ importa o absurdo q vc coloca nesse arquivo isso ñ impedir q o seu projeto seja compilado com sucesso, embora ele possa ñ rodar p/ causa disso.
Tem certeza q o erro ñ está em outro lugar?

foi na hora de exibir a página!

12/11/2010 13:58:26 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:clinica' did not find a matching property.
12/11/2010 13:58:26 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Java/jre6/bin/client;C:/Java/jre6/bin;C:/Java/jre6/lib/i386;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\Delphi7SE\bin;C:\Program Files (x86)\Delphi7SE\Projects\BPL;C:\Program Files (x86)\Windows Live\Shared;C:\Users\Public\Documents\RAD Studio\7.0\Bpl
12/11/2010 13:58:26 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-80
12/11/2010 13:58:26 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 493 ms
12/11/2010 13:58:26 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
12/11/2010 13:58:26 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20
12/11/2010 13:58:27 com.sun.faces.config.ConfigureListener contextInitialized
INFO: Inicializando Mojarra 2.0.3 (FCS b03) para o contexto '/clinica'
12/11/2010 13:58:28 com.sun.faces.config.ConfigureListener$WebConfigResourceMonitor$Monitor <init>
INFO: Monitoring jndi:/localhost/clinica/WEB-INF/faces-config.xml for modifications
12/11/2010 13:58:30 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-80
12/11/2010 13:58:30 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
12/11/2010 13:58:30 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/31  config=null
12/11/2010 13:58:30 org.apache.catalina.startup.Catalina start
INFO: Server startup in 4018 ms
ERROR 12-11-2010 13:58:35,855 | FilterJSF:doFilter | Erro na Transação.
javax.servlet.ServletException: /pages/template/template.xhtml @25,67 action="#{marComp.ver(4)}" Error Parsing: #{marComp.ver(4)}
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.framework.jsf.FilterJSF.doFilter(FilterJSF.java:49)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.view.facelets.TagAttributeException: /pages/template/template.xhtml @25,67 action="#{marComp.ver(4)}" Error Parsing: #{marComp.ver(4)}
	at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:229)
	at com.sun.faces.facelets.tag.jsf.ActionSourceRule$ActionMapper2.applyMetadata(ActionSourceRule.java:100)
	at com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:77)
	at javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:125)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:96)
	at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.doNewComponentActions(ComponentTagHandlerDelegateImpl.java:345)
	at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:146)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:94)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:131)
	at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:162)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:131)
	at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:162)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:94)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:131)
	at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:162)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:94)
	at com.sun.faces.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:156)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:94)
	at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:89)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:94)
	at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:79)
	at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:304)
	at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:363)
	at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:342)
	at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:196)
	at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:151)
	at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:89)
	at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:79)
	at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:148)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:734)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:96)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
	... 18 more
Caused by: javax.el.ELException: Error Parsing: #{marComp.ver(4)}
	at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:125)
	at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:150)
	at org.apache.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBuilder.java:201)
	at org.apache.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFactoryImpl.java:57)
	at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:219)
	... 55 more
Caused by: org.apache.el.parser.ParseException: Encountered " "(" "( "" at line 1, column 17.
Was expecting one of:
    "}" ...
    "." ...
    "[" ...
    ">" ...
    "gt" ...
    "<" ...
    "lt" ...
    ">=" ...
    "ge" ...
    "<=" ...
    "le" ...
    "==" ...
    "eq" ...
    "!=" ...
    "ne" ...
    "&&" ...
    "and" ...
    "||" ...
    "or" ...
    "*" ...
    "+" ...
    "-" ...
    "/" ...
    "div" ...
    "%" ...
    "mod" ...
    
	at org.apache.el.parser.ELParser.generateParseException(ELParser.java:2142)
	at org.apache.el.parser.ELParser.jj_consume_token(ELParser.java:2024)
	at org.apache.el.parser.ELParser.DeferredExpression(ELParser.java:113)
	at org.apache.el.parser.ELParser.CompositeExpression(ELParser.java:40)
	at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:93)
	... 59 more

Testei o essa forma de passagem de parametro funciona perfeitamente:

<htmL xmlns:h="http://java.sun.com/jsf/html">
<h:body>
  <h:form>
    <h:commandButton value="Test" action="#{Foo.dosth(4)}" />
  </h:form>
</h:body>
</html>
@Named
@RequestScoped
public class Foo {
  public void dosth(int i) { System.out.println("i = " + i); }
}

Usando @RequestScoped funciona completo! chega o parâmetro no método e segue para página!
ja com o @ViewScoped, que é o que estou usando, o parâmetro chega no método, mais não na página!

<?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">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton value="Test" action="#{foo.dosth(4)}" />
        </h:form>
    </h:body>
</html>
package foo;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class Foo implements Serializable {

    public void dosth(int i) {
        System.out.println("i = " + i);
    }

}

Sem nenhum erro p/ mim. Certamente o problema é em outro lugar. Eu estou testando no Glassfish v3. Verifique a seu server e se ñ há nenhuma configuração q possa estar gerando o conflito.

Vou tentar explicar melhor meu problema!

Imagine a situação abaixo!

//Página A
<?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:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
		Pg A
        <h:outputFormat value="I = {0}. I2 = {1}">
			<f:param value="#{foo.i }" />
			<f:param value="#{foo2.i }" />
		</h:outputFormat>
            <h:commandButton value="Test" action="#{foo2.dosth }" >
            	<f:setPropertyActionListener value="7" target="#{foo.i}" />
            	<f:setPropertyActionListener value="7" target="#{foo2.i}" />
            </h:commandButton>
        </h:form>
    </h:body>
</html>
//Página B
<?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:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
		Pg. B
        <h:outputFormat value="I = {0}. I2 = {1}">
			<f:param value="#{foo.i }" />
			<f:param value="#{foo2.i }" />
		</h:outputFormat>
            <h:commandButton value="Test" action="#{foo.dosth }" >
            	<f:setPropertyActionListener value="6" target="#{foo2.i}" />
            	<f:setPropertyActionListener value="6" target="#{foo.i}" />
            </h:commandButton>
        </h:form>
    </h:body>
</html>
//Foo
@ManagedBean
public class Foo implements Serializable {

	private int i = 0; //Get e set

	public String dosth() {
		System.out.println("i = " + i);

		return "/aaa.xhtml";
	}
}
//Foo2
@ManagedBean
public class Foo2 implements Serializable {

	private int i = 0; //Get e set

	public String dosth() {
		System.out.println("i = " + i);

		return "/bbb.xhtml";
	}
}

Se colocar @RequestEscoped os parâmetros são passados através das classes e páginas! Entretanto se for com @ViewEscoped isso não ocorre! Como passo um parâmetro de uma página para outra através do viewScope?

Vc pode fazer isso:

<!-- página A -->
<f:metadata>
  <f:viewParam name="i" value="#{mBeanA.i}" />
  <f:viewParam name="i2" value="#{mBeanA.i2}" />
</f:metadata>
<h:body>
  <h:button value="Vai p/ página B" outcome="/paginaB">
    <f:param name="i" value="#{mBeanA.i}" />
    <f:param name="i2" value="#{mBeanA.i2" />
  </h:button>
</h:body>
// mBeanA
@ManagedBean
@ViewScoped
public class MBeanA implements Serializable {

  private int i;
  private int i2;

  // getters/setters

}
<!-- página B -->
<f:metadata>
  <f:viewParam name="i" value="#{mBeanB.i}" />
  <f:viewParam name="i2" value="#{mBeanB.i2}" />
</f:metadata>
<h:body>
  <h:button value="Vai p/ página A" outcome="/paginaA">
    <f:param name="i" value="#{mBeanB.i}" />
    <f:param name="i2" value="#{mBeanB.i2}" />
  </h:button>
</h:body>
// mBeanB
@ManagedBean
@ViewScoped
public class MBeanB implements Serializable {

  private int i;
  private int i2;

  // getters/setters

}

agora deu certo! Valeu!

So para finalizar! tenho como chamar um método assim que a página for aberta, pq eu pego os parâmetros e os valores são modificados, mais tenho que chamar o método de forma automática para popular o grid!

Kra, os componentes <h:button> e <h:link> executam requisições do tipo GET, tanto q nem necessitam de um form. Infelismente a atual versão do JSF ñ suporta actions em requisições GET, embora vc possa simular isso usando os próprios getters da classe. Esse tipo de solução é deselegante e sugeito a erros. Vejamos se isso te ajuda.

Vc precisa ter cuidado quando estiver usando o @ViewScoped pois vc ainda ñ o compreendeu. O @ViewScoped vincula um ManagedBean à uma view (.xhtml) e esse ManagedBean é removido quando vc navega p/ outra página. Veja isso:

<!-- Essa é a página a.xhtml mas quando executo #{viewBean.action(1)} vou p/ a página b.xhtml -->
<h:form>
  <h:commandButton value="Submit" action="#{viewBean.action(1)}" />
</h:form>

Nesse código a passagem de parametro realmente ñ vai funcionar pois o quando o método action() é chamado o ManagedBean viewBean está vinculado à view a.xhtml mas o método navega p/ a página b.xhtml. b.xhtml é uma outra view e portanto qualquer viewBean referenciado ai será diferente do referenciado na view a.xhtml.

O q eu quero dizer é q vc ñ deve usar ManagedBean @ViewScoped em operações q envolvam navegação. Esse escopo foi consebido p/ dar suporte à operações ajax q acontencem sem vc mudar de página. Quando vc precisar transportar informações de uma página p/ outra a maneira corréta de faze-lo é através de ManagedBean @RequestScoped.

eu to ± entendo a questão do ViewScope!
Mais algumas funcionalidade do primefaces so funciona com esse escopo!
E esta página tb porá vir ser necessário uma passa de parâmetro. Por isso a questão acima!

Com suas dicas resolvi o problema da passagem de parâmetros!

Fiz um javascript para ao finalizar o load da página clicar em um btn que server para atualizar o grid!

No final deu certo!

Olá viniciuspadua

Será se vc poderia postar a solução que vc encontrou?

Estou tendo a mesma dificuldade e talvez o seu javascript me ajude…Obrigado!!!