【问题标题】:selecting correct item of List<bean> in selectOneMenu在 selectOneMenu 中选择 List<bean> 的正确项目
【发布时间】:2013-12-15 04:20:49
【问题描述】:

当我从列表中选择另一个名称时,我无法更新 bean

<h:selectOneMenu id="playerMenu" value="#{player.combinedName}">
<f:selectItems value="#{serviceHCP.allPlayers}" />                  
<f:ajax execute="playerMenu" render="playerMenu" />

如果我使用上述方法,我将永远以 player == null 结束

如果我在没有 f:ajax 的情况下使用它,我将始终使用相同的“播放器”。但我当然希望在菜单项中选择一个。

然后我会将它传递给一个 bean

<h:commandButton value="Visa lista" action="#{serviceSeries.getSeriesForPlayerInfo(club.name, player, serieType.serie_type, calendarBean) }">
                </h:commandButton>
public List<Player> getAllPlayers() {

if (factory == null) {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
}

EntityManager em = factory.createEntityManager();
//Order by the matchdate.
//Query q = em.createQuery("select t from DBTest t");
Query q = em.createQuery("select t from Player t");

List<Player> players = q.getResultList();
for (Player aPlayer : players) {
  System.out.println(aPlayer);
}
System.out.println("Size: " + players.size());

em.close();

return players;

}

【问题讨论】:

    标签: java jsf javabeans


    【解决方案1】:

    您必须编写一个自定义 jsf 转换器来转换您的 Player 对象。 您的转换器很可能是..

    @FacesConverter("playerConverter")
    public class PlayerConverter implements Converter {
        @Override
        public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
            // Convert Object to unique String representation for display.
            return String.valueOf(((Player) value).getId());
        }
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
            // Convert submitted unique String representation back to Object.
            return new Player(Long.valueOf(value));
        }
    }
    

    你选择的应该是这样的,

    <h:selectOneMenu id="playerMenu" value="#{XXXXXX.player}">
        <f:selectItems value="#{serviceHCP.allPlayers}" var="player" itemLabel="#{player.name}" itemValue="#{player.id}"/>
        <f:converter converterId="playerConverter" />
    </h:selectOneMenu>
    

    【讨论】:

    • 如果我必须将其转换为字符串,使用起来会不会更容易。 作为局部变量。是否也可以使用 valueChangeListerner 来做到这一点?
    【解决方案2】:

    如果您在使用转换器时遇到问题,为什么不使用java.util.Map 来保存播放器数据。
    使用地图也可能有助于其他操作。
    JSF h:selectOneMenu 也支持 java.util.Map

    如果你有 Map,那么 K 将成为 itemLabel,V 将成为 itemValue。
    您可以将播放器对象加载为要映射的值。

    Map<String,Player> playerMap = new LinkedHashMap<>();
    Player selectedPlayer;
    

    然后..,

    <h:selectOneMenu value="#{bean.selectedPlayer}">
       <f:selectItems values="#{bean.playerMap}"/>
    </h:selectOneMenu>
    

    如果您希望 Orders Map 集合保留插入订单,请使用 LinkeHashMap

    Wiki page for h:selectOneMenu

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多