我是使用omnifaces的新手。 从我收集到的小东西中,postInvokeAction是在flashscope中处理对象而不是jsf preRenderView事件时使用的更好选择。但我注意到的是侦听器方法被调用了两次!我觉得preInvokeAction类似于前阶段监听器和postInvokeAction类似于PhaseID.INVOKE_APPLICATION的后阶段监听器,因此应该只为相应的事件调用一次。它是否正确?请向我解释。
我目前使用的是Mojarra 2.1.17和Omnifaces 1.3。
感谢您的回复!
layout1.html
<h:body>
<p style="color: blue; font-size: 12pt;">1. This is the main content of the file.</p>
<ui:insert name="body_contents"/>
<p style="color: blue; font-size: 12pt;">This is the the remaining part of the document... in layout1</p>
</h:body>
samplepage2.html
<h:body>
<f:view>
<f:metadata>
<f:viewParam name="dummy_var" value="#{sampletest.val_test}"/>
<f:event type="postInvokeAction" listener="#{sampletest.frompostinvokeaction}" />
<f:event type="preRenderView" listener="#{sampletest.fromprerenderview}" />
</f:metadata>
</f:view>
<ui:composition template='/layout1.html'>
<ui:define name="title_on_head">
<style type="text/css">
.pkssd{
min-width: 340px; min-height: 30px; background: appworkspace; color: blue; font-size: 11pt; font-style: italic;
}
</style>
</ui:define>
<ui:define name="body_contents">
<p class="pkssd">This is the active content...</p>
</ui:define>
</ui:composition>
</h:body>
SampleTest.java
@ManagedBean(name="sampletest")
@ViewScoped
public class SampleTest {
private String val_test; public void frompostinvokeaction(){
System.out.println("frompostinvokeaction: val_test: " + val_test); }
public void fromprerenderview(ComponentSystemEvent cse){
System.out.println("fromprerenderview : val_test: " + val_test);
}
}
答案 0 :(得分:0)
您使用主/客户端模板的方式并不完全正确。它完全偏离了规范,可能导致了未指定的行为。
正确的方法是:
/WEB-INF/layout1.html
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<f:view>
<ui:insert name="metadata" />
<h:head>
...
<ui:insert name="title_on_head" />
...
</h:head>
<h:body>
...
<ui:insert name="body_contents" />
...
</h:body>
</f:view>
</html>
/samplepage2.html
<ui:composition template="/WEB-INF/layout1.html">
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="dummy_var" value="#{sampletest.val_test}"/>
<f:event type="postInvokeAction" listener="#{sampletest.frompostinvokeaction}" />
<f:event type="preRenderView" listener="#{sampletest.fromprerenderview}" />
</f:metadata>
</ui:define>
<ui:define name="title_on_head">
<style type="text/css">
.pkssd{
min-width: 340px; min-height: 30px; background: appworkspace; color: blue; font-size: 11pt; font-style: italic;
}
</style>
</ui:define>
<ui:define name="body_contents">
<p class="pkssd">This is the active content...</p>
</ui:define>
</ui:composition>
(是的,那是完整的文件, {/ 1>}