我正在使用 <f:viewParam>
传递一个参数如下。
<ui:define name="metaData">
<f:metadata>
<f:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/>
</f:metadata>
</ui:define>
是否可以处理这个 <f:viewParam>
, 仅当页面加载/刷新时?
这只是因为用 <f:viewParam>
指定的转换器将通过查询字符串传递的值转换为 JPA 实体的成本很高。因此,它涉及昂贵的数据库事务,即使在使用像 <p:commandButton>
这样的组件进行 ajaxical 回发时也是如此。 , <p:commandLink>
这是不必要的。
因此,例如,一个 <p:commandLink>
(ajaxical) 被点击时,不应执行昂贵的业务服务(在转换器中)。这能做到吗?
当 rendered
属性根据 facesContext.postback
进行评估喜欢rendered="#{not facesContext.postback}"
但是属性 rendered
是not documented .因此,它是不可靠的。
最佳答案
您可以通过创建扩展 <f:viewParam>
的自定义标签来实现此目的其中您将提交的值存储为实例变量,该实例变量未存储在 JSF View 状态中,而不是作为 <f:viewParam>
存储在 JSF View 状态中。默认情况下。在请求结束时,所有 UI 组件实例都将被销毁。它们在请求开始时重新创建。当提交的值为 null
,那么它就不会调用转换器或模型 setter 。这一切都在 Arjan Tijms' blog 中进行了详细说明。 .
OmniFaces从 1.0 版开始就提供了一个即用型解决方案 <o:viewParam>
,另见 my own blog在那上面。根据您的问题历史记录,您已经在使用 OmniFaces,因此您基本上需要做的就是替换 f:
通过 o:
.
<ui:define name="metaData">
<f:metadata>
<o:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/>
</f:metadata>
</ui:define>
这不会在同一 View 的回发期间调用模型 setter (也不会调用转换器)。
This somehow works (strange enough nevertheless), when the rendered attribute is evaluated against facesContext.postback like rendered="#{not facesContext.postback}" but the attribute rendered is not documented. Hence, it is unreliable.
那是因为 <f:viewParam>
本质上是一个 UIInput
组件(否则它将无法执行转换、验证、模型更新和所有像普通输入组件一样的东西)因此只是一个 UIComponent
支持 rendered
属性。然而,这没有明确记录,因为它实际上不会向 HTML 输出呈现任何内容(这也是为什么它是 f:xxx
,而不是 h:xxx
)。但是使用此属性,您实际上可以控制回发期间的行为,因为此属性是 also在 processDecodes()
中评估在应用请求值阶段调用的方法。
关于jsf - 进程 f :viewParam only on page load,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23903351/