如果我不能在 JSF 模板中使用 f:viewAction,我可以在哪里放置通用的 post-URL 处理代码?

If I can't use f:viewAction within a JSF template, where can I put generic post-URL processing code?

我有一个通用的 JSF 页面和抽象 class,它由许多其他页面实现并用于在 @PostConstruct 方法中进行主要处理。现在我正在为一些页面使用 URL 参数,我想将所有页面的处理移到 viewAction 操作方法中,以便它可以在它们的处理中使用 URL 参数。

当然,我不能在我的模板中使用 f:metadata/f:viewAction,因为 JSF 不允许这样做:

When using <ui:composition> templating, where should I declare the <f:metadata>?

有没有办法以通用方式处理我所有页面的 post-viewAction 处理?现在我让它与 f:event 标签一起工作:

模板页面:

<ui:insert name="metadata"/>

<h:head>
    <f:event type="preRenderComponent" listener="#{controller.postProcessParams}" />
</h:head>

客户端页面:

<ui:define name="metadata">
    <f:metadata>
        <f:param name="id" value="#{manageProjects.id}"/>
        <f:viewAction action="#{manageProjects.processParams}"/>
    </f:metadata>
</ui:define>

<ui:param name="controller" value="#{manageProjects}"/>   

不过这样合适吗?

最好使用 preRenderView instead of preRenderComponent,特别是 如果该方法可能会抛出异常 and/or 执行 navigation/redirect,否则您可能会面临不完整的响应 and/or 一种 "Response already committed" 异常发生时。

preRenderView 基本上就像在 <f:view>/UIViewRoot 上附加 preRenderComponent。 IE。在整个视图被渲染之前,因此保证在任何位被写入 HTTP 响应主体之前 运行。您不想在 JSF 忙于生成 HTML 输出时执行业务逻辑。

对于其余部分,模板方法是可行的。