我已经搜索了几个小时,我发现了一些与之相关的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;
}
由于
答案 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()
中的所有逻辑移到该方法之外。
了解原因: