Passar parametros pra um popup em JSF

Qual a melhor maneira de passar parametros pra um popup em JSF?

eu pensei em pegar o request usando FacesContext.getCurrentContext().getExternalContext().getRequest()
e pegar os parametros, mas não sei se é a melhor forma

como vocês fazem?

bom dia…

eu estou com um problema parecido…

na verdade eu tenho uma pagina em jsf e apartir dela eu abro um popup(outra janela)…nessa janela eu tenho uma pesquisa…depois que o usuario faz a pesquiva e escolhe alguma coisa…eu precisava que os dados escolhidos no popup preencha a primeira tela…alem de fechar o popup…

qual a melhor maneira de se fazer isso???

o grande be…acho que se responderem a sua pergunta…vao responder a minha tbm…

espero que alguem me ajude…

muito obrigado…

dps de 1 seculo…
up :smiley:
to precisando dessa info tb.
abraço.

Olá pessoal.

Lá vamos nós:

O faces recomenda o uso do POST sempre, no entanto, em determinados casos não queremos usar POST, mas GET…Como o caso de abrir Popups.
Vou colocar algumas soluções para trabalhar com parâmetros.

  1. com DataTable:
    Se você tem um datatable, iterando uma lista, em certo momento você gostaria, por exemplo, de excluir algum item da lista. Mas como saber qual objeto foi selecionado?
    Usando:
// no JSP
<h:dataTable var="idObjeto" ..../>
...
</h:dataTable>
// No managed Bean
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("idObjeto");
  1. Passar um parâmetro adicional ao meu managed bean, já que não posso passar parâmetros como argumentos de actions:
// no JSP
<h:commandButton action="#{mbean.exclui}">
<f:param id="codigo" value="#{idObjeto.codigo}"/>
</h:commandButton>
// No managed Bean
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("codigo");
  1. Usar parâmetros via Popup:

a) criar um Servlet com mapeamento (supondo que chamamos via URL localhost:8080/projeto/servletTest?registro=121212);

b) Na servlet, retornar o valor passado via URL:

String registro = (String) request.getParameter("registro");
c) Através do objeto registro, definir o objeto em seu managedBean, carregando usando o valueResolver:

        MeuManagedBean mbean = (MeuManagedBean) this.facesContext.getApplication().getVariableResolver().resolveVariable(this.facesContext, "meuManagedBean");
        mbean.setRegistro(registro);[/code]
d) Definido o novo objeto no managed Bean, agora é necessário redirecionar a verdadeira página JSF:
[code]response.sendRedirect(request.getContextPath() + "/projeto/minhapagina.jsf");[/code]

O código completo da servlet seria algo como:

[code]    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String registro = (String) request.getParameter("registro");
        if (registro == null) {
            throw new NullPointerException("Registro nao pode ser nulo. Eh necessario para a busca de autorizacao de fornecimento item");
        MeuManagedBean mbean = (MeuManagedBean) this.facesContext.getApplication().getVariableResolver().resolveVariable(this.facesContext, "meuManagedBean");
        mbean.setRegistro(registro);
        // Carrega a pagina.
        response.sendRedirect(request.getContextPath() + "/projeto/minhapagina.jsf");
    }

É necessário, no entanto, recuperar o facesContext dentro da servlet. Poderia fazer uma Servlet que retornasse o facesContext e sua servlet estenderia ela.
Está pagina explica como fazer:
http://marcchung.com/2005/01/24/performing-a-jsf-get-2/

  1. Usando o managed-property para passagem de parâmetro:
    Desta forma, quando você chamar sua página JSF, dentro da action basta recuperar o valor usando a técnica 2.

<managed-bean> .................. <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>id</property-name> <value>#{param.id}</value> </managed-property> </managed-bean>

FIM:

Notem, estas são diversas técnicas. Para cada situação você deve usar aquela que satisfaça suas condições. Preferencialmente, eu prefiro servlet ou até mesmo servletFilter, pois você pode abstrair o código para pegar os parâmetros GET e fazer injetar no seu managedBean, via reflection. Desta forma, seu managed Bean seria populado sem você se preocupar. Esta solução é mais parecida com a numero 4, mas tem cuidados extras.

Att.

Poxa, estou tentando passar parâmetros através de um botão e não estou conseguindo. Consigo passar por um commandLInk normal, mas por um botão de ação não. Podem me ajudar?

Meu jsp:

		<h:commandButton action="#{buscaTitulosPorGenero.buscar}" image="/LocadoraWeb/images/menu/g-acao.gif">
			<f:param name="idGenero" value="1"/>
		</h:commandButton>


		<h:commandLink action="#{buscaTitulosPorGenero.buscar}" value="LINK">
			<f:param name="idGenero" value="1"/>
		</h:commandLink>

Meu backing bean imprime as saídas:

		System.out.println("1 >> " + myRequest.getParameter("idGenero"));
		System.out.println("2 >> " + myRequest.getAttribute("idGenero"));
		System.out.println("3 >> " + myRequest.getSession().getAttribute("idGenero"));
		System.out.println("4 >> " + facesContext.getExternalContext().getRequestParameterMap().get("idGenero"));

Vejam o que acontece quando eu aperto o command Link:

15:09:16,371 INFO  [STDOUT] 1 >> 1
15:09:16,371 INFO  [STDOUT] 2 >> null
15:09:16,371 INFO  [STDOUT] 3 >> null
15:09:16,372 INFO  [STDOUT] 4 >> 1

Agora vejam o que acontece quando eu aperto o botão:

15:10:23,145 INFO  [STDOUT] 1 >> 
15:10:23,145 INFO  [STDOUT] 2 >> null
15:10:23,146 INFO  [STDOUT] 3 >> null
15:10:23,146 INFO  [STDOUT] 4 >> 

Enfim. Quando o evento eh pelo botão, não estou conseguindo recuperar os parâmetros que passei. Alguém sabe porque?
Obrigado!

É sempre importante entender a comunicação em JSF,

Espero que ajude, abraços!

[quote]É sempre importante entender a comunicação em JSF,

Espero que ajude, abraços![/quote]

Esse link é muito bom. Esclarece muita coisa.

Obrigado Rafael Pontes.