Jsf 进程f:仅在页面加载时查看参数

Jsf 进程f:仅在页面加载时查看参数,jsf,jsf-2.2,viewparams,Jsf,Jsf 2.2,Viewparams,我使用传递一个参数,如下所示 <ui:define name="metaData"> <f:metadata> <f:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/> </f:metadata> </ui:define> 只有在加载/刷新页面时才能处理此 正是因为用指定的转换器代价高昂,所以才将通过查询字符串传

我使用
传递一个参数,如下所示

<ui:define name="metaData">
    <f:metadata>
        <f:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/>
    </f:metadata>
</ui:define>

只有在加载/刷新页面时才能处理此

正是因为用
指定的转换器代价高昂,所以才将通过查询字符串传递的值转换为JPA实体。因此,即使在使用诸如
之类的组件执行ajaxical回发时,它也会涉及一个昂贵的数据库事务,而这是不必要的

因此,例如,当单击
ajaxical)时,不应执行昂贵的业务服务(在转换器中)。这能做到吗



当对
facesContext.postback
属性求值时,这会以某种方式起作用(尽管很奇怪),就像
rendered=“#{not facesContext.postback}”
一样,但属性
rendered
是无效的。因此,它是不可靠的。

您可以通过创建一个扩展
的自定义标记来实现这一点,在该标记中,您将提交的值存储为一个实例变量,而不是像默认情况下的
那样存储在JSF视图状态中,而不是存储在JSF视图状态中。在请求结束时,所有UI组件实例都将被销毁。它们将在请求的开头重新创建。当提交的值为
null
时,它将不会调用转换器或模型设定器。这一切都在本文中详细阐述

自1.0版以来,已经提供了一个“即用”的解决方案,另请参见。根据您的问题历史记录,您已经在使用OmniFaces,因此您基本上只需将
f:
替换为
o:

<ui:define name="metaData">
    <f:metadata>
        <o:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/>
    </f:metadata>
</ui:define>

在同一视图的回发过程中,这不会调用模型设置器(或转换器)


这在某种程度上起作用(尽管很奇怪),当对呈现的属性进行类似于rendered=“#{not facesContext.postback}”的facesContext.postback求值时,但呈现的属性没有文档记录。因此,这是不可靠的


这是因为组件本质上是一个组件(否则它将无法执行转换、验证、模型更新和所有类似于普通输入组件的操作),因此它只是一个支持属性的组件。但是,这没有明确的文档记录,因为它实际上没有向HTML输出呈现任何内容(这也是为什么它是
f:xxx
,而不是
h:xxx
)。但是有了这个属性,您实际上可以控制回发过程中的行为,因为这个属性是在应用请求值阶段调用的方法中计算的。

感谢@Tiny提出这个问题,它准确地描述了我遇到的情况,正如这里所描述的,引用的链接现在似乎已断开。