我知道JSF可能会调用一个托管bean方法几次,即使它只在.xhtml中调用一次。据我所知,这是由于编码*方法。
我想请你向我解释以下案例。 我有一个JSF文件,看起来像这样:
<h:form id="form1">
<h:panelGroup id="output">
...
<h:commandLink...>
<f:ajax render=":form1:output"/>
</h:commandLink>
</h:panelGroup>
</h:form>
到目前为止一切都清楚了;按下命令链接会在窗体panelGroup中重新呈现页面的一部分。 代码如下:
<ui:repeat value="#{movieBean.categories}" var="category">
<li>
<h:outputLink value="index.xhtml">
<f:param name="categoryId" value="#{category.categoryId}"/>
<h:outputText value="#{category.description}"/>
</h:outputLink>
</li>
</ui:repeat>
#{movieBean.categories} //this is just a 'test line'
movieBean是请求作用域。
现在,当我第一次进入该页面时,我得到两次对movieBean.categories的调用。
这很清楚,因为它在代码中被调用了两次。但是,当我点击AJAX链接渲染时
只有页面的一部分(输出)我从<ui:repeat>
再次调用movieBean.categories
虽然它在部分呈现的页面区域之外。这次没有调用'测试线'。
我进行了另一次测试。我删除了仅留下“测试行”的<ui:repeat>
标记。
AJAX部分渲染不像以前那样调用它。
使movieBean.categories在<ui:repeat>
标记内调用的原因不同
比'测试线'中的那个?为什么在按下AJAX链接时调用<ui:repeat>
内的调用
即使它在部分呈现<h:panelGroup id="output"/>
标记之外?
答案 0 :(得分:3)
我非常确定在JSF重建元素树以将POST数据存储到适当元素的阶段中进行“冗余”调用。
因此,如果您留在页面上,每个请求基本上有两个getter调用。第一个用于存储新的表单值,然后用于呈现页面内容。