【问题标题】:Calling methods from JSF page doubtsJSF页面疑点中的调用方法
【发布时间】:2011-09-29 12:15:00
【问题描述】:

关于我在 EL 中调用方法的方式,我有几个问题。也许有人可以解释它实际上是如何工作的。

我做了这个非常简单的例子:

index.xhtml

<h:body>
<!-- Using a method -->
#{bba.salute()}
<br/>
<h:outputText value="#{bba.salute()}"/>
<br/>
<!-- Using a method from an injected bean-->
 #{bba.b.doSomething()} 
</h:body>

BackBeanA.java

@Named("bba")
@SessionScoped
public class BackBeanA implements Serializable {

    private static final long serialVersionUID = 5671761649767605303L;
    @Inject
    private BackBeanB b;

    public String salute() {
        return "Hi! I am 'A'";
    }

    public BackBeanB getB() {
        return b;
    }

    public void setB(BackBeanB b) {
        this.b = b;
    }   
}

BackBeanB.java

@Named("bbb")
@SessionScoped
public class BackBeanB implements Serializable {

    private static final long serialVersionUID = -4786092545430477941L;

    public String doSomething() {
        System.out.println("Hello!!!");
        return "I am a SessionScopped Backing Bean, my name is 'B' and i am doing something";
    }
}

这是我的问题:

  1. 当我从 backing bean 调用方法时,什么时候需要使用方括号 (),什么时候不需要?示例:如果我从 #{bba.salute()} 中删除括号,我会收到一条错误消息(找不到名为“salute”的属性)

  2. 我还想学习如何从注入的 bean 中调用方法。我在BackBeanA中注入了BackBeanB,但是当我在页面中说#{bba.salute()}时,我没有看到来自BackBeanB中的方法的消息。这是为什么?注入的 bean 不需要在 @PostConstruct 中初始化,对吗?注入的 bean 的 getter 和 setter 够用吗?

  3. 注意我说&lt;h:outputText value="#{bba.salute()}"/&gt; 的那一行,它可以工作,但 eclipse 会显示如下警告:

    这是为什么呢?

【问题讨论】:

  • 关于你的评论:"//这个bean的范围只能大于包含它的bean。".使用 CDI 时这是不正确的。删除评论,只会让你自己和未来的维护者感到困惑。
  • 感谢您的建议,我将删除它

标签: java jsf jakarta-ee jsf-2 el


【解决方案1】:

当您编写 #{myBean.salute} 时,JSF 正在寻找 属性 salute。在 Java 代码中,它被“翻译”为myBean.getSalute();。换句话说,您必须为此属性提供 getter(如果此属性可以被 JSF 修改,例如在输入字段中使用时,则最终提供 setter)。

当您编写#{myBean.salute()} 时,您指的是方法 salute()

规则很简单:当你想做一个动作时使用一个方法(即通常它会在actionactionListener 属性中定义)。在其他情况下,使用属性。 在您的示例中,您想在页面中显示一些文本,因此只需调用 #{myBean.salute()},只需调用 #{myBean.salute}

对于第二点,尝试更改代码以访问属性something 而不是方法:

<!-- Using a method from an injected bean-->
#{bba.b.something} 

BeanB 代码中:

public String getSomething() {
    System.out.println("Hello!!!");
    return "I am a SessionScopped Backing Bean, my name is 'B' and i am doing something";
}

关于您的最后一点,我认为您的 Eclipse 根本无法处理 EL 2.0 语法。

【讨论】:

  • 在第 2 点。是否可以访问方法?我看到可以作为属性访问,但我有兴趣将其作为方法调用,如第 1 点所示。这可能吗?关于第 3 点,您知道如何使 Eclipse EL 语法兼容吗?
  • 1) #{bean.getSalute()} 2) 如果您不使用 Glassfish 插件/JBoss 工具,只需在 Eclipse 中关闭 EL 验证。
  • 总是翻译成getSalute()吗?或者如果它是一个布尔函数可以翻译成isSalute()?
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多