部分渲染冗余方法调用

时间:2011-12-16 14:58:51

标签: ajax jsf methods call

我知道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"/>标记之外?

1 个答案:

答案 0 :(得分:3)

我非常确定在JSF重建元素树以将POST数据存储到适当元素的阶段中进行“冗余”调用。

因此,如果您留在页面上,每个请求基本上有两个getter调用。第一个用于存储新的表单值,然后用于呈现页面内容。