轉載自https://maping930883.blogspot.sg/2012/05/adf119action.html
我在《傳遞參數給TaskFlow》項目的基礎上,修改了department.jsf頁面代碼,增加了一個按鈕以及相應的Managed Bean。
其中,CommandLink的代碼如下:
<af:commandLink text="#{row.DepartmentId}" id="cl1" action="#{myBackingBean.selectLink_action}">
<af:setPropertyListener from="#{row.DepartmentId}" to="#{requestScope.deptId}" type="action"/>
<af:setPropertyListener from="#{row.DepartmentId}" to="#{pageFlowScope.pf_deptId}" type="action"/>
</af:commandLink>
CommandButton的代碼如下:
<af:commandButton text="Select Department" id="cb1" actionListener="#{myBackingBean.selectButton_actionListener}"/>
場景1:點選CommandButton,然後觸發CommandLink的Action事件,即相當于點選了CommandLink。
(1)CommandLink上的Action代碼如下:
public String selectLink_action() {
FacesContext fctx = FacesContext.getCurrentInstance();
UIViewRoot root = fctx.getViewRoot();
RichCommandButton rcb = (RichCommandButton)root.findComponent("cb1");
System.out.println("#################### " + rcb);
ADFContext ac = ADFContext.getCurrent();
Map requestScope = ac.getRequestScope();
Map pageFlowScope = ac.getPageFlowScope();
requestScope.put("deptId", JSFUtils.getManagedBeanValue("bindings.DepartmentId.inputValue"));
pageFlowScope.put("pf_deptId", JSFUtils.getManagedBeanValue("bindings.DepartmentId.inputValue"));
return "toEmployees";
}
注意,之是以在這裡要給RequestScope和PageFlowScope變量重新指派,是因為通過程式無法觸發setPropertyListener。
(2)CommandButton上的Action代碼如下:
public void selectButton_actionListener(ActionEvent evt) {
RichCommandButton rcb = (RichCommandButton)evt.getSource();
RichCommandLink rcl = (RichCommandLink)rcb.findComponent("t1:cl1");
ActionEvent actionEvent = new ActionEvent(rcl);
actionEvent.queue();
}
其原理是:找到CommandLink對象,為其建立一個ActionEvent事件,并壓入事件隊列。
這樣就相當于觸發了CommandLink的Action事件。
場景2:點選CommandLink,然後觸發CommandButton的Action事件,即相當于點選了CommandButton。
(1)CommandLink上的Action代碼如下:
public String selectLink_action() {
FacesContext fctx = FacesContext.getCurrentInstance();
UIViewRoot root = fctx.getViewRoot();
RichCommandButton rcb = (RichCommandButton)root.findComponent("cb1");
ActionEvent actionEvent = new ActionEvent(rcb);
actionEvent.queue();
return "toEmployees";
}
其原理是:找到CommandButton對象,為其建立一個ActionEvent事件,并壓入事件隊列。
這樣就相當于觸發了CommandButton的Action事件。
(2)CommandButton上的Action代碼如下:
public void selectButton_actionListener(ActionEvent evt) {
ADFContext ac = ADFContext.getCurrent();
Map requestScope = ac.getRequestScope();
System.out.println("#################### " + requestScope.get("deptId"));
Map pageFlowScope = ac.getPageFlowScope();
System.out.println("#################### " + pageFlowScope.get("pf_deptId"));
}
因為在CommandLink中已經使用SetPropertyListener為RequestScope和PageFlowScope變量指派了,這裡隻是擷取這些變量,并列印出來。
場景3:點選CommandLink,然後通過ClientListener觸發CommandButton的Action事件,即相當于點選了CommandButton。
場景3與場景2是一樣的,不過實作方式不同,場景3是通過ClientListener調用JavaScript函數實作的。
(1)修改department.jsf頁面,為CommandLink增加ClientListener及相應的JavaScript函數。
JavaScript 函數:
<af:resource type="javascript">
function clickOnCommandLink(evt) {
var cmdButton = AdfPage.PAGE.findComponentByAbsoluteId("cb1");
AdfActionEvent.queue(cmdButton, cmdButton.getPartialSubmit());
}
</af:resource>
其原理是:找到CommandButton對象,然後為其壓入一個ActionEvent到事件隊列中。
CommandLink代碼:
<af:commandLink text="#{row.DepartmentId}" id="cl1" action="#{myBackingBean.selectLink_action}">
<af:setPropertyListener from="#{row.DepartmentId}" to="#{requestScope.deptId}" type="action"/>
<af:setPropertyListener from="#{row.DepartmentId}" to="#{pageFlowScope.pf_deptId}"
type="action"/>
<af:clientListener type="click" method="clickOnCommandLink"/>
</af:commandLink>
(2)Managed Bean代碼修改如下:
CommandLink的Action事件,因為已經通過JavaScript函數觸發CommandButton上的事件了,這裡隻要傳回導航String就可以了。
public String selectLink_action() {
return "toEmployees";
}
CommandButton的Action Listener的代碼不變:
public void selectButton_actionListener(ActionEvent evt) {
ADFContext ac = ADFContext.getCurrent();
Map requestScope = ac.getRequestScope();
System.out.println("#################### " + requestScope.get("deptId"));
Map pageFlowScope = ac.getPageFlowScope();
System.out.println("#################### " + pageFlowScope.get("pf_deptId"));
}
參考:
1. http://jjzheng.blogspot.com/2011/06/invoke-actions-on-non-command-component.html