我知道有很多关于类似主题的问题,我从中了解了View Build time和View Render Time Tags,但我无法找到解决方案。如果回答,请指出正确的问题。
考虑我编写了一些用xhtml文件编写的facelet代码(一堆输入组件)的场景。我想在许多地方将这些代码/组件包含在另一个xhtml中。如下图所示。
如果用户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