我正在使用JSF数据表。表中的一列是命令按钮。
单击此按钮时,我需要使用表达式语言传递几个参数(如所选行的值)。这个参数需要传递给JSF托管bean,它可以对它们执行方法。
我使用了以下代码片段,但我在JSF bean上获得的值始终为null。
<h:column>
<f:facet name="header">
<h:outputText value="Follow"/>
</f:facet>
<h:commandButton id="FollwDoc" action="#{usermanager.followDoctor}" value="Follow" />
<h:inputHidden id="id1" value="#{doc.doctorid}" />
</h:column>
Bean方法:
public void followDoctor() {
FacesContext context = FacesContext.getCurrentInstance();
Map requestMap = context.getExternalContext().getRequestParameterMap();
String value = (String)requestMap.get("id1");
System.out.println("Doctor Added to patient List"+ value);
}
如何使用命令按钮将值传递给JSF托管bean?
答案 0 :(得分:10)
使用DataModel#getRowData()
获取操作方法中的当前行。
@ManagedBean
@ViewScoped
public class Usermanager {
private List<Doctor> doctors;
private DataModel<Doctor> doctorModel;
@PostConstruct
public void init() {
doctors = getItSomehow();
datamodel = new ListDataModel<Doctor>(doctors);
}
public void followDoctor() {
Doctor selectedDoctor = doctorModel.getRowData();
// ...
}
// ...
}
请在数据表中使用它。
<h:dataTable value="#{usermanager.doctorModel}" var="doc">
并删除视图中h:inputHidden
旁边的h:commandButton
。
无法优雅 - 替代方案是使用f:setPropertyActionListener
。
public class Usermanager {
private Long doctorId;
public void followDoctor() {
Doctor selectedDoctor = getItSomehowBy(doctorId);
// ...
}
// ...
}
使用以下按钮:
<h:commandButton action="#{usermanager.followDoctor}" value="Follow">
<f:setPropertyActionListener target="#{usermanager.doctorId}" value="#{doc.doctorId}" />
</h:commandButton>
@ViewScoped
- 包含使用DataModel<E>
的CRUD示例。