最佳的“切换"方式JSF中选择的bean [英] Best way to "switch" bean on selection in JSF

查看:84
本文介绍了最佳的“切换"方式JSF中选择的bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a bean "Player" When I select a value in the selectOneMenu I would like to "switch" to the bean that's matching in the database.

我已将Bean发送回

public List<Player> getAllPlayers() { }

已将下拉菜单更新为此.

Updated the dropdown to this.

<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发送给转换器的信息.它将发送玩家的名字.

But I still can't get it to send the ID to the converter. It will send in the firstName from the player.

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

    }


}

推荐答案

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

A JSF Converter does the job of converting an Object to the string value for the itemValue attribute and then recover that Object from the string value. For your case, the Object is the Player entity while the value is the String representation of its id (could be anything else, as long as you know it's unique).

基本上,使用此转换器:

Basically, using this converter:

@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方法获得的.

Note I changed the name you're returning by the id. That way, being the player id 1, JSF knows the String value for that is "1". That's the value for the selection, which is obtained by the getAsString method.

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

When you POST the form, JSF has to recover the Player entity from the "1" value, so you use Converter's getAsObject to load it from the DB.

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

That way it would be enough to reference the object itself from the view to let jsf do the conversion:

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

这篇关于最佳的“切换"方式JSF中选择的bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆