每次都会调用JSF bean URLAction

时间:2013-05-03 12:37:05

标签: java jsf java-ee prettyfaces

@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}"

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

我怎么能阻止这个?我试图也使用@ViewScope但没有帮助

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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。