【发布时间】: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