JSF <c:if <c:choose problem

4

我是JSF的新手,遇到了一些在表单中显示条件部分的奇怪问题。

我的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>

我的Java Bean:

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,但表单上没有其他内容显示??? 我的代码有什么问题吗?
2个回答

5

使用rendered属性(<h:outputText rendered="#{index.animal eq 1}" />)来进行组件的条件显示。使用JSTL与JSF一起使用会比较棘手。


请问在JSF中是否有<c:choose和<c:if的替代方案?除了rendered属性之外。 - ehsun7b
1
你仍然可以使用<c:标签,但避免在组件内部使用它们,也不要用于条件渲染。这是因为它们在不同的时间被评估,而不是JSF组件表达式。 - Bozho
谢谢...我真的很喜欢这个框架。试着适应它。 - ehsun7b

3
除非您真正了解JSF视图生命周期,否则不要使用c:foreach和c:if或任何替代方法。JSF是一个组件框架,因此Facelets实际上不是模板语言。如果您试图像使用模板一样使用它,您将感到沮丧(可能会责怪无辜的框架)。
JSF视图在与用户交互时创建(稍微简化一下),无论有多少请求。一旦创建,您无法添加或删除组件(再次简化),只能更改其状态(例如呈现/未呈现)。由于JSF的整个重点是将视图封装为静态实体,而不是从时间到时间生成HTML的程序,即使您可以使用某种if或choose,您也不知道也无法控制何时执行它(读取请求参数后?在读取请求参数之前?在验证之前或之后?在转换之前或之后?)。
我会将您的代码编写为:
@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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接