@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但没有帮助
答案 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。