f:selectItems не отображает флажки в поле зрения

Я пытаюсь отобразить несколько флажков с помощью f:selectItems, но веб-страница просто не отображает флажки, как ожидалось. Пожалуйста, посмотрите на код ниже и дайте мне знать, что мне не хватает.

HTML:

    <h:form  prependId="false">
        <table align="left" cellspacing="5">
            <tr>
                <td align="right" valign="top"><h:outputText value="#{msgs.interests}" /></td>
                <td align="left" valign="top">
                    <h:selectManyCheckbox value="#{testBean.interests}">
                        <f:selectItems value="#{testBean.checkBoxItems}" />
                    </h:selectManyCheckbox>
                </td>
            </tr>
            <tr>
                <td align="right" valign="top"><h:commandButton value="#{msgs.save}" /></td>
                <td align="left" valign="top"><h:commandButton value="#{msgs.cancel}" /></td>
            </tr>
        </table>
    </h:form>

Управляемый Боб:

package com.jsf.ManagedBeans;

импорт javax.inject.Named; import javax.faces.bean.RequestScoped;

import javax.faces.model.SelectItem;

@Named ("testBean") @RequestScoped открытый класс TestBean {

private int[] interests;
private SelectItem[] checkBoxItems = {
    new SelectItem("Dancing", "Dancing"),
    new SelectItem("Singing", "Singing"),
    new SelectItem("Reading", "Reading"),
    new SelectItem("Writing", "Writing")
};

public SelectItem[] getCheckBoxItems() {

    return checkBoxItems; 
}

public int[] getInterests() {     return interests;
}
public void setInterests(int[] newValue) { 
    interests = newValue; 
} }

1 ответ

Решение

Вы захотите использовать аннотации области CDI с аннотацией CDI @Named, а также убедиться, что CDI включен для проекта (файл WEB-INF/beans.xml существует).

Кроме того, добавьте оператор отладки в метод PostConstruct, чтобы подтвердить, что компонент создается. Этот метод запускается CDI автоматически после создания компонента. Его также можно использовать для инициализации полей компонента, поскольку он гарантированно будет запускаться один раз и только один раз за создание экземпляра, в отличие от конструктора класса.

package com.jsf.ManagedBeans;

import javax.inject.Named; 
import javax.enterprise.context.RequestScoped;

import javax.faces.model.SelectItem;

@Named @RequestScoped public class TestBean {

  private int[] interests;
  private SelectItem[] checkBoxItems = {
    new SelectItem("Dancing", "Dancing"),
    new SelectItem("Singing", "Singing"),
    new SelectItem("Reading", "Reading"),
    new SelectItem("Writing", "Writing")
  };

  @PostConstruct public void init() {
      System.out.println("testBean initialized");
  }

  public SelectItem[] getCheckBoxItems() {

    return checkBoxItems; 
  }

  public int[] getInterests() {     return interests;
  }
  public void setInterests(int[] newValue) { 
    interests = newValue; 
  }   
}
Другие вопросы по тегам