我正在使用Prime Faces(JSF UI库)。
我有一个页面,里面有几个commandLink
按钮,每个按钮都会弹出一个对话框。
<f:view>
<h:form>
.
.
.
<p:dataTable value="#{ServerMgmtBean.objectList}" var="server">
.
.
.
<p:commandLink oncomplete="dlgAssignServers.show()">
<p:graphicImage alt="Assign Image" value="./images/assign.png" />
</p:commandLink>
.
.
.
</h:form>
<p:dialog id="assignServersDialog" header="Assign Servers" widgetVar="dlgAssignServers" modal="true" width="400">
<ui:include src="assign/assign_sg_servers.xhtml"/>
</p:dialog>
</f:view>
问题是,每次单击commmandLink
时,页面后面的所有bean都会重新创建(在本例中为ServerMgmtBean
),然后启动对话框。所有bean都是请求范围的。
它大大降低了速度,以至于在对话框出现之前我需要一个进度指示器。为什么要初始化bean?我能以某种方式避免这种情况吗?
问题是您使用的是@RequestScoped
bean。它们在每个请求中都被重新创建(甚至在AJAX请求中,如您的情况commandLink
将发送AJAX请求)。将scope更改为@ViewScoped
,您的页面将为每个页面提供一个bean,而不是每个请求。