我正在使用一个<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 实体的成本很高。因此,它涉及昂贵的数据库事务,即使在执行时也是如此ajaxical使用类似组件的回发<p:commandButton>
, <p:commandLink>
这是不必要的。
因此,例如,当<p:commandLink>
(ajaxical单击 ) 后,不应执行昂贵的业务服务(在转换器中)。这可以做到吗?
这在某种程度上有效(尽管如此,很奇怪),当rendered
属性是根据facesContext.postback
like rendered="#{not facesContext.postback}"
但属性rendered
is 没有记录 http://docs.oracle.com/javaee/7/javaserverfaces/2.2/vdldocs/facelets/f/viewParam.html。因此,它是不可靠的。
您可以通过创建扩展的自定义标签来实现这一点<f:viewParam>
其中,您将提交的值存储为实例变量,该变量不存储在 JSF 视图状态中,而是存储在 JSF 视图状态中<f:viewParam>
默认情况下是这样。请求结束时,所有 UI 组件实例都将被销毁。它们在请求开始时重新创建。当提交的值为null
,那么它就不会调用转换器或模型设置器。这一切都在Arjan Tijms 的博客 http://arjan-tijms.omnifaces.org/2011/07/stateless-vs-stateful-jsf-view.html.
OmniFaces http://omnifaces.org自 1.0 版本以来已经提供了一个现成的解决方案<o:viewParam> http://showcase.omnifaces.org/components/viewParam, 也可以看看我自己的博客 http://balusc.blogspot.com/2012/03/stateless-view-parameter.html关于这一点。根据您的问题历史记录,您已经在使用 OmniFaces,因此您基本上需要做的就是替换f:
by o:
.
<ui:define name="metaData">
<f:metadata>
<o:viewParam name="id" value="#{bean.entity}" converter="#{converter}"/>
</f:metadata>
</ui:define>
在同一视图上的回发期间,这不会调用模型设置器(也不会调用转换器)。
当渲染的属性根据 facesContext.postback 进行评估(如 render="#{not facesContext.postback}" )但渲染的属性未记录时,这在某种程度上有效(尽管如此,很奇怪)。因此,它是不可靠的。
那是因为<f:viewParam> http://docs.oracle.com/javaee/7/api/javax/faces/component/UIViewParameter.html本质上是一个UIInput http://docs.oracle.com/javaee/7/api/javax/faces/component/UIInput.html组件(否则它将无法执行转换、验证、模型更新以及所有像通常的输入组件一样的东西),因此它只是一个UIComponent http://docs.oracle.com/javaee/7/api/javax/faces/component/UIComponent.html支持一个rendered http://docs.oracle.com/javaee/7/api/javax/faces/component/UIComponent.html#isRendered%28%29属性。然而,这并没有明确记录,因为它实际上不会向 HTML 输出呈现任何内容(这也是为什么它是一个f:xxx
, not a h:xxx
)。但是使用此属性,您实际上可以控制回发期间的行为,因为此属性是also http://grepcode.com/file/repo1.maven.org/maven2/javax.faces/javax.faces-api/2.2/javax/faces/component/UIInput.java#UIInput.processDecodes%28javax.faces.context.FacesContext%29评估于processDecodes() http://docs.oracle.com/javaee/7/api/javax/faces/component/UIComponent.html#processDecodes%28javax.faces.context.FacesContext%29在应用请求值阶段调用的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)