如果我不能在 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 输出时执行业务逻辑。
对于其余部分,模板方法是可行的。
我有一个通用的 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 输出时执行业务逻辑。
对于其余部分,模板方法是可行的。