Java JSF,facelets上的actionlistener

Java JSF,facelets上的actionlistener,java,jsf,Java,Jsf,我将JSF(Mojarra 1.2)与Richfaces(3.3.2)一起在一些用作Portlet的Facelet中使用(我在这里使用JBossPortlet桥2.0)。现在我面临着一些奇怪的事情:我的上有一个actionlistener,当点击按钮时会触发,但当我只是重新加载页面时,每次再次加载页面时都会执行该操作。只有在我之前已经触发了操作时才会发生这种情况。这种行为正常吗 我应该注意到Spring2.5是用来管理我的bean的,提到的bean是会话范围bean,也许这是一个有趣的点 是,重

我将JSF(Mojarra 1.2)与Richfaces(3.3.2)一起在一些用作Portlet的Facelet中使用(我在这里使用JBossPortlet桥2.0)。现在我面临着一些奇怪的事情:我的
上有一个
actionlistener
,当点击按钮时会触发,但当我只是重新加载页面时,每次再次加载页面时都会执行该操作。只有在我之前已经触发了操作时才会发生这种情况。这种行为正常吗


我应该注意到Spring2.5是用来管理我的bean的,提到的bean是会话范围bean,也许这是一个有趣的点

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

对此,一个众所周知的解决方法是。基本上,您需要在处理操作后立即将POST请求重定向到GET请求,这样结果页面将由HTTP GET请求交付。刷新此HTTP GET请求将不再执行初始HTTP POST请求

然而,这个模式有一个警告:因为它涉及一个全新的请求,所以所有请求范围的bean都会在新请求中被丢弃和更新。因此,如果希望在新请求中保留数据,则需要将其作为GET参数传递,或者将其存储在会话范围中。通常只要在bean的构造函数中重新加载数据就足够了。但是,既然您提到只使用会话范围的bean(这不是最佳实践,但撇开这一点不谈),这对您来说应该不是什么大问题

在JSF中打开PRG相对容易,只需将以下条目添加到相关的

<redirect />

感谢您的回复BalusC-但是如果我只切换到另一个portlet页面,然后再切换回我的JSFPortlet,它仍然保存会话bean中的对象,那么操作也会执行。如果我不是完全错的话,这不应该发生,或者我错了吗?注意:我在这里只使用会话范围的bean,因为它非常适合我的小portlet,它只显示一点点数据。我说的是plurals,它只有一个JSF页面和一个支持bean。你实现了
?没有-如果我没有导航规则,我只得到一个页面,其中我用我的dataTable呈现了一个面板组。问题是由这种情况引起的吗?哦,是基于ajax的请求吗?
public void submit(ActionEvent event) {
    // ...
    FacesContext.getCurrentInstance().getExternalContext().redirect(someURL);
}