Trabalhando com f:param programaticamente (JSF)

4 respostas
V

Fala galera!

Tipo, se eu quero montar uma lista de itens a partir de um backing bean, basta eu fazer:

UISelectOne box = new UISelectOne();
UISelectItem item = new UISelectItem();
item.setItemLabel(nomesPaises.get(n));
item.setItemValue(nomesPaises.get(n));
box.getChildren().add(item);

Agora, e se eu quiser colocar um f:param em um UICommand (que vai guardar um HtmlCommandButton)? Como eu faço? E como faço para usar o valor depois?

4 Respostas

V

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:

  1. 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>
  1. 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>
  1. 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;
	}
	
	
	
}
  1. 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)
V

Alguém?

V

Vixi, mas ninguém saca disso aqui não?!

Eu já procurei em um monte de lugar mas num acho nada definitivo sobre essa porcaria de erro:

java.lang.UnsupportedOperationException at java.util.AbstractMap.put(Unknown Source)
V

Olá Valdemar,

Pelo que sei, cada página é um request diferente, assim como os parãmetros request e post enviados pelo cliente.
Portanto, ao submeter o popup, não existe os parâmetros f:param da página que chamou a nova janela(popup).

Uma solução seria usar Popup feito em javascript, e não chamar uma window.open(…).

Existem várias implementação de componentes de interface que possuem essas popups…o tomahawk deve ter tbem?

no PrimeFaces existe o <p:dialog>

Criado 10 de junho de 2009
Ultima resposta 22 de nov. de 2011
Respostas 4
Participantes 2