有时,当使用 <h:commandLink>, <h:commandButton><f:ajax>, , action, actionListenerlistener 方法与标签相关的是根本没有被援引。或者,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打开网络开发工具和随后打开 控制台 卡),然后工作,通过下列可能的原因。

可能的原因

  1. UICommandUIInput 组成部分必须被放置在一个 UIForm 组件,例如 <h:form> (并因此不纯HTML <form>),否则没有什么可以送到服务器。 UICommand 组件必须也没有 type="button" 属性,否则它将是一个死的按钮,这是只适用于JavaScript onclick.也参看 怎么送的形式输入的价值观和调用一种方法在JSF豆<h:commandButton> 没有发起一回.

  2. 你不能巢多 UIForm 每个部件的其他。这是非法的,在HTML。浏览器的行为是不确定的。看出包括文件!你可以使用 UIForm 组并行进行,但是他们不会进程期间提交。你也应该看出来的"上帝的形式"反模式;确保你不会无意中处理验证的所有其他(无形的)的投入非常相同的形式(例如具有一种隐藏的对话与需要投入非常相同的形式)。也参看 如何使用 <h:form> 在JSF页?单的形式?多种形式吗?嵌套的形式?.

  3. 没有 UIInput 值验证/换算错误,应该有发生。你可以使用 <h:messages> 以显示任何消息都没显示任何输入特定的 <h:message> 组成。不要忘记包括 id<h:messages><f:ajax render>, 如果任,因此,它将更新以及在阿贾克斯的请求。也参看 h:消息不会显示的消息时,p:命令按钮被按下时.

  4. 如果 UICommandUIInput 组件放在一个迭代分等 <h:dataTable>, <ui:repeat>, 等等,那么你需要保证完全相同的 value 的迭代分是被保存在适用于要求的价值观相的形式提交请求。JSF会重申,在它找到的点击的链接/按钮和提交的输入值。把豆景的范围和/或确保你负荷的数据模型 @PostConstruct bean(并因此不在吸气的方法!) 应该解决它。也参看 如何以及何时我应该载模式从数据库,用于h:数据表.

  5. 如果 UICommandUIInput 组件都包括通过一个动态的来源,例如 <ui:include src="#{bean.include}">, 然后你需要保证完全相同的 #{bean.include} 值,是保存在图建立时的形式提交请求。JSF会重新执行它在建设本组树。把豆景的范围和/或确保你负荷的数据模型 @PostConstruct bean(并因此不在吸气的方法!) 应该解决它。也参看 如何阿贾克斯刷新动态的内容包括导航菜单吗?(JSF SPA).

  6. rendered 属性的组成及其所有父母的 test 属性的任何父母 <c:if>/<c:when> 不应该评估来 false 在申请要求的价值观相的形式提交请求。JSF将重新检查它的一部分作为防止篡改/砍死的请求。储存的变量负责的状态中 @ViewScoped 豆或确保你们正常preinitializing的条件 @PostConstruct@RequestScoped 豆应该解决它。这同样适用于 disabled 属性的成分,这不应该评估来 true 在申请要求的价值观的阶段。也参看 JSF的命令按钮行动不会调用形式提交有条件地呈现部分不处理.

  7. onclick 属性的 UICommand 组件和 onsubmit 属性的 UIForm 分不应返回 false 或导致的一JavaScript错误。应该在情况下 <h:commandLink><f:ajax> 还是没有JS错误可见于浏览器的JS控制台。通常在谷歌上搜索具体的错误信息已经给你答案。也参看 加jQuery PrimeFaces结果在未捕获的类.

  8. 如果你使用的Ajax通过JSF2.x <f:ajax> 或如PrimeFaces <p:commandXxx>, 确保你有一个 <h:head> 在主的模板,而不是的 <head>.否则JSF不能自动包括必要的JavaScript文件,其中包含的Ajax功能。这将导致在a JavaScript错误,如"mojarra没有定义"或"PrimeFaces不是定义的"在浏览器的JS控制台。也参看 h:commandLink actionlistener是没有援引当使用f:阿贾克斯和用户界面:重复.

  9. 如果你使用的Ajax,所提交的价值观结束 null, 然后确保 UIInputUICommand 感兴趣的组件所涵盖的 <f:ajax execute> 或如 <p:commandXxx process>, 否则他们不会被执行/行处理。也参看 提交形式的价值不更新模式的时候加入 <f:ajax> 要 <h:commandButton>了解PrimeFaces处理/更新和JSF f:阿贾克斯执行/呈现的属性.

  10. 如果提交的价值最终还是正在 null, 和你在使用土发委会管理的豆类,那么确保你进口的范围注从正确包装,否则,土发委会将默认 @Dependent 这有效地再现了豆的每一个评价EL表达。也参看 @SessionScoped豆丢失的范围和获取重建的所有的时间,田变空什么是默认的托豆范围中的一个JSF2应用程序?

  11. 如果父母的 <h:form>UICommand 按钮是事先已经呈现的/更新了由阿贾克斯的请求来自另一种形式,在同一页上,然后第一个行动会永远失败JSF2.2或老年人。第二和后续行动会的工作。这是由一个错误鉴于国家处理其报告为 JSF规范问题790 目前固定在JSF2.3.老年JSF的版本,需要明确指定的ID <h:form>render<f:ajax>.也参看 h:commandButton/h:commandLink 不工作上的第一次点击,仅在第二击.

  12. 如果的 <h:form>enctype="multipart/form-data" 设置为了支持文件上载,那么你就需要确保在使用的至少JSF2.2,或servlet过滤谁是负责分析multipart/form-data请求是适当配置,否则 FacesServlet 最终会没有得到请求的参数,在所有,因此不能申请该请求值。如何配置这样一个过滤取决于文件上传的成分在被使用。对于战斧 <t:inputFileUpload>, 检查 这个答案 和PrimeFaces <p:fileUpload>, 检查 这个答案.或者,如果你实际上不上传文件,然后删除的属性。

  13. 确保 ActionEvent 参数 actionListener 是一个 javax.faces.event.ActionEvent 因此不 java.awt.event.ActionEvent, ,这是大多数IDEs建议作为第1次自动完成的选择。有没有说法是错误的,以及如果您使用 actionListener="#{bean.method}".如果你不想的参数,在你的方法,使用 actionListener="#{bean.method()}".或许你真的想要使用 action 而不是的 actionListener.也参看 差异之间的行动和actionListener.

  14. 确保没有 PhaseListener 或任何 EventListener 在请求的响应链已经改变了JSF生命周期以跳过调用行动阶段通过例如呼叫 FacesContext#renderResponse()FacesContext#responseComplete().

  15. 确保没有 FilterServlet 在同样的请求-回应链已经封锁的请求fo FacesServlet 不知何故。

  16. 如果您使用的是一个PrimeFaces <p:dialog><p:overlayPanel>, ,然后确保他们有自己的 <h:form>.因为,这些组成部分是通过默认通过的JavaScript搬迁到底HTML <body>.所以,如果它们最初是坐在里面 <form>, 然后他们现在不再坐在一个 <form>.也参看 p:命令按钮的行动不起作用的内部p:对话

  17. 错误的框架。例如,RichFaces有一个"转换的错误"当使用 rich:calendar UI元素 defaultLabel 属性(或者,在某些情况下, rich:placeholder 子元件)。这个错误防止豆方法被援引时不值设定为日历上的日期。跟踪框架的错误可以通过开始一个简单的工作实例和建立网页回,直到该错误被发现。

调试暗示

在情况下,你仍然被堵塞,它的时间来调试。在客户面,按F12在网页浏览器来开放的网络开发工具。击 控制台 卡所看到的JavaScript conosle.它应该是免费的任何JavaScript错误。下面截图是一个例子镀铬,这证明的情况下提交 <f:ajax> 启按钮的话,不具有 <h:head> 宣布(如在7点以上)。

js console

网络 签见HTTP交通监视器。提交形式和调查,如果该请求的标题和形式的数据和响应的主体是作为每期望。下面截图是一个例从铬,这表明了一个成功的阿贾克斯提交的一个简单的形式与一个单一的 <h:inputText> 和一个单一的 <h:commandButton><f:ajax execute="@form" render="@form">.

network monitor

(注:当你发布的截图从HTTP request headers如上所述,从一个生产环境中,然后确保你抢/混淆,任何一届会议饼干的截图,以避免会议被劫持的攻击!)

在服务器,确保服务器启动,在调试模式。把一个调试断点的一种方法的JSF的组成部分的利息,你期望在处理的形式提交。E.g。在情况下 UICommand 成分,那将是 UICommand#queueEvent() 在情况下 UIInput 成分,那将是 UIInput#validate().只是一步通过执行代码和检查,如果流和变量,作为每期望。下面截图是一个例从蚀的调试器。

debug server

其他提示

如果您h:commandLinkh:dataTable里面还有另外一个原因h:commandLink可能无法正常工作:

其被结合至h:dataTable底层数据源也必须在第二JSF的生命周期可用链接被点击时所触发。

因此,如果底层数据源被请求范围,则h:commandLink不起作用!

虽然我的答案是不是100%适用,但大多数搜索引擎找到这是第一次打,我决定将它张贴nontheless:

如果你使用的 PrimeFaces (或一些类似的API)p:commandButtonp:commandLink,很可能你已经忘记了明确添加process="@this"到命令组件。

由于PrimeFaces用户指南中第3.18节规定,为processupdate默认值都是@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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top