Fala galera!
Eu vou tentar especificar melhor meu problema para ver se alguém pode me ajudar.
Eu tenho uma tela que, ao clicar no botão, chama uma pop-up. Esta pop-up contém uma página JSF (XHTML) que aponta para um bean chamado Param.java. Este bean deveria conseguir pegar os valores passados por f:param da tela anterior. Mas isso não está funcionando de jeito nenhum. Eu vou postar os códigos aqui para que tenham ideia de como está, mas realmente eu já olhei outros posts do GUJ, já olhei várias outras fontes na internet e não achei nada. Aliás, achei alguns códigos, mas o erro que está acontecendo persiste e eu não faço ideia de como resolver.
Aqui estão os códigos:
- Código da tela que vai gerar o pop-up:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:c="http://java.sun.com/jstl/core">
<ui:composition template="./template2.xhtml">
<h:messages globalOnly="true" />
<ui:define name="menuAtributo">
<ul>
<li>Cadastro de País</li>
</ul>
</ui:define>
<ui:define name="conteudoAtributo">
<div style="overflow:auto; height:300px;">
<!-- Utilizar tabela de dados do JSF para dar aparência para a tela -->
<!-- Coloca SCROLL aqui. -->
<h:form id="formPais">
<h:commandButton id="botao" value="Pop up" onclick="javascript:window.open('http://localhost:8080/EstudoJSF/testeParam.jsf', 'Pagina','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=800,height=400'); return false;">
<f:param id="origem" name="origem" value="Pais" />
<f:param id="destino" name="destino" value="Dedo" />
</h:commandButton>
</h:form>
</div>
</ui:define>
<ui:define name="botoes">
<center>
<h:form>
<h:outputText value="Uepa"/>
</h:form>
</center>
</ui:define>
</ui:composition>
</html>
- Código da tela do pop-up.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:c="http://java.sun.com/jstl/core">
<ui:composition template="./template2.xhtml">
<h:messages globalOnly="true" />
<ui:define name="menuAtributo">
<ul>
<li>Testando funcionamento de f:param</li>
</ul>
</ui:define>
<ui:define name="conteudoAtributo">
<div style="overflow:auto; height:300px;">
<!-- Utilizar tabela de dados do JSF para dar aparência para a tela -->
<!-- Coloca SCROLL aqui. -->
<h:form id="formParam">
<h:commandButton type="submit" id="botaoParam" value="Imprimir dados linha comando" action="#{param.obtem}">
</h:commandButton>
</h:form>
</div>
</ui:define>
<ui:define name="botoes">
<center>
<h:form>
<h:outputText value="Uepa"/>
</h:form>
</center>
</ui:define>
</ui:composition>
</html>
- Código do backing bean do pop-up.
package beans;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.faces.convert.IntegerConverter;
import javax.faces.el.ValueBinding;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
public class Param {
private String valor1;
private String valor2;
private HtmlPanelGrid painel;
public Param()
{
}
public String obtem()
{
/*UIParameter component = (UIParameter) event.getComponent().findComponent("origem");
this.setValor1((String)component.getValue());
component = (UIParameter) event.getComponent().findComponent("destino");
this.setValor2((String)component.getValue());*/
/*FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
Map map = facesContext.getExternalContext().getRequestParameterMap();
String idCodigo = (String) map.get("origem"); */
/*UIOutput out = new UIOutput();
out.setValue("Parametro 1: " + this.getValor1());
painel.getChildren().add(out);
out.setValue("Parametro 2: " + this.getValor2());
painel.getChildren().add(out); */
//System.out.println("Valor 2: " + this.getValor2());
//recuperando valor do parametro
String valCategoria = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("origem");
System.out.println("Valor: " + valCategoria);
return "";
}
public String getValor1() {
return this.valor1;
}
public void setValor1(String valor) {
this.valor1 = valor;
}
public String getValor2() {
return valor2;
}
public void setValor2(String valor) {
this.valor2 = valor;
}
public HtmlPanelGrid getPainel() {
return painel;
}
public void setPainel(HtmlPanelGrid painel) {
this.painel = painel;
}
}
- Alguns códigos que achei como solução na net:
Do GUJ:
public void selConvenioListener(ActionEvent event){
UIParameter component = (UIParameter) event.getComponent().findComponent("codigoParam");
Integer cod = (Integer)component.getValue();
ConvenioAuxilioService cs = new ConvenioAuxilioService();
ConvenioAuxilio ca = (ConvenioAuxilio)cs.selectById(cod);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("ConvenioAuxilio", ca);
}
De um outro:
FacesContext context = FacesContext.getCurrentInstance();
Map map = context.getExternalContext().getRequestParameterMap();
String employeeID = (String) map.get("id");
Outro:
private Map requestParam;
private FacesContext facesContext;
//configura contextos
if(facesContext == null){
facesContext = FacesContext.getCurrentInstance();
}
//instanciando objeto Map
if(requestParam == null){
requestParam = (Map) facesContext.getApplication().createValueBinding("#{param}").getValue(facesContext);
}
//recuperando valor do parametro
String valCategoria = (String)requestParam.get("categoria");
//pagina jsp
<f:param name="categoria" id="categoria" value="A"/>
Uma dúvida: para trabalhar com f:param, eu tenho de cadastrar a propriedade no faces-config? Tipo managed-property? Porque isso eu não fiz.
Os erros que estou enfrentando:
java.lang.UnsupportedOperationException
at java.util.AbstractMap.put(Unknown Source)
at com.sun.faces.el.PropertyResolverImpl.setValue(PropertyResolverImpl.java:158)
at com.sun.facelets.el.LegacyELContext$LegacyELResolver.setValue(LegacyELContext.java:201)
at com.sun.el.parser.AstValue.setValue(Unknown Source)
at com.sun.el.ValueExpressionImpl.setValue(Unknown Source)
at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:93)
at com.sun.facelets.el.LegacyValueBinding.setValue(LegacyValueBinding.java:68)
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:393)
at com.sun.facelets.tag.jsf.ComponentHandler.createComponent(ComponentHandler.java:214)
at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:135)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:164)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.tag.ui.DefineHandler.apply(DefineHandler.java:58)
at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:128)
at com.sun.facelets.impl.DefaultFaceletContext$1.apply(DefaultFaceletContext.java:253)
at com.sun.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:263)
at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:63)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:136)
at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:113)
at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:408)
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:442)
at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:233)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
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:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)