JSF f:事件preRenderView由f:ajax调用和部分渲染触发,还有什么?

And*_*rew 25 ajax jsf-2

所以我们有一个f:事件:

   <f:metadata>
    <f:event type="preRenderView" listener="#{dashboardBacking.loadProjectListFromDB}"/>
   </f:metadata>
Run Code Online (Sandbox Code Playgroud)

在初始页面加载(渲染)时根据需要触发.

但是,此preRenderView事件也由ajax部分页面呈现触发,该呈现重新呈现具有id projectListing的h:panelgroup,如下所示.

<h:commandButton action="#{mrBean.addProject}" value="Create Project"
                                     title="Start a new project">
   <f:ajax render="projectListing" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)

我只希望为初始页面渲染调用dashboardBacking.loadProjectListFromDB,但是当有ajax部分渲染时则不需要.我可以使用更合适的事件或方法吗?

And*_*dre 31

我不久前也有同样的需求.我最终使用了BalusC建议的东西.

FacesContext类中有一个方法可以让您知道您是在处理完整的请求还是某种类型的部分处理:

FacesContext.getCurrentInstance().isPostback()
Run Code Online (Sandbox Code Playgroud)

这样你仍然可以使用preRenderView技术并检查它是否是监听器中的回发.我发现这特别有用,因为我需要一个会话bean,因为用户必须导航到另一个页面并返回.如果我使用了视图范围的bean(就像Brian上面提到的那样),我会在导航之前丢失我的信息.


Bri*_*hem 11

另一种选择是将您的preRenderView功能放在托管bean 的@PostConstruct方法中ViewScoped.这个逻辑将在初始化bean时执行,并且您为所有ajax请求维护相同的bean实例,直到您更改视图.


小智 7

另一种可能性是在preRenderView方法中检查请求是否是ajax请求.您还可以考虑其他因素有条件地执行加载,例如请求是否为GET以及验证是否失败(查看参数验证在GET页面上失败).

boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET") ? true : false;
boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest();
boolean validationFailed = fc.isValidationFailed();
Run Code Online (Sandbox Code Playgroud)