简体   繁体   中英

How an inputText set an attribute from the bean?

I have tried to create to create a dialog that I can insert a value to be used on my bean. However, my InputText doesn't update my object on Bean.

This is my InputText :

What is missing on my inputText ? I have tried @this and h:param but I didn't get anything.

This is my xhtml, basically I added a dialog to insert new objects:

<?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">
<!-- Composition para poder importar template -->
<ui:composition 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://java.sun.com/jsf/facelets"
template="/templates/modeloSistema.xhtml">

<ui:define name="menu">
    <ui:include src="/includes/menuPrincipal.xhtml"></ui:include>
</ui:define>
<ui:define name="conteudo">
    <h:form>
        <p:dataTable emptyMessage="Nenhum Fabricante registrado"
            value="#{MBFabricante.itens}" var="item" paginator="true" rows="10">
            <f:facet name="header">
                Fabricante - Listagem
            </f:facet>
            <p:column headerText="Codigo" sortBy="#{item.codigo}"
                filterBy="#{item.codigo}">
                <p:outputLabel value="#{item.codigo}"></p:outputLabel>
            </p:column>
            <p:column headerText="Descricao" sortBy="#{item.descricao}"
                filterBy="#{item.descricao}">
                <p:outputLabel value="#{item.descricao}"></p:outputLabel>
            </p:column>
            <f:facet name="footer">
                <!-- Utilizar complete para fazer apos a criacao de instanciar fabricante com prepararNovo -->
                <p:commandButton value="Novo" process="@this"
                    actionListener="#{MBFabricante.prepararNovo}"
                    oncomplete="PF('dlgFabNovo').show();" />
            </f:facet>
        </p:dataTable>
    </h:form>

    <!-- O @(body) serve para indicar que o modal deve exercer funcao sobre o modal -->
    <p:dialog widgetVar="dlgFabNovo" closable="true" draggable="true"
        resizable="false" modal="true" appendTo="@(body)"
        header="Fabricante - Novo">
        <h:form>
            <h:panelGrid columns="2">
                <p:outputLabel for="descricao" value="Descricao: "></p:outputLabel>
                <p:inputText id="descricao"
                    value="#{MBFabricante.fabricante.descricao}"></p:inputText>
            </h:panelGrid>
            <!-- action usa metodos criados no manage bean utilizando comandos l # -->
            <p:commandButton value="Gravar" process="@this"
                actionListener="#{MBFabricante.novo}"></p:commandButton>
            <p:commandButton value="Cancelar" onclick="PF('dlgFabNovo').hide();"></p:commandButton>
        </h:form>
    </p:dialog>
</ui:define>
</ui:composition>

This is my Bean, I can add my domain in case you guys think it is necessary:

package br.com.drogaria.bean;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.ListDataModel;

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

@ManagedBean(name = "MBFabricante")
@ViewScoped
public class FabrincanteBean {

private Fabricante fabricante;

private ListDataModel<Fabricante> itens;

public ListDataModel<Fabricante> getItens() {
    System.out.println("Passou 1");

    return itens;
}

public void setItens(ListDataModel<Fabricante> itens) {
    System.out.println("Passou 12");

    this.itens = itens;
}

public Fabricante getFabricante() {
    System.out.println("Passou 2");

    return fabricante;
}

public void setFabricante(Fabricante fabricante) {
    System.out.println("Passou 23");

    this.fabricante = fabricante;
}

// Post , esse metodo vai ser chamado antes da pagina ser desenhada.
@PostConstruct
public void prepararPesquisa() {

    try {
        FabricanteDAO dao = new FabricanteDAO();
        ArrayList<Fabricante> lista;
        lista = dao.listar();
        // Converte Arraylist para DataModel
        itens = new ListDataModel<Fabricante>(lista);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public void prepararNovo() {
    fabricante = new Fabricante();
    System.out.println("Preparou fabricante  " + fabricante);
}

public void novo() {
    System.out.println("Passou pelo metodo novo, valor " + fabricante);
    try {
        FabricanteDAO dao = new FabricanteDAO();
        dao.salvar(fabricante);
        prepararPesquisa();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}
<p:commandButton value="Gravar" process="@this" actionListener="#{MBFabricante.novo}"></p:commandButton>`

Will not process the inputText as you have chosen to only process the commandButton by choosing @this . Try process="@form" this should include the value from the inputText when you press the commandButton.

Exactly how this works is demonstrated beautifully on the PrimeFaces Showcase, where you can try different process attributes, https://www.primefaces.org/showcase/ui/ajax/process.xhtml

There is also a previous Q/A here that covers this further, Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM