JSF

时间:2010-12-30 16:54:58

标签: java jsf facelets managed javabeans

我是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),但表格上不会显示任何其他内容??? 我的代码有什么问题???

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}