简体   繁体   中英

JSF <c:if <c:choose problem

I'm new in JSF and I have some strange problems in displaying conditional parts in form.

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>

And My 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;
  } 

}

When I select one item the value will be displayed for exampel (1 or 2) but nothing else will display on the form??? What is wrong with my code???

Use the rendered attribute ( <h:outputText rendered="#{index.animal eq 1}" /> ) for conditional displaying of components. Using JSTL is tricky with JSF.

Unless you really understand the JSF view life cycle, do not use c:foreach and c:if, or any alternatives. JSF is a component framework and so facelets are not really a templating language. If you try to use it like one, you will come away frustrated (possibly blaming the innocent framework).

JSF view is created (simplifying a bit) once per interaction with user, no matter how many requests are there. Once it is created, you cannot add or remove components (again, simplifying), you can only change their state (for example rendered / not rendered). Since the whole point of JSF is to encapsulate the view as a static entity, not as a program that generates HTML from time to time, even if you could use some kind of if or choose , you would not know nor could control when it is executed (after reading request params? before reading request params? before or after validation? before or after conversion?).

I would write your code as:

@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();
  }
}

And then:

  <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}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM