基本上我正在尝试为<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);
答案 0 :(得分:2)
您需要UICommand#addActionListener()
,而不是UICommand#setActionListener()
。 setActionListener()
是JSF 1.x中不推荐使用的方法,它有效地为<p:commandLink actionListener="...">
提供ValueBinding
。
至于以编程方式创建<f:setPropertyActionListener>
,遗憾的是没有JSF实现独立的方式。选择以下任一选项:
使用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.*
是一种不好的做法。
创建一个自定义ActionListener
实现来完成这项工作。基本上,只需将来自Mojarra或MyFaces源代码的类源代码复制到您的包中。与1)相比,这样做的好处是,当部署到捆绑了其他JSF实现的Java EE容器时,您的Web应用程序不会中断。
利用EL 2.2功能在EL表达式中传递方法参数。然后,您可以在action
或actionListener
属性中执行此任务:
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)}" />