【问题标题】:Commandbutton does not exectute the actionListener property [duplicate]Commandbutton 不执行 actionListener 属性 [重复]
【发布时间】:2015-03-29 19:05:51
【问题描述】:

我对 HTML/Javascript/Java 相对较新,到目前为止,我找到了解决我所有“初学者”问题的方法……但这已经花了我几个小时的“尝试和错误”: 在我的应用程序中,客户端填写了一个表单,然后通过提交按钮将其传输到服务器 bean。

问题是,p:commandButton(在下面的代码中标记)不执行来自 actionListener 的方法表达式。在 oncomplete 或 onsuccess 属性中执行 javascript 代码有效,但由于我想在表单提交后调用支持的 bean 方法,我认为 actionListener 属性将是正确的选择.. 如果它有效。值得一提的是,表单位于 primefaces 对话窗口内。

如果您需要更多信息,例如 javascript 或 java 代码,请告诉我。

有人知道问题出在哪里吗? 提前致谢。

这里有一些代码来说明我的问题..

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

    <h:head>
        <f:facet name="first">
            <meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
            <title>Title</title>
        </f:facet>

        <style>

        </style>
    </h:head>

    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
    <script>

    </script>

    <h:body id="body">

        <p:growl id="growl" showDetail="true" />

        <p:layout fullPage="true">

            <p:layoutUnit position="north" size="100" resizable="true" closable="true" collapsible="true">
                Ihre Aufgabe besteht darin, 5 Ladesäulen zu setzten wo es ihnen gefällt auf der Karte.
            </p:layoutUnit>

            <p:layoutUnit position="south" size="175">                
                    <h:outputLabel id="outp" value="#{mainController.testparam}" />
            </p:layoutUnit>

            <p:layoutUnit position="west" size="175" collapsible="true">

            </p:layoutUnit>

            <p:layoutUnit position="center" id='idcenter'>

                <div id="map-canvas"></div>   

                <p:dialog id="dlg" modal="true" closeOnEscape="false" fitViewport="true" widgetVar="dlg" closable="false" resizable="false" width="50%" minWidth="500" appendTo="body">
                    <!--><h:form prependId="false" onsubmit="return cancel()"><-->

                    <h:form prependId="false" id="form1">                        
                        <h:panelGrid columns="3" cellpadding="10">
                            <h:outputLabel for="xfield" value="Koordinaten" />
                            <h:inputText disabled="true" id="xfield" value="#{mainController.currentXCoordinate}"/>
                            <h:inputText disabled="true" id="yfield" value="#{mainController.currentYCoordinate}"/>


                            <h:outputLabel for="location" value="Abfrage: PositionDescription" />
                            <p:inputTextarea id="descriptionPosition" autoResize="true" class="textinput" required="false" counter="display1" maxlength="1000" value="#{mainController.currentPositionDescription}" counterTemplate="{0} Zeichen übrig"/>
                            <h:outputText id="display1" class="display"/>
                            <h:outputText value="#{mainController.currentPositionDescription}" rendered="false"/>

                            <h:outputLabel for="reason" value="Abfrage: Reason" />
                            <p:inputTextarea id="reason" autoResize="true" class="textinput" required="false" counter="display2" maxlength="250" value="#{mainController.currentReason}" counterTemplate="{0} Zeichen übrig"/>
                            <h:outputText id="display2" class="display"/>
                            <h:outputText value="#{mainController.currentReason}" rendered="false"/>


                            <h:outputLabel for="ratingImportance" value="Abfrage: Rating Importance" />
                            <p:selectOneMenu id="ratingImportance" value="#{mainController.currentRatingImportance}" required="false">
                                <f:selectItem itemLabel="Rating Importance" itemValue="0" />
                                <f:selectItem itemLabel="Sehr wichtig" itemValue="4" />
                                <f:selectItem itemLabel="Wichtig" itemValue="3" />
                                <f:selectItem itemLabel="Eher unwichtig" itemValue="2" />
                                <f:selectItem itemLabel="Unwichtig" itemValue="1" />
                            </p:selectOneMenu>
                            <h:outputText value="#{mainController.currentRatingImportance}" rendered="true"/>

                            <h:outputLabel for="numberOfChargingPoints" value="Abfrage: NumberOfChargingPoints" />
                            <p:selectOneMenu id="numberOfChargingPoints" value="#{mainController.currentNumberOfChargingPoints}" required="false">
                                <f:selectItem itemLabel="1" itemValue="1" />
                                <f:selectItem itemLabel="2" itemValue="2" />
                                <f:selectItem itemLabel="3" itemValue="3" />
                                <f:selectItem itemLabel="4" itemValue="4" />
                            </p:selectOneMenu>
                            <h:outputText value="#{mainController.currentNumberOfChargingPoints}" rendered="true"/>

                            <h:outputLabel for="chargingStandard" value="Abfrage: Charging Standard" />
                            <p:selectOneMenu id="chargingStandard" value="#{mainController.currentChargingStandard}" required="false">
                                <f:selectItem itemLabel="ChaDeMo" itemValue="ChaDeMo" />
                                <f:selectItem itemLabel="CCS" itemValue="CCS" />
                                <f:selectItem itemLabel="Typ3" itemValue="Typ3" />
                                <f:selectItem itemLabel="Typ2" itemValue="Typ2" />
                                <f:selectItem itemLabel="HPC" itemValue="HPC" />
                                <f:selectItem itemLabel="keine Angabe" itemValue="ka" />
                            </p:selectOneMenu>
                            <h:outputText value="" rendered="true"/>

                            <h:outputLabel for="rating1" value="Abfrage: Rating 1" />
                            <p:inputTextarea id="rating1" class="textinput" required="false" counter="display3" maxlength="250" value="#{mainController.currentRating1}" counterTemplate="Noch {0} Zeichen"/>
                            <h:outputText id="display3" class="display"/>
                            <h:outputText value="#{mainController.currentRating1}" rendered="false"/>

                            <h:outputLabel for="rating2" value="Abfrage: Rating 2" />
                            <p:inputTextarea id="rating2" class="textinput" required="false" counter="display4" maxlength="250" value="#{mainController.currentRating2}" counterTemplate="Noch {0} Zeichen"/>
                            <h:outputText id="display4" class="display"/>
                            <h:outputText value="#{mainController.currentRating2}" rendered="false"/>

                            <h:outputLabel for="rating3" value="Abfrage: Rating 3" />
                            <p:inputTextarea id="rating3" class="textinput" required="false" counter="display5" maxlength="250" value="#{mainController.currentRating3}" counterTemplate="Noch {0} Zeichen"/>
                            <h:outputText id="display5" class="display"/>
                            <h:outputText value="#{mainController.currentRating3}" rendered="false"/>

                            <!-->This commandbutton does not execute the methodExpression<-->
                            <p:commandButton value="Submit" update="form1" icon="ui-icon-check" rendered="true" id="button1" actionListener="#{mainController.saveData}"/>
                            <p:commandButton type="reset" value="Cancel" onclick="return cancel()"/>
                        </h:panelGrid>
                        <h:inputHidden value="#{mainController.currentId}" />

                    </h:form>

                </p:dialog >   
            </p:layoutUnit>

        </p:layout>

    </h:body>


</html>

【问题讨论】:

  • 我没有直接看到任何错误,但我无法完全评估它。你能创建一个mcve 吗?因此,将 xhtml 减少到最低限度,并发布相关的 bean(但也是最低限度)
  • 您使用的是哪个 JSF/PF 版本? appendTo="body" 在我看来是错误的,应该是 appendTo="@(body)",但不知道能否解决
  • 嗨 Jaqen,这是我解决打开对话框也被背景窗口模糊的问题的解决方法。非primefaces的解决方案是设置appendToBody="true",但是这个属性在primefaces对话框中已经过时了。你的解决方案也适用,这对我来说似乎更干净,我改变了它......谢谢
  • 感谢@BalusC 向我展示了我的问题已经得到解决的线程的链接。查看线程中的要点 5 解决了我的问题。我在表单中有一些组件设置为 render="false",还有 2 个 inputtexts 设置为 disabled="true"。我对表单提交过程的理解仍然不足以理解为什么这会阻止命令按钮执行动作监听器,有人可以解释一下吗?
  • 防范黑客操纵 HTTP 请求以模拟启用/呈现的按钮或输入。

标签: jsf primefaces commandbutton


【解决方案1】:

我在您的代码中发现了两个问题。

  1. 您应该使用 styleClass 属性,它是容器元素的 Style 类,而不是 class。
  2. 在您的 xhtml 代码中找不到位置 ID。

由于您没有发布托管 bean,因此我无法说明您的问题。但是,我尝试自己创建托管bean,如下所示。它工作正常。

xhtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

    <h:head>
        <f:facet name="first">
            <meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
            <title>Title</title>
        </f:facet>

        <style>

        </style>
    </h:head>

    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
    <script>

    </script>

    <h:body id="body">

        <p:growl id="growl" showDetail="true" />

        <p:layout fullPage="true">

            <p:layoutUnit position="north" size="100" resizable="true" closable="true" collapsible="true">
                Ihre Aufgabe besteht darin, 5 Ladesäulen zu setzten wo es ihnen gefällt auf der Karte.
            </p:layoutUnit>

            <p:layoutUnit position="south" size="175">                
                <h:outputLabel id="outp" value="#{mainController.testparam}" />
            </p:layoutUnit>

            <p:layoutUnit position="west" size="175" collapsible="true">

            </p:layoutUnit>

            <p:layoutUnit position="center" id='idcenter'>

                <div id="map-canvas"></div>   
                <p:commandButton value="Basic" type="button" onclick="PF('dlg').show();" />
                <p:dialog id="dlg" modal="true" closeOnEscape="false" 
                          fitViewport="true" widgetVar="dlg" 
                          closable="false" resizable="false" 
                          width="50%" minWidth="500" appendTo="body">
                    <!--><h:form prependId="false" onsubmit="return cancel()"><-->

                    <h:form prependId="false" id="form1">                        
                        <h:panelGrid columns="3" cellpadding="10">
                            <h:outputLabel for="xfield" value="Koordinaten" />
                            <h:inputText disabled="true" id="xfield" 
                                         value="#{mainController.currentXCoordinate}"/>
                            <h:inputText disabled="true" id="yfield" 
                                         value="#{mainController.currentYCoordinate}"/>


                            <h:outputLabel for="descriptionPosition" 
                                           value="Abfrage: PositionDescription" />
                            <p:inputTextarea id="descriptionPosition" 
                                             autoResize="true" styleClass="textinput" 
                                             required="false" counter="display1" 
                                             maxlength="1000" 
                                             value="#{mainController.currentPositionDescription}" 
                                             counterTemplate="{0} Zeichen übrig"/>
                            <h:outputText id="display1" styleClass="display"/>
                            <h:outputText value="#{mainController.currentPositionDescription}" 
                                          rendered="false"/>

                            <h:outputLabel for="reason" value="Abfrage: Reason" />
                            <p:inputTextarea id="reason" autoResize="true" styleClass="textinput" 
                                             required="false" counter="display2" maxlength="250" 
                                             value="#{mainController.currentReason}" 
                                             counterTemplate="{0} Zeichen übrig"/>
                            <h:outputText id="display2" styleClass="display"/>
                            <h:outputText value="#{mainController.currentReason}" 
                                          rendered="false"/>


                            <h:outputLabel for="ratingImportance" 
                                           value="Abfrage: Rating Importance" />
                            <p:selectOneMenu id="ratingImportance" 
                                             value="#{mainController.currentRatingImportance}" 
                                             required="false">
                                <f:selectItem itemLabel="Rating Importance" itemValue="0" />
                                <f:selectItem itemLabel="Sehr wichtig" itemValue="4" />
                                <f:selectItem itemLabel="Wichtig" itemValue="3" />
                                <f:selectItem itemLabel="Eher unwichtig" itemValue="2" />
                                <f:selectItem itemLabel="Unwichtig" itemValue="1" />
                            </p:selectOneMenu>
                            <h:outputText value="#{mainController.currentRatingImportance}" 
                                          rendered="true"/>

                            <h:outputLabel for="numberOfChargingPoints" 
                                           value="Abfrage: NumberOfChargingPoints" />
                            <p:selectOneMenu id="numberOfChargingPoints" 
                                             value="#{mainController.currentNumberOfChargingPoints}" 
                                             required="false">
                                <f:selectItem itemLabel="1" itemValue="1" />
                                <f:selectItem itemLabel="2" itemValue="2" />
                                <f:selectItem itemLabel="3" itemValue="3" />
                                <f:selectItem itemLabel="4" itemValue="4" />
                            </p:selectOneMenu>
                            <h:outputText value="#{mainController.currentNumberOfChargingPoints}" 
                                          rendered="true"/>

                            <h:outputLabel for="chargingStandard" 
                                           value="Abfrage: Charging Standard" />
                            <p:selectOneMenu id="chargingStandard" 
                                             value="#{mainController.currentChargingStandard}" 
                                             required="false">
                                <f:selectItem itemLabel="ChaDeMo" itemValue="ChaDeMo" />
                                <f:selectItem itemLabel="CCS" itemValue="CCS" />
                                <f:selectItem itemLabel="Typ3" itemValue="Typ3" />
                                <f:selectItem itemLabel="Typ2" itemValue="Typ2" />
                                <f:selectItem itemLabel="HPC" itemValue="HPC" />
                                <f:selectItem itemLabel="keine Angabe" itemValue="ka" />
                            </p:selectOneMenu>
                            <h:outputText value="" rendered="true"/>

                            <h:outputLabel for="rating1" value="Abfrage: Rating 1" />
                            <p:inputTextarea id="rating1" styleClass="textinput" 
                                             required="false" counter="display3" 
                                             maxlength="250" value="#{mainController.currentRating1}" 
                                             counterTemplate="Noch {0} Zeichen"/>
                            <h:outputText id="display3" styleClass="display"/>
                            <h:outputText value="#{mainController.currentRating1}" 
                                          rendered="false"/>

                            <h:outputLabel for="rating2" value="Abfrage: Rating 2" />
                            <p:inputTextarea id="rating2" styleClass="textinput" 
                                             required="false" counter="display4" 
                                             maxlength="250" value="#{mainController.currentRating2}" 
                                             counterTemplate="Noch {0} Zeichen"/>
                            <h:outputText id="display4" styleClass="display"/>
                            <h:outputText value="#{mainController.currentRating2}" 
                                          rendered="false"/>

                            <h:outputLabel for="rating3" value="Abfrage: Rating 3" />
                            <p:inputTextarea id="rating3" styleClass="textinput" 
                                             required="false" counter="display5" 
                                             maxlength="250" value="#{mainController.currentRating3}" 
                                             counterTemplate="Noch {0} Zeichen"/>
                            <h:outputText id="display5" styleClass="display"/>
                            <h:outputText value="#{mainController.currentRating3}" rendered="false"/>

                            <!-->This commandbutton does not execute the methodExpression<-->
                            <p:commandButton value="Submit" update="@form" icon="ui-icon-check" 
                                             rendered="true" id="button1" 
                                             actionListener="#{mainController.saveData}"/>
                            <p:commandButton type="reset" value="Cancel" 
                                             onclick="return cancel()"/>
                        </h:panelGrid>
                        <h:inputHidden value="#{mainController.currentId}" />

                    </h:form>

                </p:dialog >   
            </p:layoutUnit>

        </p:layout>
    </h:body>
</html>

托管光束

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.sample.view;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Wittakarn
 */
@ViewScoped
@ManagedBean(name = "mainController")
public class MainController implements Serializable {
    private String testparam;
    private String currentXCoordinate;
    private String currentYCoordinate;
    private String currentPositionDescription;
    private String currentReason;
    private String currentRatingImportance;
    private String currentNumberOfChargingPoints;
    private String currentChargingStandard;
    private String currentRating1;
    private String currentRating2;
    private String currentRating3;
    private String currentId;

    public MainController(){}

    public String getTestparam() {
        return testparam;
    }

    public void setTestparam(String testparam) {
        this.testparam = testparam;
    }

    public String getCurrentXCoordinate() {
        return currentXCoordinate;
    }

    public void setCurrentXCoordinate(String currentXCoordinate) {
        this.currentXCoordinate = currentXCoordinate;
    }

    public String getCurrentYCoordinate() {
        return currentYCoordinate;
    }

    public void setCurrentYCoordinate(String currentYCoordinate) {
        this.currentYCoordinate = currentYCoordinate;
    }

    public String getCurrentPositionDescription() {
        return currentPositionDescription;
    }

    public void setCurrentPositionDescription(String currentPositionDescription) {
        this.currentPositionDescription = currentPositionDescription;
    }

    public String getCurrentReason() {
        return currentReason;
    }

    public void setCurrentReason(String currentReason) {
        this.currentReason = currentReason;
    }

    public String getCurrentRatingImportance() {
        return currentRatingImportance;
    }

    public void setCurrentRatingImportance(String currentRatingImportance) {
        this.currentRatingImportance = currentRatingImportance;
    }

    public String getCurrentNumberOfChargingPoints() {
        return currentNumberOfChargingPoints;
    }

    public void setCurrentNumberOfChargingPoints(String currentNumberOfChargingPoints) {
        this.currentNumberOfChargingPoints = currentNumberOfChargingPoints;
    }

    public String getCurrentChargingStandard() {
        return currentChargingStandard;
    }

    public void setCurrentChargingStandard(String currentChargingStandard) {
        this.currentChargingStandard = currentChargingStandard;
    }

    public String getCurrentRating1() {
        return currentRating1;
    }

    public void setCurrentRating1(String currentRating1) {
        this.currentRating1 = currentRating1;
    }

    public String getCurrentRating2() {
        return currentRating2;
    }

    public void setCurrentRating2(String currentRating2) {
        this.currentRating2 = currentRating2;
    }

    public String getCurrentRating3() {
        return currentRating3;
    }

    public void setCurrentRating3(String currentRating3) {
        this.currentRating3 = currentRating3;
    }

    public String getCurrentId() {
        return currentId;
    }

    public void setCurrentId(String currentId) {
        this.currentId = currentId;
    }

    public void saveData(ActionEvent event){
        System.out.println("saveData");
    }
}

【讨论】:

  • 嘿@wittakarn,感谢有关“类”属性的建议,我会改变它。我删除了位置 ID,这是我之前忘记的一些尝试和错误的产物,令人惊讶的是它并没有影响任何东西。我没有发布 bean,因为正如您刚刚通过重建它所证明的那样:),它是一个微不足道的 bean,我确信它没有故障......
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多