我有一个通用的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}"/>
虽然这是正确的吗?
答案 0 :(得分:1)
如果方法可能会抛出异常和/或执行导航/重定向,那么最好使用preRenderView
代替preRenderComponent
,特别是,否则您可能会面临不完整响应和/或其类型的“响应已提交”异常发生时。
preRenderView
基本上就像在preRenderComponent
/ <f:view>
上附加UIViewRoot
一样。即在整个视图被渲染之前,因此保证在任何位写入HTTP响应主体之前运行。当JSF忙于生成HTML输出时,您宁愿不执行业务逻辑。
对于其余部分,模板方法是可以的。