调用action方法后设置另一个bean的属性

时间:2015-10-29 14:34:35

标签: jsf jsf-2.2 mojarra

Mojarra 2.2

我有两个豆子。

public class MyBean1{

    private String myProperty1;
    //GET, SET, CTOR

    public void doAction(){
         //assign something to myProperty1
    }
}

public class MyBean2{

    private String myProperty2;
    //GET, SET, CTOR
}

现在,我需要在MyBean1::myProperty1方法调用之后通过单击按钮将属性MyBean2::myProperty2的值分配给doAction()

<h:commandButton action="#{myBean1.doAction}">
     <f:setPropertyActionListener target="#{myBean2.myProperty2}"
                                   value="#{myBean1.myProperty1}" />
</h:commandButton>

但它不起作用。我发现它由于以下原因而无法正常工作:

单击按钮会导致ActionEvent广播。它通过此方法执行(javax.faces.component.UICommand):

public void broadcast(FacesEvent event) throws AbortProcessingException {

    super.broadcast(event); //1       <-------------------- HERE

    if (event instanceof ActionEvent) {
        FacesContext context = getFacesContext();


        MethodBinding mb = getActionListener();
        if (mb != null) {
            mb.invoke(context, new Object[] { event });
        }


        ActionListener listener =
        context.getApplication().getActionListener();
        if (listener != null) {
            listener.processAction((ActionEvent) event);
        }
    }
}

我注意到点击该按钮的ActionEvent广播由两位听众处理,一位来自super.broadcast(event) //1 com.sun.faces.facelets.tag.jsf.core.SetPropertyActionListenerHandler.SetPropertyListener的{​​{1}} MyBean1:getMyProperty1()

在 调用操作方法之前, 执行处理。

当然,我可以将动作方法invokation嵌入到myProperty1 getter中,因此 $('.box-menu').each (index, value) -> @boxes.push new LW.Box.Box @ajax, $(this).data('type') 字段将被正确初始化,但对我来说似乎非常奇怪。实现这一目标的正确方法是什么?

0 个答案:

没有答案