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

时间:2015-08-10 16:41:09

标签: jsf facelets jsf-2.2

我有一个通用的JSF页面和抽象类,它由许多其他页面实现,并用于在@PostConstruct方法中进行主要处理。既然我已经在某些网页上使用了网址参数,那么我想要移动所有网页'处理成一个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}"/>   

虽然这是正确的吗?

1 个答案:

答案 0 :(得分:1)

如果方法可能会抛出异常和/或执行导航/重定向,那么最好使用preRenderView代替preRenderComponent特别是,否则您可能会面临不完整响应和/或其类型的“响应已提交”异常发生时。

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

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