如果您的servlet容器至少支持Servlet 3.0 / EL 2.2,则只需将其作为UICommand
组件或AjaxBehavior
标签的action / listener方法的参数传递。例如
<h:commandLink action="#{bean.insert(item.id)}" value="insert" />
结合:
public void insert(Long id) {
// ...
}
这仅需要为表单提交请求保留数据模型。最好的方法是将bean放在视图范围内@ViewScoped
。
您甚至可以传递整个item对象:
<h:commandLink action="#{bean.insert(item)}" value="insert" />
与:
public void insert(Item item) {
// ...
}
在Servlet 2.5容器上,如果您提供支持该功能的EL实现(例如JBoss EL),这也是可能的。有关配置的详细信息,请参见此答案。
<f:param>
在UICommand
组件中使用。它添加了一个请求参数。
<h:commandLink action="#{bean.insert}" value="insert">
<f:param name="id" value="#{item.id}" />
</h:commandLink>
如果您的bean是请求范围的,请让JSF通过以下方式进行设置: @ManagedProperty
@ManagedProperty(value="#{param.id}")
private Long id; // +setter
或者,如果您的bean范围更广,或者您想要更细粒度的验证/转换,请<f:viewParam>
在目标视图上使用,另请参见f:viewParam与@ManagedProperty:
<f:viewParam name="id" value="#{bean.id}" required="true" />
无论哪种方式,这都有一个优点,即不必为表单提交保留数据模型(对于您的bean是请求范围的情况)。
<f:setPropertyActionListener>
在UICommand
组件中使用。优点是,当bean的作用域比请求作用域更广时,这就不需要访问请求参数映射。
<h:commandLink action="#{bean.insert}" value="insert">
<f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
</h:commandLink>
与结合
private Long id; // +setter
只能通过id
动作方法中的属性来使用。这仅需要为表单提交请求保留数据模型。最好的方法是将bean放在视图范围内@ViewScoped
。
将datatable值绑定到DataModel<E>
,然后将其包装。
<h:dataTable value="#{bean.model}" var="item">
与
private transient DataModel<Item> model;
public DataModel<Item> getModel() {
if (model == null) {
model = new ListDataModel<Item>(items);
}
return model;
}
(transient
当您在视图或会话范围的bean上使用它时,由于DataModel
没有实现,因此必须在getter中进行创建并延迟实例化它是必需的Serializable
)
然后,您DataModel#getRowData()
无需进行任何传递就可以访问当前行(JSF根据单击的命令链接/按钮的请求参数名称确定该行)。
public void insert() {
Item item = model.getRowData();
Long id = item.getId();
// ...
}
这还要求为表单提交请求保留数据模型。最好的方法是将bean放在视图范围内@ViewScoped
。
用于Application#evaluateExpressionGet()
以编程方式评估当前#{item}
。
public void insert() {
FacesContext context = FacesContext.getCurrentInstance();
Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
Long id = item.getId();
// ...
}