我是JSF的新手,我在表单中显示条件部分时遇到了一些奇怪的问题。
My Facelet:
<h:form id="animalForm">
<h:selectOneRadio id="animal" onchange="submit()" value="#{index.animal}">
<f:selectItem itemLabel="Cat" itemValue="1"/>
<f:selectItem itemLabel="Dog" itemValue="2"/>
</h:selectOneRadio>
</h:form>
<h:outputText value="#{index.animal}"/>
<c:if test="#{index.animal eq 1}">
<h:outputText value="Cat"/>
</c:if>
<c:if test="#{index.animal eq 2}">
<h:outputText value="Dog"/>
</c:if>
和我的豆:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "index")
@RequestScoped
public class IndexBean {
public static final int CAT = 1;
public static final int DOG = 2;
private int animal;
public IndexBean() {
}
public int getAnimal() {
return animal;
}
public void setAnimal(int animal) {
this.animal = animal;
}
}
当我选择一个项目时,该值将显示为例子(1或2),但表格上不会显示任何其他内容??? 我的代码有什么问题???
答案 0 :(得分:5)
使用rendered
属性(<h:outputText rendered="#{index.animal eq 1}" />
)进行组件的条件显示。使用JSTL对JSF来说很棘手。
答案 1 :(得分:3)
除非您真正了解JSF视图生命周期,否则请不要使用c:foreach和c:if或任何替代方法。 JSF是一个组件框架,因此facelets并不是真正的模板语言。如果你试图像它一样使用它,你会感到沮丧(可能归咎于无辜的框架)。
无论有多少请求,每次与用户交互时都会创建一次JSF视图(简化一点)。一旦创建,您就无法添加或删除组件(再次,简化),您只能更改其状态(例如渲染/未渲染)。因为JSF的重点是将视图封装为静态实体,而不是作为一个不时生成HTML的程序,即使你可以使用某种 if 或选择,你不知道也不能控制何时执行(在读取请求参数之后?在读取请求参数之前?在验证之前或之后?在转换之前或之后?)。
我会把你的代码写成:
@ManagedBean(name = "index")
@RequestScoped
public class IndexBean {
public enum Animal {
Cat, Dog;
}
private Animal animal;
public Animal getAnimal() {
return animal;
}
public void setAnimal(Animal animal) {
this.animal = animal;
}
public Animal[] getAnimals(){
return Animal.values();
}
}
然后:
<h:form id="animalForm">
<h:selectOneRadio id="animal" onchange="submit()" value="#{index.animal}">
<f:selectItems value="#{index.animals}"/>
</h:selectOneRadio>
</h:form>
The animal is: #{index.animal}