1

我有:SP/JSF 网页 DelegateBean.jsp 关联的 bean DelegateBean.java

委托Bean.java:

String msg;

public DelegateBean() {}
  clearMsg();
  ...
}

public void clearMsg() {
   msg = "":
}
.. other methods

当页面第一次打开时,会调用构造函数 DelegateBean()。

如果操作员按下页面上的命令按钮,刷新页面,则不调用构造函数(也不应该调用);

如果操作员按下后退按钮,然后按下前进按钮,构造函数不会被调用(它可能不应该被调用)。

问题是:如何强制 clearMsg() 在从转发按钮(另一个网页)重新进入时执行,但在从自身重新进入时不执行(按下命令按钮)?

有没有好的(简单)例子?

谢谢,约翰

4

2 回答 2

1

看起来就像您的托管 Bean 一样,@SessionScoped并且只有在使用 bean 时用户第一次访问页面时才会调用构造函数。

在 JSF 2 中,这可以通过将 Managed Bean 更改为@ViewScoped.

@ManagedBean
@ViewScoped
public class Bean {

    public Bean() {
    }

    @PostConstruct
    public void init() {
        clearMsg();
    }
}

BalusC 在这个答案中对 JSF Managed Bean 范围给出了很好的解释:如何选择正确的 bean 范围?. 另外,我建议您阅读答案底部的链接,以更好地理解这些概念。


faces-config.xml在 JSF 1.x 中,您应该将托管 Bean 配置为在文件中请求范围并clearMsg@PostConstruct public void init方法中调用。请注意,这意味着clearMsg将在涉及创建托管 bean 类的每个请求(甚至是 ajax 请求)上调用该方法。为了解决这个问题,您应该提供有关如何以及何时在 JSF 代码中调用此 bean 的更多信息。默认情况下,您可以通过在会话中设置一个标志并在调用clearMsg方法(或只需要调用一次的方法)之前检查此标志来解决此问题。

public class Bean {

    public Bean() {
    }

    @PostConstruct
    public void init() {
        HttpSession session = ((HttpRequest)FacesContext.getCurrentInstance().
            getExternalContext().getRequest()).getSession();
        if (session.getAttribute("flag") == null) {
            clearMsg();
            //other methods...
        }
    }
}

面配置

<managed-bean>
    <managed-bean-name>bean</managed-bean-name>
    <managed-bean-class>your.package.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>

有一种方法可以通过@ViewScoped使用@KeepAlive来自RichFaces 3. 考虑到 bean 将一直处于活动状态,直到您通过显式重定向更改视图。基于此,代码将是这样的:

@KeepAlive
public class Bean {

    public Bean() {
    }

    @PostConstruct
    public void init() {
        //no need to use session flags
        clearMsg();
        //other methods...
    }
}
于 2012-11-01T00:04:21.690 回答
0

faces-config.xml 中 bean 的范围是什么?

正如您描述的问题,看起来是这样session,因为每个会话都在构造哪个 bean 而不是请求。

将范围更改为request,您可能应该很好。

根据与@BalusC 的讨论进行更新

上述request范围与要求相冲突not to be called from the same page

如果您使用的是 jsf 2.x,请将范围更改为viewscope.

更新#2

我认为看到您的要求,jsf 1.2并且不能更改 bean 的范围。

最简单的方法是添加clearmessage()对前进按钮内部操作的显式调用

于 2012-10-31T23:36:29.853 回答