天天看點

如何通過程式觸發按鈕上的Action事件?

轉載自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

ADF