gpt4 book ai didi

java - 使用 selectonemenu 创建 JSF 数据表并从数据库中填充其数据

转载 作者:行者123 更新时间:2023-11-30 09:54:55 24 4
gpt4 key购买 nike

我正在尝试创建一个带有选择一个菜单的 jsf 数据表,并从数据库中填充它,但是我的 JSF 代码无法让它在这里工作:

  <ice:dataTable id="dataTable1" value="#{Page1.users}" var="users">
<ice:column id="column2">

<ice:outputText id="userID" value="users.userId"/>
<f:facet name="header">
<ice:outputText id="outputText1" value="Table_Column1"/>
</f:facet>

</ice:column>

<ice:column id="column2">


<f:facet name="header">
<ice:outputText id="outputText4" value="Table_Column2"/>
</f:facet>
<ice:selectOneMenu id="users" value="#{Page1.selectedUser}" >
<f:selectItems value="#{users.screenName}"/>

</ice:selectOneMenu>
</ice:column>

</ice:dataTable>

Page1代码:

 private ArrayList<UserTable> users=new ArrayList<UserTable>();

public ArrayList<UserTable> getUsers() {

if(users==null){
UserTable u1=new UserTable(1);
users.add(u1);
u1=new UserTable(2);
users.add(u1);

}
return users;
}
private String selectedUser;

public String getSelectedUser() {
return selectedUser;
}

public void setSelectedUser(String selectedUser) {
this.selectedUser = selectedUser;
}

最后是 userTable 代码:

public class UserTable {
private long userId;
private Option[] screenName;

public UserTable(long userId) {
this.userId = userId;
}

public Option[] getScreenName() {
if(screenName==null){
buildScreenNameOptions();
}
return screenName;
}

public void setScreenName(Option[] screenName) {
this.screenName = screenName;
}


public long getUserId() {
return userId;
}

public void setUserId(long userId) {
this.userId = userId;
}

private void buildScreenNameOptions() {
List<String> screenNameList = null;
try{
Session session = NewHibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("Select screenName from User");
screenNameList = (List<String>) q.list();

} catch(Exception e) {
e.printStackTrace();
}

screenName = new Option[screenNameList.size()];
int i=0;
for(String name : screenNameList) {
Option opt = new Option(name);
screenName[i++] = opt;
}
}


}

怎么了?

谢谢

最佳答案

这里,

<ice:selectOneMenu id="users" value="#{Page1.selectedUser}" >

您将输入值与单个托管 bean 属性而不是迭代行对象 #{users} 的属性绑定(bind)。因此,当表有多行时,单个托管 bean 属性将每次都被覆盖,直到最后一行。此属性最终始终是最后一行的值。您需要将输入值绑定(bind)到迭代的行对象。

在这里,

<f:selectItems value="#{users.screenName}" />

f:selectItems 应该绑定(bind)到 List<SelectItem>SelectItem[]Map<Object, Object> 。我不确定 Option[] 应该代表什么,但这看起来像是特定于 ICEFaces 的。由于您没有描述问题(您只是说“它不起作用”,就像从最终用户的角度来看,而不是从开发人员的角度来看),我只是为了安全起见并建议您使用 List<SelectItem>为此。

这是一个基本的启动示例,一个和另一个应该是什么样子。我在这里使用不言自明的变量名,以便代码更加清晰和 self 记录:

<h:dataTable value="#{bean.users}" var="user">
<h:column>
<h:selectOneMenu value="#{user.selectedScreenName}">
<f:selectItems value="#{user.availableScreenNames}" />
</h:selectOneMenu>
</h:column>
</h:dataTable>

public class Bean {
private List<User> users;
// ...
}

public class User {
private String selectedScreenName;
private List<SelectItem> availableScreenNames;

public User() {
availableScreenNames = new ArrayList<SelectItem>();
for (String availableScreenName: session.createQuery(SQL).list()) {
availableScreenNames.add(new SelectItem(availableScreenName));
}
}

// ...
}

就是说,我不确定“booleancheckbox”(正如您在标题中输入的那样)与这个问题有何关系。以后,尝试在问题中一点更具描述性。告诉我们“它不起作用”并没有给我们太多的工作空间,它只会根据给定的代码进行猜测。

关于java - 使用 selectonemenu 创建 JSF 数据表并从数据库中填充其数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3074310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com