gpt4 book ai didi

java - JSF,facelets 的 Action 监听器

转载 作者:行者123 更新时间:2023-12-04 06:54:49 27 4
gpt4 key购买 nike

我在一些用作 portlet 的 facelets 中使用 JSF (Mojarra 1.2) 和 Richfaces (3.3.2)(我在这里使用 Jboss Portlet Bridge 2.0)。现在我面临着一些奇怪的事情:我有一个 actionlistener在我的 <h:commandButton>这是触发的,当按钮被点击但当我只是重新加载页面时,每次我再次加载页面时都会执行该操作。仅当我之前已经触发了该操作时才会发生这种情况。这种行为正常吗?

我应该注意到 Spring 2.5 用于管理我的 bean,提到的 bean 是 session 范围的 bean,也许这是一个有趣的点?!

最佳答案

是的,重新加载 HTTP POST 请求将再次执行 HTTP POST 请求,从而再次触发所有相关的服务器端操作。此问题一般会影响所有 Web 应用程序,并且本身与 JSF 无关。

一个众所周知的修复方法是 POST-Redirect-GET (PRG) pattern .基本上,您需要在处理操作后立即将 POST 请求重定向到 GET 请求,以便通过 HTTP GET 请求传递结果页面。刷新此 HTTP GET 请求将不再执行初始 HTTP POST 请求。

然而,这种模式有一个警告:因为它涉及一个全新的请求,所有请求范围的 bean 都会在新请求中被垃圾处理和更新。因此,如果您想保留新请求中的数据,则需要将它们作为 GET 参数传递或将其存储在 session 范围中。通常只需在 bean 的构造函数中重新加载数据就足够了。但是由于您提到仅使用 session 范围的 bean(但这不是最佳实践,但除此之外),这对您来说不应该是一个大问题。

在 JSF 中开启 PRG 相对容易,只需在关联的 <navigation-case> 中添加以下条目即可:

<redirect />

或者,如果您更喜欢以编程方式触发它,请使用 ExternalContext#redirect() 在 bean 的 action 方法中:
public void submit(ActionEvent event) {
// ...
FacesContext.getCurrentInstance().getExternalContext().redirect(someURL);
}

关于java - JSF,facelets 的 Action 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2686664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com