【问题标题】:Primefaces actionbutton called several times多次调用 Primefaces 操作按钮
【发布时间】:2012-09-09 23:41:09
【问题描述】:

我一直在为一个问题而苦苦挣扎,我找不到解决它的方法,我在网络上也找不到任何相关的东西。

我正在使用带有 Primefaces 的 Netbeans 来开发 JSF Web 应用程序。

一切正常,只是有时对 actionlisteners 的调用被执行了多次。

例如,这是我的带有 primefaces 的 JSF 页面:

<h:body>
   <ui:composition template="home.xhtml">

        <ui:define name="content">
            <h2>Administración de alertas SMS</h2>


                    <p:panel id="display">

                        <p:selectBooleanCheckbox itemLabel="Enviar alertas SMS" value="#{smsConfigBean.alertsEnabled}"/>

                        <p>
                        <h:outputText value="Mensaje de Texto: " /><br /><br />
                        <p:inputTextarea rows="5" cols="50" counterTemplate="{0} caracteres restantes." counter="counter" maxlength="160" value="#{smsConfigBean.smsMessage}" id="smsMessage"/>
                        <br />
                        <h:outputText id="counter" />
                        </p>

                        <p>   
                        <h:outputText value="Dispositivo de envio SMS: " />  
                        <p:selectOneRadio id="options" value="#{smsConfigBean.usePhone}">  
                            <f:selectItem itemLabel="Modem USB"  itemValue="false" />  
                            <f:selectItem itemLabel="Telefono Android" itemValue="true" />                                        
                        </p:selectOneRadio>  
                        </p>
                        <br />
                        <p:tabView id="tabView">  

                            <p:tab id="tab1" title="Modem USB">  
                                <h:panelGrid id="modemGrid" columns="2" cellpadding="4">  
                                    <h:outputText value="Puerto: " />  
                                    <p:inputText id="port" value="#{smsConfigBean.port}"/>  

                                    <h:outputText value="Bit Rate (Opcional): " />  
                                    <p:inputText id="bitRate" value="#{smsConfigBean.bitRate}"/>  

                                    <h:outputText value="Nombre de modem (Opcional): " />  
                                    <p:inputText id="modemName" value="#{smsConfigBean.modemName}"/>

                                    <h:outputText value="PIN: " />  
                                    <p:inputText id="pin" value="#{smsConfigBean.modemPin}"/>

                                    <h:outputText value="Centro de Mensajes: " />  
                                    <p:inputText id="smsc" value="#{smsConfigBean.SMSC}"/>                                  
                                </h:panelGrid>
                            </p:tab>  

                            <p:tab id="tab2" title="Telefono Android">  

                                 <h:panelGrid id="phoneGrid" columns="2" cellpadding="4">  
                                    <h:outputText value="Path ADB:" />  
                                    <p:inputText id="adbPath" value="#{smsConfigBean.adbPath}"/>  

                                    <h:outputText value="Directorio de Configuracion:" />  
                                    <p:inputText id="configPath" value="#{smsConfigBean.configPath}"/>  

                                    <h:outputText value="Modo de conexion " />  
                                    <p:selectOneRadio id="connectOptions" value="#{smsConfigBean.useWifi}">  
                                        <f:selectItem itemLabel="USB" itemValue="false"/>  
                                        <f:selectItem itemLabel="WiFi" itemValue="true" />                                        
                                    </p:selectOneRadio>  

                                    <h:outputText value="Direccion IP (Solo para WiFi): " />  
                                    <p:inputText id="ipDir" value="#{smsConfigBean.ipDir}"/>  

                                </h:panelGrid> 
                            </p:tab>  

                        </p:tabView> 


                    </p:panel>

                    <br />
                    <p:commandButton id="saveSmsAlerts" value="Guardar" update="messages" action="#{smsConfigBean.saveChanges}" actionListener="#{smsConfigBean.saveChanges}"/>



        </ui:define>

    </ui:composition>
</h:body>

这是我的后端 bean:

打包 Bean;

导入 helpers.Global;导入 javax.faces.bean.ManagedBean;进口 javax.faces.bean.SessionScoped;

@ManagedBean @SessionScoped 公共类 SmsConfigBean {

private Boolean alertsEnabled;
private Boolean usePhone;
private Boolean useWifi;

private String port;
private int bitRate;
private String modemName;
private String modemPin;
private String SMSC;
private String adbPath;
private String configPath;
private String ipDir;

private String smsMessage;

public SmsConfigBean() {
    alertsEnabled = Global.getAlertsEnabled();      
    port = Global.getPort();
    bitRate = Global.getBitRate();
    modemName = Global.getModemName();
    modemPin = Global.getModemPin();
    SMSC = Global.getSMSC();
    usePhone = Global.getUsePhone();
    adbPath = Global.getAdbPath();
    configPath = Global.getConfigPath();
    useWifi = Global.getUseWifi();
    ipDir = Global.getIpDir();     
    smsMessage = Global.getSmsMessage();
}

public Boolean getAlertsEnabled() {
    return alertsEnabled;
}

public void setAlertsEnabled(Boolean alertsEnabled) {
    this.alertsEnabled = alertsEnabled;
}

public String getPort() {
    return port;
}

public void setPort(String port) {
    this.port = port;
}

public int getBitRate() {
    return bitRate;
}

public void setBitRate(int bitRate) {
    this.bitRate = bitRate;
}

public String getModemName() {
    return modemName;
}

public void setModemName(String modemName) {
    this.modemName = modemName;
}

public String getModemPin() {
    return modemPin;
}

public void setModemPin(String modemPin) {
    this.modemPin = modemPin;
}

public String getSMSC() {
    return SMSC;
}

public void setSMSC(String SMSC) {
    this.SMSC = SMSC;
}

public Boolean getUsePhone() {
    return usePhone;
}

public void setUsePhone(Boolean usePhone) {
    this.usePhone = usePhone;
}

public String getAdbPath() {
    return adbPath;
}

public void setAdbPath(String adbPath) {
    this.adbPath = adbPath;
}

public String getConfigPath() {
    return configPath;
}

public void setConfigPath(String configPath) {
    this.configPath = configPath;
}

public Boolean getUseWifi() {
    return useWifi;
}

public void setUseWifi(Boolean useWifi) {
    this.useWifi = useWifi;
}

public String getIpDir() {
    return ipDir;
}

public void setIpDir(String ipDir) {
    this.ipDir = ipDir;
}

public String getSmsMessage() {
    return smsMessage;
}

public void setSmsMessage(String smsMessage) {
    this.smsMessage = smsMessage;
}

public void saveChanges(){
    Global.setSmsMessage(smsMessage);
    Global.setIpDir(ipDir);
    Global.setUseWifi(useWifi);
    Global.setConfigPath(configPath);
    Global.setAdbPath(adbPath);
    Global.setUsePhone(usePhone);
    Global.setSMSC(SMSC);
    Global.setModemPin(modemPin);
    Global.setModemName(modemName);
    Global.setBitRate(bitRate);
    Global.setPort(port);
    Global.setAlertsEnabled(alertsEnabled);
    Global.sendInfoResponseMessage("Cambios guardados con exito");
} 

}

问题在于,当通过点击命令按钮“saveSmsAlerts”来保存此表单的更改时,会进行两次调用。导致咆哮消息也显示两次。 (你不会看到咆哮组件,因为它是在模板中定义的)

这也发生在我为使用 fileuploader 上传文件的同一应用程序所做的另一个页面中。文件上传4次!!

我正在使用 chrome 来测试应用程序并使用 netbeans 来开发它。

【问题讨论】:

  • 您是否可以删除 action 属性,因为您没有返回结果。单独的 actionListener 就足够了。还将方法更改为 public void saveChanges(ActionEvent e)

标签: jsf button primefaces command action


【解决方案1】:

您应该删除 action 或 actionListener 属性之一。

<p:commandButton id="saveSmsAlerts" value="Guardar" update="messages" action="#{smsConfigBean.saveChanges}"/>

如果你删除 action 属性,你应该改变 action 方法签名

<p:commandButton id="saveSmsAlerts" value="Guardar" update="messages"  actionListener="#{smsConfigBean.saveChanges}"/>

这样

public void saveChanges(ActionEvent e){
...
}

这里是action和actionListener的区别

Differences between action and actionListener

【讨论】:

  • 在被调用的方法中不需要ActionEvent。此外,在这种情况下,OP 应该使用 action 而不是 actionListener 来查看两者之间的区别,请参阅 this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多