是否有必要使用EL来获取JSF中的“当前”bean?

时间:2012-08-04 16:59:21

标签: jsf

我正在尝试修复JSF应用程序中的一些错误,其中包括在“faces-config.xml”中声明的类“UserBean”的会话范围的bean“userBean”。其中一种方法的代码如下:

public void doSomething() {
    ...
    UserBean userBean = (UserBean) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{userBean}", UserBean.class);
    ...
}

有没有理由使用那个长表达而不仅仅是“这个”?或者,如果一切都被正确声明,我是否可以确信方法正在执行的实例实际上是与会话相关联的bean?

1 个答案:

答案 0 :(得分:2)

您可以测试它是否是同一个bean,只需比较引用并触发方法的执行,看看会发生什么:

public void doSomething() {
    UserBean userBean = (UserBean) facesContext.getApplication().
      evaluateExpressionGet(facesContext, "#{userBean}", UserBean.class);
    if (this == userBean){
        System.out.println("\nIt is the same bean, time for some cleanup!");
    } else {
        System.out.println("\nThere is something very weird going on here...");
    }
}

请记住,thisuserBean只是引用,指向内存中的某个区域。如果它们始终相同,则可以安全地用this替换表达式。

如果有人首先在另一个地方编写代码,然后有人重构它将这段代码移动到同一个bean并忘记更改此引用,我可以看到这种情况发生。