2013-04-30 61 views
5

我的p:对话框不断加载,我只需要它出现一次。任何人都知道如何做到这一点?Primefaces p:对话框不断重新打开

<h:body style="background: url('img/background/teste/brushed_alu.png')!important" onload="dialogAtivacao.show();"> 
    <script type="text/javascript"> 
    $(document).ready(function() { 
     document.getElementById("j_username").focus(); 
    }); 
    </script> 

    <p:dialog id="dialogAtivar" header="Ativação de empresa" showEffect="drop" hideEffect="drop" resizable="false" 
       widgetVar="dialogAtivacao" modal="true" closable="true" rendered="#{sessionScope['SPRING_SECURITY_LAST_EXCEPTION'].message == 'ATIVACAO'}"> 
     <ui:include src="pages/ativacao/AtivacaoEmpresa.xhtml"/> 
    </p:dialog> 
    ... 

按钮:

<p:panel styleClass="panelBotaoLogin" > 
     <h:commandButton id="saveButton" action="#{login.doLogin()}" value=" Entrar" styleClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only botaoEntrar"/> 
    </p:panel> 

登录()在LoginBean:

public String doLogin() throws IOException, ServletException { 
      ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 
      RequestDispatcher dispatcher = ((ServletRequest) context.getRequest()).getRequestDispatcher("/j_spring_security_check?j_username=" + username + "&j_password=" + password); 
      dispatcher.forward((ServletRequest) context.getRequest(), (ServletResponse) context.getResponse()); 
      FacesContext.getCurrentInstance().responseComplete(); 

      return null; 
    } 

我已经一个customAuthenticationProvider返回 'ATIVACAO' 时,数据库是空的,所以我需要打开这个对话框插入数据,但它不断重新打开(关闭立即重新打开)。

+0

“on&on”是什么意思?对话框加载页面加载?它拒绝关闭?或者它关闭并立即重新打开?通常应该触发对话的是什么? – kolossus 2013-04-30 13:03:28

+0

嗨kolossus,它关闭立即重新打开。谢谢。 – Kyne 2013-04-30 13:06:04

+0

您需要在此处包含对话框的触发器组件以用于上下文 – kolossus 2013-04-30 13:07:54

回答

3
  1. <h:body onload="dialogAtivacao.show();"/>转化成当HTML的标签<body>被加载时,显示弹出<body>标记将在整个页面重新加载视图时重新加载

  2. 每次单击该按钮时都会触发整页刷新。

在一起,就成了,每次我点击这个按钮,重新加载整个页面,并显示对话框,结果

使用ajax的命令组件,而不是:

<p:commandButton id="saveButton" action="#{login.doLogin}" value=" Entrar" styleClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only botaoEntrar"/> 

这方式,ajax请求被触发并且onload仅被触发一次

+1

非常感谢。问题解决了! – Kyne 2013-04-30 13:45:55

+0

与其使用'onLoad'函数并执行ajax解决方法,对话框的'visible'属性应该具有与'rendered'属性相同的表达式。然后,一旦“数据库不再空”,他就可以完成整页刷新而不必担心弹出的对话框。 – Manuel 2013-04-30 13:47:07

+1

@Manuel,也可以工作,但它似乎是一个登录页面,我认为OP希望在打开页面时显示对话框。使用'visible' attr将导致额外的验证参数来检查页面加载是否是新鲜请求。无论哪一个工作。您可以发布该实施 – kolossus 2013-04-30 13:49:46