【问题标题】:JSF -> Using one action listener for two action buttonJSF -> 为两个动作按钮使用一个动作监听器
【发布时间】:2015-08-21 16:58:53
【问题描述】:

我有一个托管 bean,我在其中定义了两个执行两个不同操作的方法。我在 .xhtml 页面中定义了两个按钮,它们执行两种不同的操作。 我创建了一个 ActionListener 实现类。在这个类中,我想根据按钮的值执行两种不同的操作之一。 我应该编写什么代码来检索 ActionListener 实现类中按钮的值,以及我应该如何定义两个按钮以确保使用相同的动作侦听器

【问题讨论】:

  • "在这个类中,我想根据按钮的值执行两种不同的操作之一"。根据共享操作(侦听器)方法中按钮的值(或某些其他属性)执行不同的操作是一种设计气味/缺陷,应绝对避免。这应该根据每个命令按钮或命令链接使用单独的操作(侦听器)单击哪个按钮来完成。

标签: jsf


【解决方案1】:

您可能已经知道,ActionListener 接口定义了一个abstract 方法,称为processAction(ActionEvent event)

参数ActionEvent可用于检索事件源、旧值/新值(当将动作监听器附加到某些特定组件等时)。

所以,你可以获取组件的客户端id,例如,只需这样做:

package com.somepackage;
...
public class MyActionListener implements ActionListener {
    public void processAction(ActionEvent event) {
        String componentId = event.getComponent().getClientId();
        ...
    }
}

...我应该如何定义这两个按钮以确保它们使用相同的动作监听器?

对于这两个按钮,您必须嵌套 <f:actionListener> 并确保其type 属性指向您的动作侦听器的完全限定类名。例如:

<h:commandButton id="buttonA">
    <f:actionListener type="com.somepackage.MyActionListener" />
</h:commandButton>
<h:commandButton id="buttonB">
    <f:actionListener type="com.somepackage.MyActionListener" />
</h:commandButton>

【讨论】:

  • “完全限定的类名”是什么意思?
  • 如果一个类被称为MyClass并且它是在包com.something中定义的,那么完全限定的类名是com.something.MyClass
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 2013-01-04
  • 1970-01-01
  • 2013-12-24
  • 2013-03-01
  • 2013-04-28
  • 2023-04-06
  • 2021-03-13
相关资源
最近更新 更多