我有一个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>
但我仍然无法将ID发送到转换器。它将从播放器发送firstName。
@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;
}
}
答案 0 :(得分:1)
我认为你误解了selectOneMenu的value属性是指什么。它的用法就像在所有其他输入组件中一样,用于存储用户输入的位置(或从中获取现有值的位置)。
检查http://www.jsftoolbox.com/documentation/help/12-TagReference/core/f_selectItems.html。你需要根据f:select项的'var'属性设置键值和值对,否则JSF无法真正知道你想用Player对象做什么。
因此,键值/值对(键设置为值属性和值显示给用户的任何设置)就位,如果您使用player.id作为值,则可以获取基于该ID的用户。
答案 1 :(得分:0)
JSF Converter
负责将Object转换为itemValue
属性的字符串值,然后从字符串值中恢复该Object。对于您的情况,对象是Player
实体,而值是其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 返回的名称。这样,作为玩家标识1
,JSF知道它的字符串值是"1"
。这是选择的值,它是通过getAsString
方法获得的。
当您 POST 表单时,JSF必须从Player
值恢复"1"
实体,因此您使用Converter getAsObject
从中加载<h:selectOneMenu value="#{servicePlayer.myPlayer.combinedName}"
converter="playerConverter" id="playerList">
<f:selectItems value="#{servicePlayer.allPlayers}" var="player"
itemLabel="#{player.combinedName}" itemValue="#{player}" />
</h:selectOneMenu>
DB。
这样就可以从视图中引用对象本身,让jsf进行转换:
{{1}}