最佳的“切换"方式JSF中选择的bean [英] Best way to "switch" bean on selection in JSF
问题描述
我有一个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屋!