繁体   English   中英

在JSF中选择时“切换” Bean的最佳方法

[英]Best way to “switch” bean on selection in JSF

我有一个bean“ Player”当我在selectOneMenu中选择一个值时,我想“切换”到数据库中匹配的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>

但是我仍然无法将其发送给转换器。 它将发送玩家的名字。

@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对象执行什么操作。

因此,考虑到键/值对(键进入您设置为value属性的任何值,并向用户显示值)的位置,并且例如,如果您使用player.id作为值,则可以基于在那个ID上。

JSF Converter的工作是将Object转换为itemValue属性的字符串值,然后从字符串值中恢复该Object。 对于您的情况, ObjectPlayer实体,而是其id的String表示形式(可以是其他任何形式,只要您知道它是唯一的即可 )。

基本上,使用此转换器:

@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).getId();
        }
        return string;
    }

}

请注意, 我通过id更改了您要返回的名称 这样,作为玩家ID 1 ,JSF知道该字符串的值为"1" 这就是选择的值,它是通过getAsString方法获得的。

POST表单时,JSF必须从"1"值恢复Player实体,因此您可以使用Converter的getAsObject从数据库中加载它。

这样,从视图中引用对象本身就足以让jsf进行转换:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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