gpt4 book ai didi

JSF:如何将 actionListener 附加到以编程方式创建的组件?

转载 作者:行者123 更新时间:2023-12-05 01:25:42 25 4
gpt4 key购买 nike

我必须动态创建一些 commandLinks 并附加一些 Action 监听器,所以我放了 <h:panelGrid>在 JSP 页面上并使用此类代码添加命令链接并将操作监听器分配给:

public ManagedBean(){
List<UIComponenet> child = panelGrid.getChilderen();
list.clear();

List<MyClass> myList = getSomeList();

for (MyClass myObj : myList){
FacesContext ctx = FacesContext.getCurrentContext();
HtmlCommandLink cmdLink = (HtmlCommandLink) ctx.getApplication.createComponent(HtmlCommandLink.COMPONENT_TYPE);
cmdLink.setValue(myObj.getName());
cmdLink.setActionLinstner(new ActionListener(){
public void processAction(ActionEvent event) throws AbortProcessingException{
System.out.println (">>>>>>>>>>>>>>>>>I am HERE ");
}
});
child.add(cmdLink);
}
}

但不幸的是,当我按下这个命令链接时,抛出了一个异常!如何在运行时添加组件事件监听器?

(注意,上面的代码包含我刚刚编写的语法/编译错误)。

最佳答案

首先,您需要手动为任何动态创建的 UINamingContainerUIInputUICommand 组件分配 ID。否则 JSF 无法根据请求参数在组件树中定位它们,因为它不会匹配自动生成的 ID。

因此,至少要做到:

HtmlCommandLink link = new HtmlCommandLink();
link.setId("linkId");
// ...

其次,您应该创建一个 ActionListener 作为 MethodExpression如下:

FacesContext context = FacesContext.getCurrentInstance();
MethodExpression methodExpression = context.getApplication().getExpressionFactory().createMethodExpression(
context.getELContext(), "#{bean.actionListener}", null, new Class[] { ActionEvent.class });

link.addActionListener(new MethodExpressionActionListener(methodExpression));
// ...

...当然在 #{bean} 后面的支持 bean 类中有以下方法:

public void actionListener(ActionEvent event) {
// ...
}

以上所有动态内容基本上与以下原始 JSF 标记相同:

<h:commandLink id="linkId" actionListener="#{bean.actionListener}" />

关于JSF:如何将 actionListener 附加到以编程方式创建的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2147786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com