1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Não consigo capturar os parâmetros na url com <f:viewParam>

Olá pessoal! Estou desenvolvendo um projeto java web e nele preciso enviar um parâmetro que indica o tipo da ação (salvar, editar ou excluir) e outro que aponta para o código do objeto. Sendo mais claro, a página fabricantePesquisa.xhtml é povoada com a lista de fabricantes e com os respectivos comandos para excluir, editar ou adicionar um novo fabricante. Segue o código fonte:

<?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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition template="/templates/modeloGeral.xhtml">
    <ui:define name="metadata">
        <f:metadata>
            <f:event listener="#{fabricanteBean.carregarPesquisa}"
                type="preRenderView" />
        </f:metadata>
    </ui:define>
    <ui:define name="conteudo">

        <h:form>
            <p:toolbar>
                <f:facet name="left">
                    <h:outputText value="Fabricantes" />
                </f:facet>
            </p:toolbar>

            <p:dataTable emptyMessage="Nenhum registro encontrado."
                value="#{fabricanteBean.listaFabricantes}"
                filteredValue="#{fabricanteBean.listaFabricantesFiltrados}"
                var="fabricante" rows="10" paginator="true">

                <f:facet name="footer">
                    <p:button value="Novo" outcome="/pages/fabricanteCadastro.xhtml">
                        <f:param name="fabacao" value="Novo" />
                    </p:button>
                </f:facet>

                <p:column headerText="Código">
                    <h:outputText value="#{fabricante.codigo}" />
                </p:column>

                <p:column headerText="Descrição" sortBy="#{fabricante.desscricao}"
                    filterBy="#{fabricante.descricao}">
                    <h:outputText value="#{fabricante.descricao}" />
                </p:column>

                <p:column headerText="Opções">

                    <p:button value="Excluir" outcome="/pages/fabricanteCadastro.xhtml">
                        <f:param name="fabacao" value="Excluir" />
                        <f:param name="fabcod" value="#{fabricante.codigo}" />
                    </p:button>

                    <p:button value="Editar" outcome="/pages/fabricanteCadastro.xhtml">
                        <f:param name="fabacao" value="Editar" />
                        <f:param name="fabcod" value="#{fabricante.codigo}" />
                    </p:button>
                </p:column>

            </p:dataTable>
        </h:form>
    </ui:define>
</ui:composition>

</html>

Ao clicar em uma comando (excluir ou editar) tenho que passar pela URL o tipo da ação (se é editar, excluir ou adicionar um novo fabricante) e o código (no caso de editar e excluir) do objeto para a página que contém o formulário. Neste caso faço uso do f:param. A página que recebe é fabricanteCadastro.xhtml. Segue o código fonte:

<?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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition template="/templates/modeloGeral.xhtml">
    <ui:define name="metadata">
        <f:metadata>
            <f:viewParam name="fabacao" value="#{fabricanteBean.acao}" />
            <f:viewParam name="fabcod" value="#{fabricanteBean.codigo}" />

            <f:event listener="#{fabricanteBean.carregarCadastro}"
                type="preRenderView" />
        </f:metadata>
    </ui:define>

    <ui:define name="conteudo">
        <h:form id="frmFabCadastro">
            <p:toolbar>
                <f:facet name="left">
                    <h:outputText value="Fabricantes" />
                </f:facet>
            </p:toolbar>
            <h:panelGrid id="pnlFabCadastro" columns="2">
                <p:outputLabel value="Código:" />
                <p:inputText size="10" readonly="true"
                    value="#{fabricanteBean.fabricanteCadastro.codigo}" />

                <p:outputLabel for="txtFabCadDescricao" value="Desrição:" />
                <p:inputText id="txtFabCadDescricao" maxlength="50" size="30"
                    value="#{fabricanteBean.fabricanteCadastro.descricao}"
                    readonly="#{fabricanteBean.acao == 'Excluir'}"
                    required="true" requiredMessage="O campo descrição é obrigatório." />
            </h:panelGrid>

            <h:panelGrid columns="5">
                <p:commandButton value="Novo"
                    actionListener="#{fabricanteBean.novo}"
                    update=":frmFabCadastro:pnlFabCadastro" 
                    rendered="#{fabricanteBean.acao == 'Novo'}"    />

                <p:commandButton value="Salvar"
                    actionListener="#{fabricanteBean.salvar}"
                    update=":MsgGlobal :frmFabCadastro:pnlFabCadastro" 
                    rendered="#{fabricanteBean.acao == 'Novo'}" />

                <p:commandButton value="Excluir"
                    actionListener="#{fabricanteBean.excluir}" update=":MsgGlobal" 
                    rendered="#{fabricanteBean.acao == 'Excluir'}" />

                <p:commandButton value="Editar" 
                    actionListener="#{fabricanteBean.editar}" update=":MsgGlobal"
                    rendered="#{fabricanteBean.acao == 'Editar'}"
                    />

                <p:button value="Voltar"
                    outcome="/pages/fabricantePesquisa.xhtml?faces-redirect=true" />
            </h:panelGrid>
        </h:form>
    </ui:define>
</ui:composition>

</html>

Para capturar os dados da URL utilizo a f:viewParam, mas apesar da url constar os dados dos parâmetros enviada pela página anterior, a vieParam não capta. Já li o manual e vi vários exemplos em livros e videos aulas e não consigo encontrar o problema.

Segue também o código da MB:

package br.com.drogaria.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.drogaria.dao.FabricanteDAO;
import br.com.drogaria.domain.Fabricante;
import br.com.drogaria.util.FacesUtil;

@ManagedBean
@ViewScoped
public class FabricanteBean {
    private Fabricante fabricanteCadastro;
    private List<Fabricante> listaFabricantes;
    private List<Fabricante> listaFabricantesFiltrados;

    private String acao;
    private Long codigo;

    public Fabricante getFabricanteCadastro() {
        return fabricanteCadastro;
    }

    public void setFabricanteCadastro(Fabricante fabricanteCadastro) {
        this.fabricanteCadastro = fabricanteCadastro;
    }

    public List<Fabricante> getListaFabricantes() {
        return listaFabricantes;
    }

    public void setListaFabricantes(List<Fabricante> listaFabricantes) {
        this.listaFabricantes = listaFabricantes;
    }

    public List<Fabricante> getListaFabricantesFiltrados() {
        return listaFabricantesFiltrados;
    }

    public void setListaFabricantesFiltrados(
            List<Fabricante> listaFabricantesFiltrados) {
        this.listaFabricantesFiltrados = listaFabricantesFiltrados;
    }

    public String getAcao() {
        return acao;
    }

    public void setAcao(String acao) {
        this.acao = acao;
    }

    public Long getCodigo() {
        return codigo;
    }

    public void setCodigo(Long codigo) {
        this.codigo = codigo;
    }

    public void novo() {
        fabricanteCadastro = new Fabricante();
    }

    public void salvar() {
        try {
            FabricanteDAO fabricanteDAO = new FabricanteDAO();
            fabricanteDAO.salvar(fabricanteCadastro);
            fabricanteCadastro = new Fabricante();

            FacesUtil.addMsgInfo("Fabricante salvo com sucesso!");

        } catch (RuntimeException ex) {
            FacesUtil.addMsgError("Erro ao tentar incluir um fabricante: "
                    + ex.getMessage());
        }

    }

    public void carregarPesquisa() {
        try {
            FabricanteDAO fabricanteDAO = new FabricanteDAO();
            listaFabricantes = fabricanteDAO.listar();
        } catch (RuntimeException ex) {
            FacesUtil.addMsgError("Erro ao tentar listar os fabricantes: "
                    + ex.getMessage());
        }
    }

    public void carregarCadastro() {
        try {
            if (codigo != null) {
                FabricanteDAO fabricanteDAO = new FabricanteDAO();
                fabricanteCadastro = fabricanteDAO.buscarPorCodigo(codigo);
            } else {
                fabricanteCadastro = new Fabricante();
            }
        } catch (RuntimeException ex) {
            FacesUtil
                    .addMsgError("Erro ao tentar obter os dados do fabricante: "
                            + ex.getMessage());
        }
    }

    public void excluir() {
        try {
            FabricanteDAO fabricanteDAO = new FabricanteDAO();
            fabricanteDAO.excluir(fabricanteCadastro);

            FacesUtil.addMsgInfo("Fabricante removido com sucesso!");
        } catch (RuntimeException ex) {
            FacesUtil.addMsgError("Erro ao tentar remover o fabricante: "
                    + ex.getMessage());
        }
    }

    public void editar() {
        try {
            FabricanteDAO fabricanteDAO = new FabricanteDAO();
            fabricanteDAO.editar(fabricanteCadastro);

            FacesUtil.addMsgInfo("Fabricante alterado com sucesso.");
        } catch (RuntimeException ex) {
            FacesUtil.addMsgError("Erro ao tentar alterar o fabricante: "
                    + ex.getMessage());
        }
    }
}

Desde já agradeço pela ajuda!

  • Pessoal, descobri o problema. Neste caso era uma simples alteração de biblioteca de xmlns:f="http://xmlns.jcp.org/jsf/core" para xmlns:f="http://java.sun.com/jsf/core" e passou a funcionar. Achei estranho e fiz o teste para ver se foi isso mesmo, e de fato foi. fica o registro se acaso alguém tiver o mesmo problema.?

    Hugo Araújo Nóbrega   23 de abr de 2016
  • Olá Hugo, que bom que resolveu, adicione a sua solução como uma Resposta. Bem vindo ao GUJ (:

    Douglas Junior   27 de abr de 2016
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags post java-ee jsf java ou faça a sua própria pergunta.