触发事件的jsf组件的索引

触发事件的jsf组件的索引,jsf,Jsf,这一定是一个愚蠢的问题,但我似乎找不到适合google的关键字:我有一个操作侦听器,可以从多个复选框中的任意一个接收事件,这些复选框都是从dataTable中的同一行jsp生成的。如何从动作侦听器中判断是哪个发出了事件 特别是,我需要组件的索引,以便将其映射到模型中的有序列表。我知道我可以得到UIComponent对象,从那里我可以得到组件的客户机ID。知道客户端ID中嵌入了组件的索引,是的,我可以做一些低级的事情,从客户端ID解析索引。但是我知道这将是一个可怕的、脆弱的、无法维护的黑客行为 做

这一定是一个愚蠢的问题,但我似乎找不到适合google的关键字:我有一个操作侦听器,可以从多个复选框中的任意一个接收事件,这些复选框都是从dataTable中的同一行jsp生成的。如何从动作侦听器中判断是哪个发出了事件

特别是,我需要组件的索引,以便将其映射到模型中的有序列表。我知道我可以得到UIComponent对象,从那里我可以得到组件的客户机ID。知道客户端ID中嵌入了组件的索引,是的,我可以做一些低级的事情,从客户端ID解析索引。但是我知道这将是一个可怕的、脆弱的、无法维护的黑客行为


做这件事的正确方法是什么?

在初步搜索之后,我认为这会对您有所帮助


除了复选框值之外,您是否尝试过使用f:param来传递自定义参数,因此这比使用ID来操作业务逻辑更干净。ID.

使用DataTables
var
属性,您应该能够做到这一点

<h:dataTable ...  var="currentRow">
  ....
  <h:selectBooleanCheckbox ... actionListener="#{blah.doThis}">
      <f:attribute name="curRec" value="#{currentRow}" />
  </h:selectBooleanCheckbox>

编辑:数据表的绑定变量应具有方法
getRowIndex()。这将为您提供导致表中事件的记录的索引。我引用的是一个ICEfaces项目,如果不正确,我道歉。让我知道,thx。

我应该加上:我想要索引,这样我就可以在复选框列表上实现互斥行为(我知道,单选按钮在技术上是正确的,但是组件在屏幕的不同部分,所以单选按钮看起来是孤立的,与上下文无关。)我也知道我可以用javascript实现互斥行为,但我认为为它添加javascript函数更麻烦。为优雅的客户端解决方案提供建议也很好。功能需求不明确,因此无法提供最优雅的解决方案。这些复选框的用途是什么?是每排一个吗?选择多行的目的是什么?每行有多个?你到底在说什么指数?行索引?还是复选框的索引?你到底为什么需要索引?等。每行一个复选框,单选(即互斥)。实际上有两个交错的互斥组,一个特定的行可能属于一个组或另一个组。所以实际上,你最终能够检查总共两个项目,每组一个。索引的思想是确定实际选中的是哪一个,因此其他的可以取消选中。我希望这会增加更多的清晰度而不是混乱:)@nclark:Shreder的答案包含根本不起作用的无意义代码(
h:selectBooleanCheckbox
根本不支持
actionListener
)。如果你最终找到了一个可行的解决方案,你应该自己把它作为一个答案。
public void doThis(ActionEvent ae)
{
    TreeMap myMap = (TreeMap)ae.getComponent().getAttributes().get("curRec");
    ...
}