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 実装とは関係ありません)。

列挙型、数値型、またはStringを使用して、表示する実際のテンプレートを定義できます。最も単純な例は、表示するテンプレートの定義displayTemplateを受け取るメソッド ( と呼びましょう) です。String

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

アイデアとしてMap、パスを値templateIdとして、 をキーとして含む にテンプレートを登録して、テンプレートを簡単に切り替えることができます。このマップを初期化することを忘れないでください。

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 に答える