我知道 JSF 可能会调用托管 bean 方法几次,即使它在 .xhtml 中只调用一次。我知道这是由于 encode* 方法造成的。
我想请你给我解释一下下面的案例。 我有一个 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 局部渲染不像以前那样调用它。
是什么让 <ui:repeat>
中的 movieBean.categories 调用标签不同
比“测试线”中的那个?还有为什么调用里面是<ui:repeat>
按 AJAX 链接时生成
即使它在外面部分呈现<h:panelGroup id="output"/>
标签?
最佳答案
我很确定“冗余”调用是在 JSF 重建元素树以将 POST 数据存储到适当元素的阶段内进行的。
因此,如果您停留在页面上,基本上每个请求都会有两个 getter 调用。第一个存储新的表单值,然后呈现页面内容。
关于ajax - 部分渲染冗余方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8535931/