0

我如何通过一个菜单对所有菜单的单个方法动态加载模板。我如何识别调用该方法的菜单项。这是我的 xhtml:

 <h:body>

        <p:layout fullPage="true">

            <p:layoutUnit position="north" size="80" resizable="true" closable="true" collapsible="true">
                <h:form id="form3">  
                    <ui:include src="./templates/template.xhtml" />  
                </h:form> 
            </p:layoutUnit>

            <p:layoutUnit position="south" size="100" closable="true" collapsible="true">
                Footer
            </p:layoutUnit>

            <p:layoutUnit position="west" header="Opciones" size="175">
                <h:form id="form1">
                    <p:panelMenu style="width:200px">   
                        <p:submenu label="Clientes" >
                            <p:menuitem value="Adicionar" update=":form2" actionListener="#{templateMB.templateAddCliente}" />
                            <p:menuitem value="Modificar" update=":form2" actionListener="#{templateMB.templateConfigCliente}" />
                            <p:menuitem value="Listado" update=":form2" actionListener="#{templateMB.templateListadoCliente}" />
                        </p:submenu> 
                        <p:submenu label="Contratos">  
                            <p:menuitem value="Adicionar" update=":form2" actionListener="#{templateMB.templateAddContrato}" />
                        </p:submenu>  
                        <p:separator/>  
                        <p:submenu label="Suplementos" >  
                            <p:menuitem value="Adicionar" icon="ui-icon-signal"/>  
                        </p:submenu>  
                    </p:panelMenu>
                </h:form>
            </p:layoutUnit>

            <p:layoutUnit position="center" id="centerlayout">
                <h:form id="form2">  
                    <ui:include src="#{templateMB.centerTemplate}" />  
                </h:form> 
                <p:dialog id="dialog" header="Subir Documento del Contrato" resizable="false" widgetVar="fileDialog" showEffect="explode" hideEffect="explode" width="500" height="200"> 

                    <h:form enctype="multipart/form-data">  
                        <p:panel id="panelDialog">
                            <p:fileUpload value="#{contratosMB.fileContrato}" mode="simple" style="width: 400px"/>  
                            <br/>
                            <br/>
                            <p:commandButton value="Guardar" ajax="false"  
                                             actionListener="#{contratosMB.upload}"/>  
                        </p:panel>
                    </h:form>  

                </p:dialog> 
            </p:layoutUnit>

        </p:layout>

    </h:body>

这是我的支持 bean:

      public String templateAddCliente() {
    try {
        this.centerTemplate = "./templates/addCliente.xhtml";
         return null;

    } catch (Exception e) {
        JsfUtil.addErrorMessage("Ha ocurrido un error: " + e.getMessage());
        return null;
    }
}

  public String templateConfigCliente() {
    try {
        this.centerTemplate = "./templates/configCliente.xhtml";
         return null;

    } catch (Exception e) {
        JsfUtil.addErrorMessage("Ha ocurrido un error: " + e.getMessage());
        return null;
    }
}
  public String templateHome() {
    try {
        this.centerTemplate = "./templates/hometemplate.xhtml";
         return null;

    } catch (Exception e) {
        JsfUtil.addErrorMessage("Ha ocurrido un error: " + e.getMessage());
        return null;
    }
}

  public String templateListadoCliente() {
    try {
        this.centerTemplate = "./templates/listadoCliente.xhtml";
         return null;

    } catch (Exception e) {
        JsfUtil.addErrorMessage("Ha ocurrido un error: " + e.getMessage());
        return null;
    }
}

  public String templateAddContrato() {
    try {
        this.centerTemplate = "./templates/addContratos.xhtml";
         return null;

    } catch (Exception e) {
        JsfUtil.addErrorMessage("Ha ocurrido un error: " + e.getMessage());
        return null;
    }
}

到目前为止一切正常,但我必须为每个菜单项创建一个方法,我不喜欢。我想在 backinbean 中使用单个方法来加载页面,但找不到方法。

4

1 回答 1

1

请记住,使用 JSF 2,您可以处理操作方法中的参数(与 JSF 本身无关,但与 EL 实现有关)。

您可以使用枚举、数字类型或 aString来定义要显示的实际模板。displayTemplate最简单的示例是接收String定义要显示的模板的方法(我们称之为)。

public displayTemplate(String templateId) {
    centerTemplate = templateMap.get(templateId);
}

作为一个想法,您可以在Map包含路径作为值和templateId作为键的 a 中注册模板,以便在模板之间轻松切换。只要记住初始化这张地图。

Map<String,String> templateMap = new HashMap<String,String>();
//...
templateMap.put("addCliente","./templates/addCliente.xhtml");
//The very same with the other templates

最后,在您的页面中,您可以像这样调用该方法:

<p:menuitem value="Adicionar" update=":form2" actionListener="#{templateMB.displayTemplate('addCliente')}" />
于 2013-03-18T18:24:39.293 回答