在单个Facelet的多个位置包含来自另一个文件的相同代码段并进行dyncamically渲染

时间:2015-11-26 16:11:48

标签: jsf primefaces

我知道有很多关于类似主题的问题,我从中了解了View Build time和View Render Time Tags,但我无法找到解决方案。如果回答,请指出正确的问题。

考虑我编写了一些用xhtml文件编写的facelet代码(一堆输入组件)的场景。我想在许多地方将这些代码/组件包含在另一个xhtml中。如下图所示。

enter image description here

如果用户ui:include我将遇到Duplicate ID问题。如果我使用c:if,我的ViewScoped bean将被转换为RequestScoped

以下是我试过的代码。 的index.xhtml

<h:form id="form1">
    <h:selectOneMenu id="genderSelect" value="#{myBean.gender}">
        <p:ajax update="dynaPanel"/>
        <f:selectItem itemLabel="--select--" itemValue=""/>
        <f:selectItem itemLabel="Male" itemValue="m"/>
        <f:selectItem itemLabel="Female" itemValue="f"/>
    </h:selectOneMenu>

    <h:panelGroup id="dynaPanel" layout="block">
        <h:panelGroup id="malePanel" rendered="#{myBean.gender eq 'm'}">
            <h1>Male</h1><br/>

            <h:outputLabel value="Name:"/>
            <h:inputText value="#{myBean.name}"/><br/>
            <ui:include src="country.xhtml"/>

        </h:panelGroup>

        <h:panelGroup id="femalePanel" layout="block" rendered="#{myBean.gender eq 'f'}">
            <h1>Female</h1><br/>
            <ui:include src="country.xhtml"/><br/>

            <h:outputLabel value="Name:"/>
            <h:inputText value="#{myBean.name}"/>

        </h:panelGroup>

    </h:panelGroup>

    <p:commandButton value="Submit" action="#{myBean.action}" />

</h:form>

country.xhtml

<h:panelGroup>
    <h:outputLabel value="Country:"/>
    <h:selectOneMenu id="countrySelect" value="#{myBean.country}">
        <f:selectItem itemLabel="USA" itemValue="us"/>
        <f:selectItem itemLabel="UK" itemValue="uk"/>
        <f:selectItem itemLabel="India" itemValue="in"/>
        <f:selectItem itemLabel="China" itemValue="ch"/>
    </h:selectOneMenu>
</h:panelGroup>

MyBean.java

@ManagedBean
@ViewScoped
public class MyBean {

    private String country;
    private String name;
    private String gender;

    @PostConstruct
    public void init(){
        System.out.println("@PostConstruct");
    }

    public void action(){
        System.out.println(name+"-"+gender+"-"+country);
    }

    @PreDestroy
    public void destory(){
        System.out.println("@PreDestroy");
    }

    //Setters Getters

}

如何在没有重复ID问题或不损害我的ManagedBean的ViewScope的情况下实现此目的。

使用JSF-2.1.13

0 个答案:

没有答案