jsf – commandButton/commandLink/ajax未调用的action/listener方法或未更新的输入值

前端之家收集整理的这篇文章主要介绍了jsf – commandButton/commandLink/ajax未调用的action/listener方法或未更新的输入值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有时,当使用,或< f:ajax&gt ;,与标记相关联的action,actionListener或listener方法根本不会被调用。或者,不使用提交的UIInput值更新bean属性

这是什么可能的原因和解决方案?

介绍

每当UICommand组件(,

等)无法调用相关联的动作方法或UIInput组件(,< p:inputXxxx&无法处理提交的值和/或更新模型值,并且您在服务器日志中没有看到任何可检测的异常和/或警告,也不会在您按照Exception handling in JSF ajax requests配置ajax异常处理程序时或在您设置以下时web.xml中的上下文参数,

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

而且您在浏览器的JavaScript控制台中也没有看到任何可检测的错误和/或警告(按Chrome / Firefox23 / IE9中的F12打开Web开发人员工具集,然后打开控制台选项卡),然后查看可能原因列表。

可能的原因

> UICommand和UIInput组件必须放在UIForm组件中,例如。 (因此不是普通HTML

),否则什么也不能发送到服务器。 UICommand组件也必须没有type =“button”属性,否则它将是一个死的按钮,只有对JavaScript onclick有用。参见 How to send form input values and invoke a method in JSF bean<h:commandButton> does not initiate a postback
>您不能将多个UIForm组件彼此嵌套。这在HTML中是非法的。浏览器行为未指定。注意包含文件!您可以并行使用UIForm组件,但它们不会在提交过程中相互处理。你也应该注意“上帝形式”反模式;请确保您不会无意地以非常相同的形式处理/验证所有其他(不可见)输入(例如,以非常相同的形式显示具有所需输入的隐藏对话框)。参见 How to use <h:form> in JSF page? Single form? Multiple forms? Nested forms?
>没有发生UIInput值验证/转换错误。您可以使用以显示任何输入特定的组件。不要忘记包含的ID。在中(如果有),以便它也将在ajax请求上更新。参见 h:messages does not display messages when p:commandButton is pressed
>如果UICommand或UIInput组件放置在迭代组件(如,等)内,那么您需要确保在应用请求期间保留了完全相同的迭代组件值values阶段的表单提交请求。 JSF将重复它来找到点击的链接/按钮和提交的输入值。将bean放在视图范围和/或确保您在bean的@PostConstruct中加载数据模型(因此不是在getter方法!)应该解决它。参见 How and when should I load the model from database for h:dataTable
>组件及其所有父对象的呈现属性和任何父对象的测试属性 /不应在表单提交请求的应用请求值阶段期间评估为false。 JSF将重新检查它作为防止篡改/黑客请求的保护措施的一部分。将负责条件的变量存储在@ViewScoped bean中或确保您正确地预初始化@RequestScoped bean的@PostConstruct中的条件应该解决它。这同样适用于组件的disabled属性,在应用请求值阶段期间,该属性不应计算为true。参见 JSF CommandButton action not invokedForm submit in conditionally rendered component is not processed
> UICommand组件的onclick属性和UIForm组件的onsubmit属性不应返回false或导致JavaScript错误。应该在或也没有JS错误在浏览器的JS控制台中可见。通常谷歌的确切的错误消息已经给你答案。参见 Adding jQuery to PrimeFaces results in Uncaught TypeError over all place
>如果你通过JSF 2.x使用Ajax或例如。 PrimeFaces< p:commandXxx&gt ;,请确保您有在主模板中而不是< head&gt ;.否则JSF将无法自动包含包含Ajax函数的必要JavaScript文件。这将导致在浏览器的JS控制台中出现类似“mojarra未定义”或“PrimeFaces未定义”的JavaScript错误。参见 h:commandLink actionlistener is not invoked when used with f:ajax and ui:repeat
>如果您使用的是Ajax,请确保所关注的UIInput和UICommand组件包含在或例如。 < p:commandXxx process&gt ;,否则将不会执行/处理它们。参见 Submitted form values not updated in model when adding <f:ajax> to <h:commandButton>Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes
>如果与UICommand按钮事先被来自同一页面中的另一种形式的ajax请求渲染/更新,则第一个操作将总是失败。第二个和后续动作将工作。这是由视图状态处理中的错误导致的,报告为 JSF spec issue 790,并且当前计划在JSF 2.3中修复。对于较旧的JSF版本,您需要显式指定在的渲染中。参见 h:commandButton/h:commandLink does not work on first click,works only on second click
>如果有enctype =“multipart / form-data”设置为了支持文件上传,那么你需要确保你至少使用JSF 2.2,或者负责解析多部分/表单数据请求的servlet过滤器已正确配置,否则FacesServlet将最终不会获得任何请求参数,因此无法应用请求值。如何配置此类过滤器取决于正在使用的文件上传组件。对于Tomahawk< t:inputFileUpload&gt ;,检查 this answer,对于PrimeFaces< p:fileUpload&gt,检查 this answer.或者,如果实际上没有上传文件
>确保actionListener的ActionEvent参数是javax.faces.event.ActionEvent,因此不是java.awt.event.ActionEvent,这是大多数IDE建议的第一个自动填充选项。没有参数也是错误的,如果你使用actionListener =“#{bean.method}”。如果你不想在你的方法中的参数,使用actionListener =“#{bean.method()}”。或者你真的想使用action而不是actionListener。参见 Differences between action and actionListener
>确保请求 – 响应链中没有PhaseListener或任何EventListener通过调用FacesContext#renderResponse()或FacesContext#responseComplete()来更改JSF生命周期以跳过调用操作阶段。
>确保在同一个请求 – 响应链中没有Filter或Servlet以某种方式阻塞了FacesServlet的请求。
>框架中的Bug。例如,当使用带有defaultLabel属性(或在某些情况下,rich:placeholder子元素)的rich:calendar UI元素时,RichFaces具有“ conversion error”。当没有为日历日期设置值时,此错误阻止调用bean方法。跟踪框架错误可以通过开始一个简单的工作示例和建立页面,直到发现错误来完成。

调试提示

如果你仍然坚持,是时候调试。在客户端,在webbrowser中按F12以打开Web开发人员工具集。单击控制台选项卡,查看JavaScript conosle。它应该没有任何JavaScript错误。下面的截图是Chrome中的一个示例,演示了提交启用按钮,而不具有 (如上文第7点所述)。

单击网络选项卡以查看HTTP流量监控器。提交表单,调查请求标题,表单数据和响应正文是否符合预期。下面的截图是来自Chrome的一个例子,演示了一个成功的ajax提交一个简单的表单与单个和单个与< f:ajax execute =“@ form”render =“@ form”&gt ;.

(警告:当您从生产环境中的HTTP请求标头中发布屏幕截图时,请确保您屏蔽了/屏蔽了屏幕截图中的任何会话Cookie,以避免会话劫持攻击!)

在服务器端,请确保服务器以调试模式启动。在您希望在处理表单提交期间调用的感兴趣的JSF组件的方法中放置调试断点。例如。在UICommand组件的情况下,这将是UICommand#queueEvent()和在UIInput组件的情况下,将是UIInput#validate().只是逐步执行代码,检查流和变量是否符合预期。下面的截图是来自Eclipse的调试器的一个例子。

猜你在找的Ajax相关文章