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!!!