java - 在 JSF 中选择 "switch"bean 的最佳方法

标签 java jsf jsf-2

我有一个 bean“Player”,当我在 selectOneMenu 中选择一个值时,我想“切换”到数据库中匹配的 bean。

我已将 bean 发送回中的选择一个菜单

public List<Player> getAllPlayers() { }

已将下拉列表更新为此。

<h:selectOneMenu value="#{servicePlayer.myPlayer.combinedName}"
    converter="playerConverter" id="playerList">
    <f:selectItems value="#{servicePlayer.allPlayers}" var="player"
        itemLabel="#{player.combinedName}" itemValue="#{player.id}" />
</h:selectOneMenu>

但我仍然无法将 ID 发送到转换器。它将发送玩家的名字。

@FacesConverter(value = "playerConverter")
public class PlayerConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null) {
            return null;
        }

        long idValue;
        try {
            idValue = Long.parseLong(value);
        }
        catch (NumberFormatException ex)
        {
            return null;
        }

        ServicePlayer servicePlayer = context.getApplication()
                .evaluateExpressionGet(context, "#{servicePlayer}",
                        ServicePlayer.class);
        Player player = servicePlayer.getPlayerByID(idValue);
        return player;

    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
        String string = null;
        if (value instanceof Player) {
            string = ((Player) value).getFirstName();
        }
        return string;
    }

}

public class ServicePlayer {

    private static final String PERSISTENCE_UNIT_NAME = "BowlingFacelets";
    public static EntityManagerFactory factory;
    Player myPlayer;

    public Player getMyPlayer() {
        return myPlayer;
    }


    public void setMyPlayer(Player myPlayer) {
        this.myPlayer = myPlayer;
    }


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


public Player getPlayerByID(long id) {

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

        EntityManager em = factory.createEntityManager();
        //Query q = em.createQuery("select t from Player t where t.name = '" + playerName + "'");
        //List<Player> players = q.getResultList();
        Player currentPlayer = em.find(Player.class, id);

        return currentPlayer;

    }


}

最佳答案

我认为您误解了 selectOneMenu 的 value 属性所指的含义。它的用途就像在所有其他输入组件中存储用户输入的位置(或从中获取现有值的位置)。

检查http://www.jsftoolbox.com/documentation/help/12-TagReference/core/f_selectItems.html 。您需要根据 f:select 项上的“var”属性设置键和值对,否则 JSF 无法真正了解您想要对 Player 对象执行什么操作。

因此,鉴于键/值对(键进入您设置的值属性,值显示给用户)已就位,并且如果您使用player.id作为值,则可以获取基于该 ID 的用户。

关于java - 在 JSF 中选择 "switch"bean 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629975/

相关文章:

java - 如何在 POM 包上使用 Sure-fire 运行测试?

javascript - IE 11(使用 JavaScript、JSF )的日期选择器问题在刷新后可以工作,但在刷新之前却不能

validation - JSF 验证提交表单

java - JSF - Bean 注入(inject)问题

java - 将 CMIS 结果限制从 100 增加到 1000

java - 如何将文件(存储在文件表中)的访问权限分配给用户(存储在我的用户表中)

Java包如何访问上述文件夹中的类

jsf - 如何从 View 中为 jsf 支持 bean 设置隐藏值

JSF2 - Primefaces - 更新嵌套面板时使用命令按钮进行部分更新不起作用

javascript - 如何调整 iframe 的大小以适应封闭面板