如何通过菜单在所有菜单的单个方法上动态加载模板。我如何识别调用该方法的菜单项。 这是我的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中使用一个方法来加载页面而无法找到方法。
答案 0 :(得分:1)
请记住,使用JSF 2,您可以处理操作方法中的参数(与JSF本身无关,但与EL实现无关)。
您可以使用枚举,数字类型或String
来定义要显示的实际tempalte。最简单的示例是一个方法(让我们称之为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')}" />