Как inputText установить атрибут из бобов? - PullRequest
0 голосов
/ 08 января 2019

Я попытался создать, чтобы создать диалоговое окно, в которое я могу вставить значение, которое будет использоваться в моем компоненте. Однако мой InputText не обновляет мой объект на Bean.

Это мой InputText:

Чего не хватает в моем inputText? Я пробовал @this и h: param, но ничего не получил.

Это мой xhtml, в основном я добавил диалог для вставки новых объектов:

<?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>

Это мой Бин, я могу добавить свой домен, если вы, ребята, сочтете это необходимым:

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();
    }
}

}

1 Ответ

0 голосов
/ 08 января 2019
<p:commandButton value="Gravar" process="@this" actionListener="#{MBFabricante.novo}"></p:commandButton>`

Не будет обрабатывать inputText, так как вы выбрали обработку только кнопки command, выбрав @this. Попробуйте process="@form", это должно включать значение из inputText при нажатии кнопки command.

Точно, как это работает, прекрасно демонстрируется на PrimeFaces Showcase, где вы можете попробовать различные атрибуты процесса, https://www.primefaces.org/showcase/ui/ajax/process.xhtml

Здесь также есть предыдущая Q / A, которая описывает это далее, Понимание процесса / обновления PrimeFaces и JSF f: атрибуты исполнения / рендеринга ajax

...