我正在尝试使用select one菜单创建一个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>
第1页代码:
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;
}
}
}
那么出了什么问题?
由于
答案 0 :(得分:2)
下面,
<ice:selectOneMenu id="users" value="#{Page1.selectedUser}" >
您将输入值与单个托管bean属性绑定,而不是迭代行对象#{users}
的属性。因此,当表有多行时,每次都会覆盖单个托管bean属性,直到最后一行。此属性最终始终是最后一行的值。您需要将输入值绑定到迭代的行对象。
在这里,
<f:selectItems value="#{users.screenName}" />
f:selectItems
应绑定到List<SelectItem>
或SelectItem[]
或Map<Object, Object>
。我不确定Option[]
应代表什么,但看起来像ICEFaces具体。既然你没有描述这个问题(你只是说它“不工作”,就像在用户的角度来看,而不是在开发人员的角度),我只是试着保持安全并建议你使用{ {1}}为此。
这是一个基本的启动示例,一个和另一个应该是什么样子。我在这里使用自解释变量名称,以便代码更清晰,自我记录:
List<SelectItem>
与
<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;
// ...
}
那就是说,我不确定“booleancheckbox”(正如你在标题中所说的)是如何与这个问题相关的。将来,请尝试在问题中提供更具描述性的位。告诉“它不起作用”并没有给我们太多的帮助,它只是基于给定的代码进行猜测。