我试图显示例如学生和老师。这种关系是布尔值,因此我决定为它们使用复选框h:selectBooleanCheckbox
:
<table>
<thead>
<tr>
<th></th>
<c:forEach items="#{myController.teachers}" var="t">
<th>#{t.name}</th>
</c:forEach>
</tr>
</thead>
<tbody>
<c:forEach items="#{myController.students}" var="s">
<tr>
<td>#{s.name}</td>
<c:forEach items="#{myController.teachers}" var="t">
<td>
<h:selectBooleanCheckbox value="#{myController.isLinked(s.name, t.name)}">
<f:ajax event="change" listener="#{myController.link(s.name, t.name)}" render="@this" />
</h:selectBooleanCheckbox>
</td>
</c:forEach>
</tr>
</c:forEach>
</tbody>
</table>
value
是一个函数,它将告诉我两者是否相关,而listener
是我要用来链接或取消链接的动作。
方法存在于myController
中:
public boolean isLinked(String s, String t) {
....
public void link(String s, String t) {
我的第一个问题是打印出OK,isLinked
被称为OK,但是当我单击其中一个复选框时,我得到一个错误:
serverError:类javax.faces.component.UpdateModelException /page.xhtml @ 478,120 value =“#{myController.isLinked(s.name,t.name)}”:属性 在类型上找不到“ isLinked” com.ex.myController $$ OwbNormalScopeProxy0
({myController
是@ViewScoped
)
在没有ajax
的情况下,我没有出现任何错误,但是后面没有执行任何操作。我以不同的方式尝试过失败。
我的第二个问题是,这是否是JSF中最有效的方法,因为我可能有1000名学生和20名老师,所以这意味着大量的方法调用(以及用于检查链接的数据库调用)。对我来说,h:selectManyCheckbox
的使用似乎无效。我曾考虑过将数据备份到Map
上,以避免调用,但是也许我会消耗更多的内存,并且一旦页面加载就不会看到很大的性能提升。
编辑
第一个问题似乎是我误解了combobox元素,而value
试图获取和设置。因此,设置时出现错误。我见过How to use <h:selectBooleanCheckbox> in <h:dataTable> or <ui:repeat> to select multiple items?解决了类似的问题,但并不完全相同。