0

我已经搜索了几个小时,我发现了一些与之相关的 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;
}

谢谢

4

2 回答 2

1

首先,停止在 getter 中执行业务逻辑。你应该简单地归还财产。以下是您可以使用的一种方法。确保检查链接。

修改你的getPvtLog()

public String getPvtLog() {
    return result;
}

然后定义一个方法,用于您的actionListenerin <p:commandButton>to update 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"and 而不是将onclick其更改为oncomplete. onclick在ajax请求之前执行,要<p:dialog>在ajax请求之后弹出。顺便说一句,我相信这是您的主要问题。还要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>
于 2013-07-17T17:44:58.353 回答
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()该方法之外。

看看为什么:

于 2013-07-17T21:58:08.673 回答