AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77879948
Accepted
Liliymas
Liliymas
Asked: 2024-01-25 20:23:05 +0800 CST2024-01-25 20:23:05 +0800 CST 2024-01-25 20:23:05 +0800 CST

当我取消主详细信息对话框时获取随机数据表选择

  • 772

我有一个基本的选择数据表,其中包含电子邮件列表和 SessionScope bean。当我编辑电子邮件时,会出现一个对话框,其中包含要编辑的电子邮件。我选择的第一个电子邮件是正确的电子邮件,但当我选择另一封电子邮件时,会出现随机电子邮件。我不明白为什么会发生这种情况。我检查了官方 Primefaces 5 文档并尝试了代码中提到的所有方法,以及仅使用操作并直接在操作中传递电子邮件。问题是,当我取消对话框时,下一个选定的电子邮件以及除第一个之外的所有其他电子邮件都是随机电子邮件。感谢您的帮助。

我的xhtml:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:pe="http://primefaces.org/ui/extensions"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    template="/facelets/template.xhtml">

    <ui:define name="headpage">
        <ui:include src="/facelets/head.xhtml"></ui:include>
    </ui:define>

    <ui:define name="bodypage">
        <f:event type="preRenderView" listener="#{emailBean.cargaListaEmail}" />
        <f:event
            listener="#{busquedaSugerenciasExpedientesBean.resetCajita()}"
            type="preRenderView" />

        <pe:importConstants
            className="es.ja.csalud.sas.intranet.buzoncontacto.constantes.NombreAtributos"
            var="nombreAtributos" />
        <pe:importConstants
            className="es.ja.csalud.sas.intranet.buzoncontacto.constantes.Cadenas"
            var="cadenas" />
        <pe:importConstants
            className="es.ja.csalud.sas.intranet.buzoncontacto.constantes.NavigationRules"
            var="navigationRules" />
        <div class="container">
            <div class="cajaConfiguracion">
                <h:form id="formApertura" styleClass="formApertura">
                    <div class="cabeza">
                        <h2 class="pageTitle">#{lbl.configuracion_titulo_emails}</h2>
                    </div>

                    <p:accordionPanel multiple="true" activeIndex="0" id="acordeon">
                        <p:tab title="#{lbl.configuracion_titulo_emails}">

                            <div class="fluido anchoCompleto">
                                <p:dataTable id="tablaEmails" var="email"
                                    styleClass="dt_configuracion"
                                    tableStyle="table-layout: auto; width:100%" widgetVar="email"
                                    value="#{emailBean.listaEmails}" editable="true"
                                    sortBy="#{email.nombreEmail}" rows="10" paginator="true"
                                    paginatorTemplate="{PreviousPageLink} {PageLinks} {NextPageLink} {CurrentPageReport} {RowsPerPageDropdown}"
                                    currentPageReportTemplate="{currentPage} DE {totalPages}"
                                    rowsPerPageLabel="Mostrar"
                                    rowsPerPageTemplate="5,10,50,100,{ShowAll|'Todo'}"
                                    paginatorPosition="bottom" rowKey="#{email.idEmail}"
                                    emptyMessage="#{msg.tbl_noRegist}"
                                    >
                                    
                                    <p:ajax event="rowSelect" 
                                            listener="#{grupoBean.onRowSelect}" update="@this" />
                                    
                                    <p:column headerText="#{lbl.nombre_email}"
                                        sortBy="#{email.nombreEmail}">
                                        <h:outputText value="#{email.nombreEmail}" />
                                    </p:column>
                                    <p:column headerText="#{lbl.editor}"
                                        sortBy="#{email.modificador}">
                                        <h:outputText value="#{email.modificador}" />
                                    </p:column>
                                    <p:column headerText="#{lbl.f_modificado}"
                                        sortBy="#{email.fechaModificacion}">
                                        <h:outputText value="#{email.fechaModificacion.toDate()}">
                                            <f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" />
                                        </h:outputText>
                                    </p:column>
                                    <p:column headerText="#{lbl.activo}" sortBy="#{email.activo}">
                                        <h:outputText value="#{email.activo ? 'Si' : 'No'}" />
                                    </p:column>

                                    <p:column styleClass="enlaceEdicion accionConfiguracion"
                                        headerText="#{lbl.list_acciones}">
                                        <h:outputText value="" />
                                        <p:commandButton value="#{lbl.bt_editar}"
                                                         title="#{lbl.bt_editar}"
                                                         icon="fa fa-edit"
                                                         action="#{emailBean.editarEmail()}"
                                                         process="@this"
                                                         update=":formApertura:acordeon:dialogAnadirEmail"
                                                         oncomplete="PF('dialogAnadirEmail').show();"
                                                         >
<!--                                            <p:ajax event="click" listener="#{emailBean.setEmailSeleccionada(email)}" update="@none" /> -->
<!--                                            <p:confirm header="Editar Email" -->
<!--                                                       message="¿Está seguro que desea editar #{email.nombreEmail}?" -->
<!--                                                       icon="ui-icon-alert" /> -->
<!--                                            <f:setPropertyActionListener value="#{email}" -->
<!--                                                  target="#{emailBean.emailSeleccionada}"/> -->
                                                <f:actionListener
                                                binding="#{emailBean.setEmailSeleccionada(email)}" />
                                        </p:commandButton>



                                        <p:commandButton value="#{lbl.bt_eliminar}" id="btnEliminar"
                                            title="#{lbl.bt_eliminar}" icon="far fa-trash-alt"
                                            action="#{emailBean.borrarEmail()}" process="@this"
                                            update=":msgs :formApertura:acordeon:tablaEmails">
                                            <f:setPropertyActionListener value="#{email}"
                                                target="#{emailBean.emailSeleccionada}" />
                                            <p:confirm header="Eliminar Email"
                                                message="¿Está seguro que desea eliminar #{email.nombreEmail}?"
                                                icon="ui-icon-alert" />

                                        </p:commandButton>

                                    </p:column>
                                </p:dataTable>
                            </div>
                            <!-- DIALOGO PARA AÑADIR/EDITAR TIPO DE GESTION MASIVA -->
                            <p:dialog header="#{lbl.email_configuracion}"
                                widgetVar="dialogAnadirEmail" id="dialogAnadirEmail"
                                modal="true" minimizable="false" maximizable="false"
                                closable="true" styleClass="modal1Filas1Campos"
                                resizable="false">
                                <h:panelGroup id="panel">
                                    <div class="grupoFiltrosAlineados">
                                        <div class="classFiltrosAlineados">
                                            <h:outputLabel class="labelFiltrosAlineados labelEstilo"
                                                value="#{lbl.nombre_email}" />
                                            <p:inputText styleClass="uiFiltrosAlineados"
                                                label="#{lbl.nombre_email}" required="true"
                                                value="#{emailBean.emailEditar.nombreEmail}">
                                                <f:validateLength maximum="200" />
                                                <f:validator validatorId="com.emailValidator" />
                                            </p:inputText>
                                        </div>


                                        <div class="classFiltrosAlineados">
                                            <h:outputLabel class="labelFiltrosAlineados labelEstilo"
                                                value="#{lbl.activo} " />
                                            <p:selectBooleanCheckbox
                                                styleClass="botonCheckbox labelCheck checkMargen"
                                                value="#{emailBean.emailEditar.activo}">
                                                <p:ajax event="change" process="@this" update="@this" />
                                            </p:selectBooleanCheckbox>
                                        </div>

                                    </div>
                                </h:panelGroup>

                                <br />

                                <p:commandButton styleClass="botonOtros"
                                    value="#{lbl.bt_aceptar}" process="@this dialogAnadirEmail"
                                    action="#{emailBean.saveEmail()}"
                                    update=":msgs formApertura:acordeon:tablaEmails">
                                </p:commandButton>

                                <p:commandButton styleClass="botonOtros"
                                    value="#{lbl.bt_cancelar}" type="button"
                                    action="#{emailBean.cleanData()}"
                                    onclick="PF('dialogAnadirEmail').hide();" 
                                />
                            </p:dialog>

                            <!-- BOTONES  -->
                            <h:panelGroup id="botonera">
                                <div class="botones grandes izquierda">

                                    <p:commandButton value="#{lbl.bt_anadir}"
                                        styleClass="botonOtros"
                                        action="#{emailBean.editarEmailCrear()}" immediate="true"
                                        oncomplete="PF('dialogAnadirEmail').show();" process="@this"
                                        update=":formApertura:acordeon:dialogAnadirEmail" />

                                </div>
                            </h:panelGroup>
                            <!--   -->
                        </p:tab>
                    </p:accordionPanel>

                    <p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
                        <p:commandButton value="Sí" styleClass="ui-confirmdialog-yes"
                            icon="ui-icon-check" />
                        <p:commandButton value="No" styleClass="ui-confirmdialog-no"
                            icon="ui-icon-close" />
                    </p:confirmDialog>

                </h:form>
            </div>
        </div>
    </ui:define>
    <ui:define name="footpage">
        <ui:include src="/facelets/foot.xhtml"></ui:include>
    </ui:define>
</ui:composition>

我的豆类:

package es.ja.csalud.sas.intranet.buzoncontacto.configuracion.presentation.boundary;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;

import javax.inject.Inject;
import javax.inject.Named;

import org.joda.time.DateTime;
import org.primefaces.PrimeFaces;
import org.primefaces.event.SelectEvent;

import es.ja.csalud.sas.intranet.buzoncontacto.centros.business.entity.Centro;
import es.ja.csalud.sas.intranet.buzoncontacto.configuracion.business.boundary.Emails;
import es.ja.csalud.sas.intranet.buzoncontacto.configuracion.business.entity.Email;
import es.ja.csalud.sas.intranet.buzoncontacto.constantes.Cadenas;
import es.ja.csalud.sas.intranet.buzoncontacto.constantes.Presentacion;
import es.ja.csalud.sas.intranet.buzoncontacto.gestoresInternos.business.boundary.GestoresInternos;
import es.ja.csalud.sas.intranet.buzoncontacto.grupo.business.boundary.Grupos;
import es.ja.csalud.sas.intranet.buzoncontacto.grupo.business.entity.Grupo;
import es.ja.csalud.sas.intranet.buzoncontacto.presentation.BaseBean;
import es.ja.csalud.sas.intranet.buzoncontacto.presentation.helper.Util;
import es.ja.csalud.sas.intranet.buzoncontacto.springsecurity.presentation.boundary.UserReclamacionesBean;

@Named
@SessionScoped
public class EmailBean extends BaseBean implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -2075577773794936417L;

    @Inject
    private Emails emails;

    @Inject
    protected transient UserReclamacionesBean userReclamacionesBean;

    @Inject
    protected Grupos grupos;

    @Inject
    private GestoresInternos gestoresInternos;

    private List<Email> listaEmails;

    private Email emailSeleccionada;

    @Inject
    private UserReclamacionesBean user;

    private Email emailEditar; 
    
    private Centro centroUsuario = null;

    /**
     * Inits the.
     */
    @PostConstruct
    public void init() {
        // Obtener la lista de Emails que pertenecen al Centro Hopitalario del Usuario
        this.listaEmails = new ArrayList<>();
        this.cargaListaEmail();

        this.emailSeleccionada = new Email();
        this.emailEditar = new Email();
    }

    /**
     * Actualiza a traves de la sesion el Centro Hospitalario al que pertenece (o ha
     * seleccionado) el Usuario.
     */
    public void actualizaCentroSeleccionadoUsuario() {
        Object objCentro = getSession().getAttribute(Cadenas.CENTRO_SELECCIONADO_USUARIO);
        if (objCentro instanceof Centro) {
            centroUsuario = (Centro) objCentro;
        }
    }

    public void cargaListaEmail() {
        this.actualizaCentroSeleccionadoUsuario();

        if (null != this.listaEmails) {
            if (this.userReclamacionesBean.getRole().equals(Cadenas.BCS_ADMINISTRADOR)) {
                this.listaEmails = this.emails.findByCentro(centroUsuario.getId());
            }else if(this.userReclamacionesBean.getRole().equals(Cadenas.BCS_GESTOR_INTERNO)) {
                Grupo grupo = grupoEmail();

                this.listaEmails = this.emails.findByCentroYGrupo(grupo, centroUsuario.getId());
            }
            
        }
    }

    private Grupo grupoEmail() {
        Grupo grupo;
        if (this.userReclamacionesBean.getRole().equals(Cadenas.BCS_ADMINISTRADOR)) {
            grupo = this.grupos.getById(0L);
        } else {
            grupo = this.gestoresInternos.getGestorInternoByDNI(userReclamacionesBean.getIdentificador())
                    .getGrupoGestorInterno();
        }
        return grupo;
    }

   public void editarEmail() {
        this.emailEditar = new Email(this.emailSeleccionada);
        System.out.println("editarEmail = " + this.emailEditar.getNombreEmail());
    }

   public void prepararEdicion(Email email) {
        this.emailSeleccionada = email;
        System.out.println("email = " + email.getNombreEmail());
        editarEmail();
    }

    public void saveEmail() {
        boolean insert = true;
        Grupo grupo = this.grupoEmail();

        // Validacion
        if (this.validateEmail()) {

            if (null == this.emailEditar.getId()) {
                this.emailEditar.setFechaInicioVigencia(new DateTime());
                this.emailEditar.setCreador(user.getNameUser());
                this.emailEditar.setFechaCreacion(new DateTime());
                this.emailEditar.setFechaModificacion(new DateTime());
                this.emailEditar.setModificador(user.getNameUser());
                this.emailEditar.setGrupo(grupo);
                this.emailEditar.setIdCentro(centroUsuario.getId());
                
            } else {

                this.emailEditar.setFechaInicioVigencia(new DateTime());
                this.emailEditar.setFechaModificacion(new DateTime());
                this.emailEditar.setModificador(user.getNameUser());
                this.emailEditar.setGrupo(grupo);
                insert = false;
            }

            this.emails.guardar(this.emailEditar);

            this.emails.flush();

            if (insert) {
                this.addMessageInfo(Presentacion.LBL.getString("Guardado_correcto"),
                        Presentacion.LBL.getString("EMAIL_CONFIGURACION_CREADA"));
            }

            if (!insert) {
                this.addMessageInfo(Presentacion.LBL.getString("Guardado_correcto"),
                        Presentacion.LBL.getString("EMAIL_CONFIGURACION_MODIFICADA"));

            }

            PrimeFaces.current().executeScript("PF('dialogAnadirEmail').hide()");
            this.emailEditar = new Email();
            this.cargaListaEmail();
        }
    }

    public void cleanData() {
        this.emailEditar = new Email();
        //this.emailSeleccionada = new Email();
        //PrimeFaces.current().ajax().update("formApertura:acordeon:dialogAnadirEmail");

    }

    public void borrarEmail() {
        emailSeleccionada.setFechaFinVigencia(new DateTime());
        emailSeleccionada.setActivo(false);
        this.emails.update(emailSeleccionada);
        this.emails.flush();
        this.emailEditar = new Email();
        this.emailSeleccionada = new Email();
        this.addMessageInfo(Presentacion.EXITO_ELIMINAR, "");
        this.cargaListaEmail();
    }

    protected boolean validateEmail() {
        boolean validacion = true;

        // Validamos que sea un email correcto
        if (!Util.validateEmailNoCorporativo(this.emailEditar.getNombreEmail())) {
            this.addMessageError(Presentacion.ERROR_VALID, Cadenas.ERR_CORREO_INVALIDO);
            validacion = false;
        }

        return validacion;
    }

    public void onRowSelect(SelectEvent event) {
        final Email p = (Email) event.getObject();
        this.emailSeleccionada = p;
    }

    public void editarEmailCrear() {
        this.emailEditar = new Email();
    }

    public List<Email> getListaEmails() {
        return listaEmails;
    }

    public void setListaEmails(List<Email> listaEmail) {
        this.listaEmails = listaEmail;
    }

    public Email getEmailSeleccionada() {
        return emailSeleccionada;
    }

    public void setEmailSeleccionada(Email tipoMasivaSeleccionada) {
        this.emailSeleccionada = tipoMasivaSeleccionada;
    }

    public Email getEmailEditar() {
        return emailEditar;
    }

    public void setEmailEditar(Email tipoMasivaEditar) {
        this.emailEditar = tipoMasivaEditar;
    }

    public Centro getCentroUsuario() {
        return centroUsuario;
    }

    public void setCentroUsuario(Centro centroUsuario) {
        this.centroUsuario = centroUsuario;
    }

}
jsf
  • 1 1 个回答
  • 26 Views

1 个回答

  • Voted
  1. Best Answer
    BalusC
    2024-01-25T21:23:17+08:002024-01-25T21:23:17+08:00

    罪魁祸首就在这里:

    <f:event type="preRenderView" listener="#{emailBean.cargaListaEmail}" />
    

    This basically reloads the model behind the <p:dataTable> during every HTTP request. Note that an Ajax request also counts as a HTTP request. When that Ajax request doesn't include an update of the <p:dataTable>, then the presentation won't necessarily reflect the actual contents of the reloaded model. By default the records are selected by list index, so when the reloaded model has a different item in the selected index than being presented to the enduser, then the enduser will have the experience of seeing a "random" item.

    Just remove that preRenderView listener. You don't need it here. You're already explicitly loading the model in the @PostConstruct and in the save method of your backing bean. That's more than sufficient.

    In case you really need to reload the model during every request for some reason, then you can alternatively also instruct the <p:dataTable> to select the records by entity ID instead of list index. You can do so by specifying the rowKey attribute.

    <p:dataTable ...
                 value="#{emailBean.listaEmails}" 
                 var="email" 
                 rowKey="#{email.id}"
                 ...>
    

    See also:

    • How and when should I load the model from database for JSF dataTable
    • Creating master-detail table and dialog, how to reuse same dialog for create and edit

    That said, PrimeFaces 5.x is ancient (released May 2014, thus currently almost 10 years old!) and has serious security bugs. Try to keep your software up to date. See also among others JSF Cryptojacking Malware.

    • 1

相关问题

  • JSF ui:重复 | 只显示列表的前 5 个元素

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve