2016-05-15 120 views
3

我有一个xhtml页面,会话范围支持bean。现在,我必须在新选项卡中打开此页面,右键单击新选项卡中的打开链接。 当此页面打开时,必须清除辅助bean的模型类。 我用下面的代码:在primefaces的新选项卡中打开菜单项页面

<p:menuitem value="Details" action="#{beanMB.clearDetailModel()}"/> 

支持bean代码:

public void clearDetailModel() 
    { 
     memberModel=null; 
     ...... 
     return "/pages/member/MemberDetails.xhtml?faces-redirect=true"; 
    } 

上面的代码中清除会话范围的模型,但它并没有在新标签打开网页。

有没有什么方法可以用上面的代码在新选项卡中打开页面,或者是否有任何其他方法解决上述问题?任何帮助将不胜感激。 谢谢。

+0

它没有工作,我需要打开右键单击页面 - 在新标签中打开链接。函数clearDetailModel()仅在直接左键单击时调用,但不能右键单击 - 在新选项卡中打开链接。 – Kiran

+0

什么是用例?如果您在新选项卡中打开页面时需要清除** sessioscope ** d模型,则会出现设计缺陷。引入一个viewscoped bean或者甚至一个基于cdi扩展的窗口范围 – Kukeltje

+0

我已经使用了会话范围,因为我需要在表单中显示图像。没有会话范围,图像不显示。 – Kiran

回答

1

你可以试试这个:

你需要把下面的代码MemberDetails.xhtml页。

<f:metadata> 
<f:event type="preRenderView" listener="#{beanMB.clearDetailModel}"/> 
</f:metadata> 

并在menuitem中使用url打开您的页面。

<p:menuitem value="Details" url="/pages/member/MemberDetails.xhtml" /> 

您需要修改您的支持bean的代码如下:

public void clearDetailModel() 
    { 
     if (isNewRequest()){ 
     memberModel=null; 
     ...... 
     } 

    } 

public boolean isNewRequest() { 
     final FacesContext fc = FacesContext.getCurrentInstance(); 
     final boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET"); 
     final boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest(); 
     final boolean validationFailed = fc.isValidationFailed(); 
     return getMethod && !ajaxRequest && !validationFailed; 
    } 

以下方法isNewRequest()检查请求是否是新的或不如果不检查你的方法clearDetailModel()会每次发出新的请求时都会调用它。

相关问题