- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时,当使用<h:commandLink>
,<h:commandButton>
或<f:ajax>
时,根本不会调用与该标记关联的action
,actionListener
或listener
方法。或者,不使用提交的UIInput
值更新Bean属性。
有哪些可能的原因和解决方案?
最佳答案
介绍
每当UICommand
组件(<h:commandXxx>
,<p:commandXxx>
等)无法调用关联的操作方法,或者UIInput
组件(<h:inputXxx>
,<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>
UICommand
和
UIInput
组件必须放置在
UIForm
组件内部,例如
<h:form>
(因此不是纯HTML
<form>
),否则无法将任何内容发送到服务器。
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
值验证/转换错误。您可以使用
<h:messages>
显示任何输入特定的
<h:message>
组件未显示的消息。不要忘记将
id
的
<h:messages>
包含在
<f:ajax render>
中(如果有的话),这样它也将根据ajax请求进行更新。另请参见
h:messages does not display messages when p:commandButton is pressed。
UICommand
或
UIInput
组件放置在诸如
<h:dataTable>
,
<ui:repeat>
等的迭代组件内,则需要确保在应用请求值期间保留与迭代组件完全相同的
value
表单提交请求的阶段。 JSF将在其上重申以找到单击的链接/按钮和提交的输入值。将bean放在视图范围内和/或确保将数据模型加载到bean的
@PostConstruct
中(因此不在getter方法中!)应该可以修复它。另请参见
How and when should I load the model from database for h:dataTable。
UICommand
)包含
UIInput
或
<ui:include src="#{bean.include}">
组件,则需要确保在表单提交请求的视图构建期间保留完全相同的
#{bean.include}
值。 JSF将在构建组件树期间重新执行它。将bean放在视图范围内和/或确保将数据模型加载到bean的
@PostConstruct
中(因此不在getter方法中!)应该可以修复它。另请参见
How to ajax-refresh dynamic include content by navigation menu? (JSF SPA)。
rendered
属性以及任何父级
test
/
<c:if>
的
<c:when>
属性不应求值为
false
。 JSF将对其进行重新检查,以作为防范被篡改/被黑客入侵的保护措施的一部分。将负责该条件的变量存储在
@ViewScoped
Bean中,或者确保已正确地在
@PostConstruct
Bean的
@RequestScoped
中预先初始化了该条件,可以对其进行修复。组件的
disabled
属性也是如此,在应用请求值阶段,该属性不应评估为
true
。另请参见
JSF CommandButton action not invoked和
Form submit in conditionally rendered component is not processed。
onclick
组件的
UICommand
属性和
onsubmit
组件的
UIForm
属性不应返回
false
或引起JavaScript错误。如果
<h:commandLink>
或
<f:ajax>
在浏览器的JS控制台中也没有可见的JS错误。通常,使用Google搜索确切的错误消息已经可以给您答案。另请参见
Adding jQuery to PrimeFaces results in Uncaught TypeErrors。
<f:ajax>
或例如使用Ajax PrimeFaces
<p:commandXxx>
,请确保您在主模板中有一个
<h:head>
,而不是
<head>
。否则,JSF将无法自动包含包含Ajax函数的必要JavaScript文件。这将在浏览器的JS控制台中导致JavaScript错误,例如“未定义mojarra”或“未定义PrimeFaces”。另请参见
h:commandLink actionlistener is not invoked when used with f:ajax and ui:repeat。
null
,则请确保感兴趣的
UIInput
和
UICommand
组件被
<f:ajax execute>
覆盖,例如
<p:commandXxx process>
,否则将不会执行/处理它们。另请参见
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。
null
,并且您正在使用CDI管理Bean,则请确保从正确的包中导入范围注释,否则CDI将默认为
@Dependent
,这样可以在以下位置有效地重新创建Bean EL表达式的每个评估。另请参见
@SessionScoped bean looses scope and gets recreated all the time, fields become null和
What is the default Managed Bean Scope in a JSF 2 application?
<h:form>
按钮的
UICommand
的父级是事先通过来自同一页面中另一表单的ajax请求呈现/更新的,则第一个操作在JSF 2.2或更早版本中将始终失败。第二步和后续操作将起作用。这是由视图状态处理中的一个错误引起的,该错误报告为
JSF spec issue 790,目前已在JSF 2.3中修复。对于较旧的JSF版本,您需要在
<h:form>
的
render
中显式指定
<f:ajax>
的ID。另请参见
h:commandButton/h:commandLink does not work on first click, works only on second click。
<h:form>
设置了
enctype="multipart/form-data"
以支持文件上传,那么您需要确保至少使用JSF 2.2,或者要确保负责解析多部分/表单数据请求的servlet过滤器是正确配置,否则
FacesServlet
最终将根本没有任何请求参数,因此无法应用请求值。如何配置此类过滤器取决于所使用的文件上传组件。对于“战斧”
<t:inputFileUpload>
,请检查
this answer,对于PrimeFaces
<p:fileUpload>
,请检查
this answer。或者,如果您实际上根本没有上传文件,请完全删除该属性。
ActionEvent
的
actionListener
参数是
javax.faces.event.ActionEvent
而不是
java.awt.event.ActionEvent
,这是大多数IDE建议的第一种自动完成选项。如果使用
actionListener="#{bean.method}"
,则没有参数也是错误的。如果您不想在方法中使用参数,请使用
actionListener="#{bean.method()}"
。或者,也许您实际上想使用
action
而不是
actionListener
。另请参见
Differences between action and actionListener。
PhaseListener
或任何
EventListener
更改了JSF生命周期以通过例如调用
FacesContext#renderResponse()
或
FacesContext#responseComplete()
来跳过调用动作阶段。
Filter
或
Servlet
以某种方式阻止了
FacesServlet
的请求。
<p:dialog>
或
<p:overlayPanel>
,请确保它们具有自己的
<h:form>
。因为,默认情况下,JavaScript将这些组件重定位到HTML
<body>
的末尾。因此,如果他们最初坐在
<form>
内,那么现在他们将不再坐在
<form>
中。另见
p:commandbutton action doesn't work inside p:dialog
rich:calendar
属性(或在某些情况下为
defaultLabel
子元素)的
rich:placeholder
UI元素时,RichFaces具有“
conversion error”。当没有为日历日期设置任何值时,此错误阻止Bean方法被调用。跟踪框架的错误可以通过从一个简单的工作示例开始并备份页面直到发现该错误来完成。
<f:ajax>
的情况下提交启用
<h:head>
按钮的情况(如以上第7点所述)。
<h:inputText>
和一个
<h:commandButton>
带有
<f:ajax execute="@form" render="@form">
。
UICommand
组件,则为
UICommand#queueEvent()
;如果是
UIInput
组件,则为
UIInput#validate()
。只需逐步执行代码并检查流程和变量是否符合预期即可。屏幕截图下方是Eclipse调试器的示例。
关于jsf - 未调用commandButton/commandLink/ajax操作/监听器方法或未设置/更新输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563360/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!