如何將對象傳遞給commandButton的動作方法?我使用一個作爲複合組件基礎的數據表。複合組件應該提供交換添加到數據錶行的按鈕的可能性。我認爲我可以通過構面來實現這一點,但是我無法直接通過EL或通過屬性操作偵聽器將對象從數據表列表傳遞到操作方法。JSF2:將列表(dataGrid)中的對象傳遞給commandButton的動作方法
查看:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:customer="http://java.sun.com/jsf/composite/components/customer">
<ui:composition template="/WEB-INF/templates/template.xhtml">
<ui:define name="content">
<h:form id="customerList">
<customer:list list="#{customerControllerBean.list}">
<f:facet name="rowButton">
<h:commandButton value="#{msg.deleteButtonLabel}"
action="#{customerControllerBean.delete(customer)}" />
<h:commandButton value="#{msg.deleteButtonLabel}" action="#{customerControllerBean.deleteCustomer}">
<f:setPropertyActionListener target="#{customerControllerBean.customer}" value="#{customer}"/>
</h:commandButton>
<h:button outcome="customerdetail.jsf?id=#{customer.id}"
value="#{msg.editButtonLabel}" />
</f:facet>
</customer:list>
</h:form>
</ui:define>
</ui:composition>
</html>
使用下面的複合材料構件customer:list
:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="list" />
<composite:facet name="rowButton" />
</composite:interface>
<composite:implementation>
<p:dataTable id="customer" var="customer" value="#{cc.attrs.list}">
...
<p:column>
<composite:renderFacet name="rowButton" />
</p:column>
</p:dataTable>
</composite:implementation>
</html>
的支持bean:
@Named
@ConversationScoped
public class CustomerControllerBean implements Serializable {
private static final long serialVersionUID = 6168621124401208753L;
List<Customer> allCustomers = null;
private Customer customer;
// setters and getters ...
@PostConstruct
public void loadAllCustomers() {
// load customers
}
public List<Customer> getList() {
return allCustomers;
}
public String delete(Customer customer) {
// delete customer...
return "deleted";
}
public String deleteCustomer() {
// delete customer...
return "deleted";
}
是沒可能通過在這種情況下對象的方法?
感謝您的提示。基本上我可以將對象傳遞給動作方法。當我添加一個攜帶數據表的複合組件時,以及當我使用facet添加按鈕時,我遇到了問題。無論如何,我嘗試了兩個例子。我還添加了rowKey,以便編譯示例。第一個示例不起作用,當調用模型的setter時,setter的參數爲null。第二個例子工作,但只有當我將按鈕直接添加到數據表。當我通過facet添加它時,它不起作用,bean.delete(row)方法的參數行也是null。 – Joysn
我明白了,你真的需要使用複合組件嗎?我的意思是,前一段時間我試圖使用它們,花費了太多時間,並且發現最簡單的場景不會工作,因爲spec和impl中有很多錯誤。我最終使用了作爲組件工作的簡單模板,創建了一個簡單的taglib。效果很好,但缺點是您無法強制組件的接口。問候! – rbento
好..我正在尋找一個優雅的解決方案,以某種方式'配置'按鈕。數據表中的一行。一種情況是有一個刪除和一個編輯按鈕,一次是有一個視圖和選擇按鈕,所以我可以選擇一個實體在其他實體中設置...並且這些按鈕在不同的bean上調用不同的方法。我認爲方面將是一個優雅的方式來實現這一目標。 – Joysn