1
@Named
@RequestScoped
@URLMapping(id = "unblock", pattern = "/unblock", viewId = "/unblock.xhtml")
public class Unblock {

@URLAction
public void load(){
    //initialize some values..
}

public void sendRequest(){

}

并在 xhtml 文件中;

 <h:commandButton id="submit action="#{unblockAccount.sendRequest}"

现在,当第一次加载页面时,我的加载方法被正确调用,但是当我单击页面上的提交按钮并调用“sendRequest”方法时,再次调用加载方法。

我怎样才能阻止这个?我也尝试使用@ViewScope,但没有帮助

4

3 回答 3

5

添加onPostBack=false@URLAction以阻止在回发时调用该操作。

回发是对视图的新请求后在 JSF 视图上发起的任何请求

    @URLAction(onPostback=false)
    public void load(){
      //initialize some values..
    }
于 2013-05-03T13:19:23.807 回答
1

您可以使用@PostConstruct,也可以将您的 bean 设置为 ViewScoped。

于 2013-05-03T12:45:27.890 回答
1

如果您想以某种@PostConstruct方法完成工作,您会发现以下方法很有用。它基本上仅在最初加载视图时才初始化数据,并在回发时跳过初始化:

@PostConstruct
public void initialize() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        //load your data
    }
}

或者有时我们可能会使用 JSF 事件监听器。它允许在要呈现视图之前初始化您的数据:

<f:event type="preRenderView" listener="#{bean.initialize}" />

使用相同的方法,但没有@PostConstruct注释:

public void initialize() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        //load your data
    }
}

最后,当 JSF 2.2 发布时,您可以使用相同的方法<f:viewAction>而不是<f:event>使用相同的方法,但无需检查,例如:

<f:viewAction action="#{bean.initialize}" onPostback="false" />

public void initialize() {
    //load your data
}

但是,如果您使用的是 PrettyFaces,请坚持 kolossus 的答案。但是以防万一您不喜欢使用 PrettyFaces 来完成这项工作,以上三种方法始终为您服务。当然,他们将使用“普通”JSF。

于 2013-05-03T14:51:18.303 回答