对话框内容未更新

时间:2013-07-17 12:36:17

标签: html ajax jsf primefaces

我已经搜索了几个小时,我发现了一些与之相关的stackoverflow问题,但找不到解决方案。我有一个显示日志文件内容的primefaces对话框。按下按钮时会显示该对话框。我的问题是,一旦显示对话框,内容永远不会更新。也就是说,永远不会调用#{pvtRunner.pvtLog}方法。如何让我的对话框在每次显示时调用此方法,而不仅仅是第一次?

<h:head>
</h:head>

<h:body>
    <p:dialog id="logDialog" header="PVT Log" widgetVar="dlg" height="400" width="600" dynamic="true">
        <h:outputText id="logDialogContnet" value="#{pvtRunner.pvtLog}" escape="false"/>
    </p:dialog>

    <h:form>
        <p:panelGrid id="mainPanelGrid" columns="1" styleClass="panelGridBorder panelGridCenter">
            ....
            <p:commandButton id="showLog" value="Show Log" onclick="dlg.show()" type="button" update=":logDialogContnet"/>
        </p:panelGrid>
    </h:form>
</h:body>

这是应该更新对话框内容的java方法:

public String getPvtLog() {
        String result = "";
        try {
            File logFile = new File(instanceRoot + "\\config\\ProcessVerification.log");
            InputStream fis = new FileInputStream(logFile);
            result = readStream(fis);
        } catch (IOException e) {
            log.severe(e.getMessage());
        }
        return result;
}

由于

2 个答案:

答案 0 :(得分:1)

首先,stop doing your business logic in your getter。你应该简单地归还财产。以下是您可以使用的一种方法。请务必查看链接。

修改您的getPvtLog()

public String getPvtLog() {
    return result;
}

然后定义一个方法,该方法将用于actionListener中的<p:commandButton>更新result。示例:

public void click() {    
    try {
        File logFile = new File(instanceRoot + "\\config\\ProcessVerification.log");
        InputStream fis = new FileInputStream(logFile);
        result = readStream(fis);
    } catch (IOException e) {
        log.severe(e.getMessage());
    }
    return result;
}

根据需要更改方法名称。这只是一个简单的例子。

现在删除type="button"而不是onclick将其更改为oncomplete。在ajax请求之前执行onclick,您希望在ajax请求之后弹出<p:dialog>。我相信这是你的主要问题。同时在actionListener中添加<p:commandButton>

<p:commandButton id="showLog" actionListener="#{pvtRunner.click()}" value="Show Log" oncomplete="dlg.show()" update=":logDialogContnet"/>

<强>示例

<p:dialog id="logDialog" header="PVT Log" widgetVar="dlg" height="400" width="600" dynamic="true">
    <h:outputText id="logDialogContnet" value="#{pvtRunner.pvtLog}" escape="false"/>
</p:dialog>
<h:form>
    <p:panelGrid id="mainPanelGrid" columns="1" styleClass="panelGridBorder panelGridCenter">
        <p:commandButton id="showLog" actionListener="#{pvtRunner.click()}" value="Show Log" oncomplete="dlg.show()" update=":logDialogContnet"/>
    </p:panelGrid>
</h:form>

答案 1 :(得分:1)

如果要成功调用<h:form/>,对话框应该拥有自己的getPvtLog()。根据JSF规则,只有表单中包含的组件才能将流量发送到服务器。所以你应该:

<p:dialog id="logDialog" header="PVT Log" widgetVar="dlg" height="400" width="600" dynamic="true">
   <h:form>
    <h:outputText id="logDialogContnet" value="#{pvtRunner.pvtLog}" escape="false"/>
   </h:form>
</p:dialog>

在不相关的说明中,您应该将getPvtLog()中的所有逻辑移到该方法之外。

了解原因: