jsf - 进程 f :viewParam only on page load

标签 jsf jsf-2.2 viewparams

我正在使用 <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}"但是属性 renderednot 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/

相关文章:

richfaces - javax.el.E​​LException : Cannot convert bottom-left of type class java. lang.String 到类 org.richfaces.component.Positioning

spring - JSF 操作未调用(一种情况有效,而第二种情况则无效)

java - 使用哪种模式打开和关闭 hibernate session (MyFaces 2.2.2 + Spring 4.0.3 + Hibernate 4.3.2)

jsf-2 - 导航到传递参数的其他 View

java - 我可以在 Java EE 项目中使用 Dagger 2 吗?

jsf - p :commandButton in p:dataTable

jsf - 如何在 JSF 支持 bean 之间共享一个实体?

ajax - JSF ViewParam 必需 +AJAX 中断页面

java - JSF 中的数据表

validation - JSF Validator 与字符串的平等比较