请考虑以下代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:o="http://omnifaces.org/ui">
<f:metadata>
<o:viewParam name="selected" value="#{testBacking.selected}" >
</o:viewParam>
</f:metadata>
<h:head>
<title>
title
</title>
</h:head>
<h:body>
<o:form includeViewParams="true">
<h:commandButton action="#{testBacking.go()}" value="go">
<f:ajax execute="@all" render="@all"/>
</h:commandButton>
</o:form>
</h:body>
</html>
行动方法:
public void go() {
System.out.println("go() is called");
Collection<UIViewParameter> viewParams = ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot());
for (UIViewParameter viewParam : viewParams) {
System.out.println(viewParam.getName() +" = "+ viewParam.getValue());
}
}
action方法返回正确的viewParam名称,但值始终为null。如果这是预期的行为,<o:form includeViewParams="true">
如何帮助实际使用?
我正在使用Mojarra 2.1.12和Omnifaces 1.1。
答案 0 :(得分:2)
你的bean显然是请求作用域。 <o:viewParam>
仅用于与视图作用域 bean结合使用,因为它会阻止模型在每次回发时反复转换/验证/更新相同查看即使在初始请求期间已经已完成仍然仍然作为视图范围bean的属性。当模型绑定到基于DB调用执行作业的昂贵转换器时,这可以提高整体性能。 showcase example也清楚地表明了这一点。
为实现此目的,<o:viewParam>
基本上会在任何回发期间跳过此模型转换/验证/更新作业。但是,每次请求都会新创建一个请求范围的bean,因此每次回发都会丢失初始模型值,并且由于<o:viewParam>
的设计根本没有设置。
您可以通过将bean放在视图范围内,或者仅使用标准<f:viewParam>
来解决此问题。
对于<o:form includeViewParams="true">
,这仅适用于同步回发。如果您删除了<f:ajax>
,那么您会看到它有用。如果没有includeViewParams="true"
,则URL将成为没有view参数的URL,即没有?selected=somevalue
,因此它变得无法标记。这与<o:viewParam>
没有严格的关系,它与<f:viewParam>
结合使用效果很好。