如何以编程方式实现<f:setpropertyactionlistener> </f:setpropertyactionlistener>

时间:2013-11-18 04:23:40

标签: jsf primefaces commandlink

基本上我正在尝试为<p:datatable>设置动态列。

我的一个列的内容是p:commandLink,用于显示文本编辑对话框,我的工作就像XHTML中的一个魅力,但我需要将其转换为Java以进行动态用户自定义和偏好。

这是我的XHTML版本:

<p:commandLink id="MRepShowButton" update=":form1:display" onclick="EditorDialog.show();"  title="Editer le compte rendu"> 
     <f:setPropertyActionListener value="#{exam}" target="#{examenListBean.selectedExamen}" />  
</p:commandLink>

这是我的Java版本(不工作):

CommandLink rapstatelink = (CommandLink)application.createComponent(CommandLink.COMPONENT_TYPE);
rapstatelink.setId("MRepShowButton");
rapstatelink.setUpdate(":form1:display");
rapstatelink.setOnclick("EditorDialog.show();");
rapstatelink.setTitle("Editer le rapport du patient");

ValueExpression target = ef.createValueExpression(elc, "#{exam}", Object.class);
ValueExpression value = ef.createValueExpression(elc, "#{examenListBean.selectedExamen}", Object.class);


//rapstatelink.setActionListener(new SetPropertyActionListenerHandler(**i don't know wht to do here **));
column.getChildren().add(rapstatelink);
 table.getChildren().add(column);

1 个答案:

答案 0 :(得分:2)

您需要UICommand#addActionListener(),而不是UICommand#setActionListener()setActionListener()是JSF 1.x中不推荐使用的方法,它有效地为<p:commandLink actionListener="...">提供ValueBinding

至于以编程方式创建<f:setPropertyActionListener>,遗憾的是没有JSF实现独立的方式。选择以下任一选项:

  1. 使用JSF实现特定类,如果Mojarra是com.sun.faces.taglib.jsf_core.SetPropertyActionListenerImpl

    link.addActionListener(new SetPropertyActionListenerImpl(target, value));
    

    如果MyFaces是org.apache.myfaces.event.SetPropertyActionListener

    link.addActionListener(new SetPropertyActionListener(target, value));
    

    请记住,在您自己的代码中使用特定于JSF实现的类com.sun.faces.*org.apache.myfaces.*是一种不好的做法。


  2. 创建一个自定义ActionListener实现来完成这项工作。基本上,只需将来自MojarraMyFaces源代码的类源代码复制到您的包中。与1)相比,这样做的好处是,当部署到捆绑了其他JSF实现的Java EE容器时,您的Web应用程序不会中断。


  3. 利用EL 2.2功能在EL表达式中传递方法参数。然后,您可以在actionactionListener属性中执行此任务:

    link.setActionExpression(ef.createMethodExpression(elc, 
       "#{examenListBean.setSelectedExamen(exam)}", Void.class, Exam.class));
    

    Exam.class应代表#{exam}的类型)

    这与

    实际上相同
    <p:commandLink ... action="#{examenListBean.setSelectedExamen(exam)}" />
    

    或者如果你真的需要设置一个动作监听器:

    link.addActionListener(new MethodExpressionActionListener(ef.createMethodExpression(elc, 
       "#{examenListBean.setSelectedExamen(exam)}", Void.class, Exam.class)));
    

    这与

    实际上相同
    <p:commandLink ... actionListener="#{examenListBean.setSelectedExamen(exam)}" />