动态JSF/Primefaces加载不良
我的项目是一个动态报告应用程序,类似于JasperReport和am,使用JSF2.2.7(Mojara)和primefaces 5.0。当用户登录时,他/她只看到从数据库动态加载的分配给他的报告。其他一切都正常工作,只是当他们选择报告时,页面在第二次单击之前不会加载整个报告 我的问题是,在第二次单击之前,报告无法正确加载。这是我的密码动态JSF/Primefaces加载不良,jsf,jsf-2,mojarra,Jsf,Jsf 2,Mojarra,我的项目是一个动态报告应用程序,类似于JasperReport和am,使用JSF2.2.7(Mojara)和primefaces 5.0。当用户登录时,他/她只看到从数据库动态加载的分配给他的报告。其他一切都正常工作,只是当他们选择报告时,页面在第二次单击之前不会加载整个报告 我的问题是,在第二次单击之前,报告无法正确加载。这是我的密码 @Named(value = "userController") @SessionScoped public class ReportUserControlle
@Named(value = "userController")
@SessionScoped
public class ReportUserController implements Serializable {
private HtmlPanelGroup panelGroup; // with getter and setter
@PostConstruct
public void init() {
values = new ArrayList<>();
// Retrieve user's details and reports here
MenuModel model = new DefaultMenuModel();
Application application = FacesContext.getCurrentInstance().getApplication();
panelGroup = (HtmlPanelGroup) application.createComponent(HtmlPanelGroup.COMPONENT_TYPE);
PanelGrid panelGrid = (PanelGrid) application.createComponent(PanelGrid.COMPONENT_TYPE);
panelGrid.setColumns(2);
// Retrieve reports for d group the logged-in user belong
List<Report> repts = setupController.getExistingReports();
DefaultSubMenu reports = new DefaultSubMenu("Reports");
for (Report rep : repts) {
DefaultMenuItem menuItem = new DefaultMenuItem(rep.getReportName());
menuItem.setId(rep.getReportName().replaceAll("\\s+", ""));
menuItem.setAjax(true);
menuItem.setUpdate(":reportForm");
menuItem.setProcess("@form");
menuItem.setCommand("#{userController.loadReport(" + rep.getId() + ")}");
reports.addElement(menuItem);
reports.addElement(new DefaultSeparator());
}
model.addElement(reports);
Menubar menubar = (Menubar) application.createComponent(Menubar.COMPONENT_TYPE);
menubar.setModel(model);
panelGroup.getChildren().add(menubar);
}
public void loadReport(Long id) {
selectedReport = reportFacade.find(id);
if (parameters != null) {
parameters.clear();
}
if (values != null) {
values.clear();
}
queryColumns = selectedReport.getColumns();
queryParams = selectedReport.getReportParameters();
query = selectedReport.getReportQuery();
// This method is called to build the components of the page to be rendered dynamically.
// And it's every time a new report is selected
buildPage();
}
}
这是我的页面:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="./usersTemplate.xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns="http://www.w3.org/1999/xhtml">
<ui:define name="usersTitle">
usersTitle
</ui:define>
<ui:define name="usersContent">
<div class="container-fluid">
<p:growl id="growl" life="3000" sticky="true"/>
<h:form id="menuForm">
<!-- This panelGroup is for the menubar of reports -->
<h:panelGroup binding="#{userController.panelGroup}"/>
</h:form>
<h:form id="reportForm">
<!-- This panelGroup is to show the components and datatable of the selected report -->
<h:panelGroup id="reportPanel" binding="#{userController.reportPanelGroup}"/>
</h:form>
</div>
</ui:define>
usersTitle
请让我再说一遍,其他一切都很好,除了当我从菜单栏中的报告列表中选择一个报告时,页面直到第二次单击才更新,我尝试了完整页面提交和Ajax。请允许我提供任何帮助,我将不胜感激。提前感谢。对于将来可能有类似问题的其他人,请让我发布我最终解决的解决方案,该解决方案运行良好。我在页面中添加了一个
,该页面的呈现属性与所选报表的组件切换。然后我添加了一个javascript方法,通过菜单栏
中menuItems
的oncomplete
属性,在ajax
调用之后,点击commandButton
。以下是代码:
//JavaScript:
function clickAgain(){
document.getElementById('reportForm:refreshBtn').click();
}
//我将按钮添加到我的页面:
…
<h:form id="reportForm">
<p:commandButton value=" Load #{userController.selectedReport.reportName}"
icon="ui-icon-refresh" rendered="#{!userController.renderReport}"
id="refreshBtn">
<p:ajax update="@form" listener="#{userController.changeRender()}"/>
</p:commandButton>
<h:panelGroup id="reportPanel" binding="#{userController.reportPanelGroup}"
rendered="#{userController.renderReport}"/>
</h:form>
神奇的是,用户从未看到按钮,每次选择菜单项后都会调用javascript函数,这会重新加载页面,使按钮消失,并正确加载我的报告。谢谢
<h:form id="reportForm">
<p:commandButton value=" Load #{userController.selectedReport.reportName}"
icon="ui-icon-refresh" rendered="#{!userController.renderReport}"
id="refreshBtn">
<p:ajax update="@form" listener="#{userController.changeRender()}"/>
</p:commandButton>
<h:panelGroup id="reportPanel" binding="#{userController.reportPanelGroup}"
rendered="#{userController.renderReport}"/>
</h:form>