【问题标题】:JSF bean URLAction gets called everytimeJSF bean URL Action 每次都会被调用
【发布时间】:2013-04-27 20:52:20
【问题描述】:
@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,但没有帮助

【问题讨论】:

  • load() 是否绑定到任何组件?
  • @kolossus 我该如何检查
  • 检查视图以查看是否有任何 JSF 组件的操作直接或间接(通过另一种方法)绑定到 load() 方法

标签: java jsf jakarta-ee prettyfaces


【解决方案1】:

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

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

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

【讨论】:

  • tnx,与使用构造函数或后构造函数相比,使用带有 onPostBack=false 的 urlaction 有什么优势吗?
  • @Spring I won't advise using a constructor@PostConstruct 将实现基本相同的目标,但您需要小心使用 @RequestScoped bean。
  • @PostConstruct 将在注入路径参数之前执行
  • @chkal,你指的是 PrettyFaces 路径参数还是 JSF 获取参数注入?
  • @chkal, that is absolutely untrue for JSF @ManagedProperty,至少对于 Mojarra 而言。如果这是真的,@PostConstruct 的全部意义将毫无意义。自己试试看。如果发生这种情况,it must be a bug in the impl
【解决方案2】:

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

【讨论】:

  • 您能否在回答中更具描述性并解释问题,或者这应该是评论
  • 你说得对,我本可以更具描述性。到目前为止还没有足够的意义离开 cmets ;-)。无论如何,希望它有所帮助。
【解决方案3】:

如果您想使用@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 发布时,您可以使用 &lt;f:viewAction&gt; 而不是 &lt;f:event&gt; 使用相同的方法,但无需检查,例如:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多