命令按钮/commandLink/ajax行动/侦听法未援引或输入的价值不设置/更新
-
22-09-2019 - |
题
有时,当使用 <h:commandLink>
, <h:commandButton>
或 <f:ajax>
, , action
, actionListener
或 listener
方法与标签相关的是根本没有被援引。或者,bean properties不更新与提交 UIInput
值。
有什么可能的原因和解决方案的这个?
解决方案
介绍
每当一个 UICommand
组成(<h:commandXxx>
, <p:commandXxx>
, 等等)不援引相关行动的方法,或 UIInput
组成(<h:inputXxx>
, <p:inputXxxx>
, 等)无法处理所提交的数值和/或更新的模式的价值,你没有看到任何googlable例外和/或警告的服务器登录,也不配置阿贾克斯例外处理程序,为每 例外处理中JSF阿贾克斯的请求, 也不在你下面设置下参数 web.xml
,
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
并且你也没有看到任何googlable错误和/或警告的浏览器的JavaScript控制台(按F12在铬/Firefox23+/IE9打开网络开发工具和随后打开 控制台 卡),然后工作,通过下列可能的原因。
可能的原因
UICommand
和UIInput
组成部分必须被放置在一个UIForm
组件,例如<h:form>
(并因此不纯HTML<form>
),否则没有什么可以送到服务器。UICommand
组件必须也没有type="button"
属性,否则它将是一个死的按钮,这是只适用于JavaScriptonclick
.也参看 怎么送的形式输入的价值观和调用一种方法在JSF豆 和 <h:commandButton> 没有发起一回.你不能巢多
UIForm
每个部件的其他。这是非法的,在HTML。浏览器的行为是不确定的。看出包括文件!你可以使用UIForm
组并行进行,但是他们不会进程期间提交。你也应该看出来的"上帝的形式"反模式;确保你不会无意中处理验证的所有其他(无形的)的投入非常相同的形式(例如具有一种隐藏的对话与需要投入非常相同的形式)。也参看 如何使用 <h:form> 在JSF页?单的形式?多种形式吗?嵌套的形式?.没有
UIInput
值验证/换算错误,应该有发生。你可以使用<h:messages>
以显示任何消息都没显示任何输入特定的<h:message>
组成。不要忘记包括id
的<h:messages>
在<f:ajax render>
, 如果任,因此,它将更新以及在阿贾克斯的请求。也参看 h:消息不会显示的消息时,p:命令按钮被按下时.如果
UICommand
或UIInput
组件放在一个迭代分等<h:dataTable>
,<ui:repeat>
, 等等,那么你需要保证完全相同的value
的迭代分是被保存在适用于要求的价值观相的形式提交请求。JSF会重申,在它找到的点击的链接/按钮和提交的输入值。把豆景的范围和/或确保你负荷的数据模型@PostConstruct
bean(并因此不在吸气的方法!) 应该解决它。也参看 如何以及何时我应该载模式从数据库,用于h:数据表.如果
UICommand
或UIInput
组件都包括通过一个动态的来源,例如<ui:include src="#{bean.include}">
, 然后你需要保证完全相同的#{bean.include}
值,是保存在图建立时的形式提交请求。JSF会重新执行它在建设本组树。把豆景的范围和/或确保你负荷的数据模型@PostConstruct
bean(并因此不在吸气的方法!) 应该解决它。也参看 如何阿贾克斯刷新动态的内容包括导航菜单吗?(JSF SPA).的
rendered
属性的组成及其所有父母的test
属性的任何父母<c:if>
/<c:when>
不应该评估来false
在申请要求的价值观相的形式提交请求。JSF将重新检查它的一部分作为防止篡改/砍死的请求。储存的变量负责的状态中@ViewScoped
豆或确保你们正常preinitializing的条件@PostConstruct
的@RequestScoped
豆应该解决它。这同样适用于disabled
属性的成分,这不应该评估来true
在申请要求的价值观的阶段。也参看 JSF的命令按钮行动不会调用 和 形式提交有条件地呈现部分不处理.的
onclick
属性的UICommand
组件和onsubmit
属性的UIForm
分不应返回false
或导致的一JavaScript错误。应该在情况下<h:commandLink>
或<f:ajax>
还是没有JS错误可见于浏览器的JS控制台。通常在谷歌上搜索具体的错误信息已经给你答案。也参看 加jQuery PrimeFaces结果在未捕获的类.如果你使用的Ajax通过JSF2.x
<f:ajax>
或如PrimeFaces<p:commandXxx>
, 确保你有一个<h:head>
在主的模板,而不是的<head>
.否则JSF不能自动包括必要的JavaScript文件,其中包含的Ajax功能。这将导致在a JavaScript错误,如"mojarra没有定义"或"PrimeFaces不是定义的"在浏览器的JS控制台。也参看 h:commandLink actionlistener是没有援引当使用f:阿贾克斯和用户界面:重复.如果你使用的Ajax,所提交的价值观结束
null
, 然后确保UIInput
和UICommand
感兴趣的组件所涵盖的<f:ajax execute>
或如<p:commandXxx process>
, 否则他们不会被执行/行处理。也参看 提交形式的价值不更新模式的时候加入 <f:ajax> 要 <h:commandButton> 和 了解PrimeFaces处理/更新和JSF f:阿贾克斯执行/呈现的属性.如果提交的价值最终还是正在
null
, 和你在使用土发委会管理的豆类,那么确保你进口的范围注从正确包装,否则,土发委会将默认@Dependent
这有效地再现了豆的每一个评价EL表达。也参看 @SessionScoped豆丢失的范围和获取重建的所有的时间,田变空 和 什么是默认的托豆范围中的一个JSF2应用程序?如果父母的
<h:form>
与UICommand
按钮是事先已经呈现的/更新了由阿贾克斯的请求来自另一种形式,在同一页上,然后第一个行动会永远失败JSF2.2或老年人。第二和后续行动会的工作。这是由一个错误鉴于国家处理其报告为 JSF规范问题790 目前固定在JSF2.3.老年JSF的版本,需要明确指定的ID<h:form>
在render
的<f:ajax>
.也参看 h:commandButton/h:commandLink 不工作上的第一次点击,仅在第二击.如果的
<h:form>
已enctype="multipart/form-data"
设置为了支持文件上载,那么你就需要确保在使用的至少JSF2.2,或servlet过滤谁是负责分析multipart/form-data请求是适当配置,否则FacesServlet
最终会没有得到请求的参数,在所有,因此不能申请该请求值。如何配置这样一个过滤取决于文件上传的成分在被使用。对于战斧<t:inputFileUpload>
, 检查 这个答案 和PrimeFaces<p:fileUpload>
, 检查 这个答案.或者,如果你实际上不上传文件,然后删除的属性。确保
ActionEvent
参数actionListener
是一个javax.faces.event.ActionEvent
因此不java.awt.event.ActionEvent
, ,这是大多数IDEs建议作为第1次自动完成的选择。有没有说法是错误的,以及如果您使用actionListener="#{bean.method}"
.如果你不想的参数,在你的方法,使用actionListener="#{bean.method()}"
.或许你真的想要使用action
而不是的actionListener
.也参看 差异之间的行动和actionListener.确保没有
PhaseListener
或任何EventListener
在请求的响应链已经改变了JSF生命周期以跳过调用行动阶段通过例如呼叫FacesContext#renderResponse()
或FacesContext#responseComplete()
.确保没有
Filter
或Servlet
在同样的请求-回应链已经封锁的请求foFacesServlet
不知何故。如果您使用的是一个PrimeFaces
<p:dialog>
或<p:overlayPanel>
, ,然后确保他们有自己的<h:form>
.因为,这些组成部分是通过默认通过的JavaScript搬迁到底HTML<body>
.所以,如果它们最初是坐在里面<form>
, 然后他们现在不再坐在一个<form>
.也参看 p:命令按钮的行动不起作用的内部p:对话错误的框架。例如,RichFaces有一个"转换的错误"当使用
rich:calendar
UI元素defaultLabel
属性(或者,在某些情况下,rich:placeholder
子元件)。这个错误防止豆方法被援引时不值设定为日历上的日期。跟踪框架的错误可以通过开始一个简单的工作实例和建立网页回,直到该错误被发现。
调试暗示
在情况下,你仍然被堵塞,它的时间来调试。在客户面,按F12在网页浏览器来开放的网络开发工具。击 控制台 卡所看到的JavaScript conosle.它应该是免费的任何JavaScript错误。下面截图是一个例子镀铬,这证明的情况下提交 <f:ajax>
启按钮的话,不具有 <h:head>
宣布(如在7点以上)。
击 网络 签见HTTP交通监视器。提交形式和调查,如果该请求的标题和形式的数据和响应的主体是作为每期望。下面截图是一个例从铬,这表明了一个成功的阿贾克斯提交的一个简单的形式与一个单一的 <h:inputText>
和一个单一的 <h:commandButton>
与 <f:ajax execute="@form" render="@form">
.
(注:当你发布的截图从HTTP request headers如上所述,从一个生产环境中,然后确保你抢/混淆,任何一届会议饼干的截图,以避免会议被劫持的攻击!)
在服务器,确保服务器启动,在调试模式。把一个调试断点的一种方法的JSF的组成部分的利息,你期望在处理的形式提交。E.g。在情况下 UICommand
成分,那将是 UICommand#queueEvent()
在情况下 UIInput
成分,那将是 UIInput#validate()
.只是一步通过执行代码和检查,如果流和变量,作为每期望。下面截图是一个例从蚀的调试器。
其他提示
如果您h:commandLink
是h:dataTable
里面还有另外一个原因h:commandLink
可能无法正常工作:
其被结合至h:dataTable
底层数据源也必须在第二JSF的生命周期可用链接被点击时所触发。
因此,如果底层数据源被请求范围,则h:commandLink
不起作用!
虽然我的答案是不是100%适用,但大多数搜索引擎找到这是第一次打,我决定将它张贴nontheless:
如果你使用的 PrimeFaces (或一些类似的API)p:commandButton
或p:commandLink
,很可能你已经忘记了明确添加process="@this"
到命令组件。
由于PrimeFaces用户指南中第3.18节规定,为process
和update
默认值都是@form
,这非常反对你可能期望从普通的JSF f:ajax
或RichFaces的默认值,分别是execute="@this"
和render="@none"
。
只是把我一个looong时间找出来。 (......我认为这是相当unclever到使用默认值是由JSF不同!)
我想提一件事的关切Primefaces的 p:commandButton
!
当你使用 p:commandButton
为行动,需要在服务器上进行的,不能使用 type="button"
因为那是 推动按钮 这是用来执行定javascript不引起的ajax/非ajax请求到服务器。
为此目的,你可以分配 type
属性(默认值 "submit"
)或者你可以明确使用 type="submit"
.
希望这将帮助别人!
卡住了这个问题我自己,发现多了一个原因这个问题。 如果您没有在您的支持Bean在* .xhtml使用的属性setter方法,那么行动是根本不被调用。
我最近跑进使用IBM扩展Faces组件。
在JSF 1.2应用一个UICommand不调用一个问题我曾在一个数据表中的行的命令按钮(扩展版本,所以<hx:datatable>
)和UICommand不会从表中的某些行(行火即不会火灾比默认行显示更大的行尺寸)。
我有用于选择的行数,以显示一个下拉部件。支持此字段的值是RequestScope
。所述的数据备份表本身是一种ViewScope
的(在现实中,在暂时SessionScope
)。
如果该行显示了通过该值也被绑定到数据表中的属性rows
控制增大,无行点击时显示为这种变化可能触发UICommand的结果。
放置该属性在相同的范围作为表格数据自身固定的问题。
我认为这是在BalusC#4以上提到的,但不仅没有表值需要被查看或会话范围也是属性控制的行数,以显示在该表上。
我有这个问题,因为开放浏览器的Web控制台后良好,才真正开始磨练的根本原因。在那之前,我无法得到任何错误消息(即使<p:messages>
)。 web控制台显示从<h:commandButton type="submit" action="#{myBean.submit}">
回来一个HTTP 405状态代码。
在我的情况,我必须通过Auth0和JSF的Facelets和执行我的应用程序视图和业务逻辑bean香草的HttpServlet的提供OAuth认证的混合。
在我重构我的web.xml文件,并删除中间人-的servlet,它再“神奇”的工作。
底线,该问题是,中间人-的servlet使用调用RequestDispatcher.forward(...)从所述的HttpServlet环境到JSF环境而servlet的重定向被调用之前,将其用HttpServletResponse.sendRedirect重定向(......)。
基本上,使用的sendRedirect()所允许的JSF “容器” 采取控制而调用RequestDispatcher.forward()明显不
我不知道是为什么的facelet能够访问bean的属性,但不能设置它们,这清楚地尖叫与servlet和JSF的结构做了,但我希望这可以帮助别人避免许多小时的头 - 表拆裂。
我有很多乐趣的调试,其中一个<h:commandLink>
在richfaces
datatable
行动拒绝火灾的问题。该表用于工作在某些时候却停止没有明显的原因。我想尽一切办法,才发现,我的rich:datatable
使用,它返回的RichFaces愉快地作为行键空错rowKeyConverter
。这防止了我的<h:commandLink>
作用从获取调用。
还有一个可能性:如果症状是第一次调用的作品,但随后那些不这样做,你可以使用PrimeFaces 3.x中与JSF 2.2,如下详述:的否ViewState是发送。
我已修正问题放置:
<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
在:
<h:form>
<h:commandButton class="btn btn-danger" value = "Remove" action="#{deleteEmployeeBean.delete}"></h:commandButton>
</h:form>
<ui:composition>
<h:form id="form1">
<p:dialog id="dialog1">
<p:commandButton value="Save" action="#{bean.method1}" /> <!--Working-->
</p:dialog>
</h:form>
<h:form id="form2">
<p:dialog id="dialog2">
<p:commandButton value="Save" action="#{bean.method2}" /> <!--Not Working-->
</p:dialog>
</h:form>
</ui:composition>
要解决;
<ui:composition>
<h:form id="form1">
<p:dialog id="dialog1">
<p:commandButton value="Save" action="#{bean.method1}" /> <!-- Working -->
</p:dialog>
<p:dialog id="dialog2">
<p:commandButton value="Save" action="#{bean.method2}" /> <!--Working -->
</p:dialog>
</h:form>
<h:form id="form2">
<!-- .......... -->
</h:form>
</ui:composition>