Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态JSF/Primefaces加载不良_Jsf_Jsf 2_Mojarra - Fatal编程技术网

动态JSF/Primefaces加载不良

动态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

我的项目是一个动态报告应用程序,类似于JasperReport和am,使用JSF2.2.7(Mojara)和primefaces 5.0。当用户登录时,他/她只看到从数据库动态加载的分配给他的报告。其他一切都正常工作,只是当他们选择报告时,页面在第二次单击之前不会加载整个报告

我的问题是,在第二次单击之前,报告无法正确加载。这是我的密码

@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>