2010-10-14 60 views
1

好的,所有的答案this question我仍然无法处理我的问题。 我有以下星座:如何防止在JSF应用程序中多次调用请求作用域bean方法?

在JSF(1.1)的web应用我有一个请求范围Bean类的bean bean。当用户多次点击commandButton将他重定向到insult.xhtml页面时,可能会多次调用doSomethingThatTakesALittleLongerAndShouldOnlyBeDoneOnce方法(在Tomcat 6上)。我怎样才能防止这一点?

... 
public Bean() { 
    HttpSession session = ((HttpSession) FacesContext.getCurrentInstance() 
      .getExternalContext().getSession(false)); 
    if(session != null && session.getAttribute("done") != null) { 
     doSomethingThatTakesALittleLongerAndShouldOnlyBeDoneOnce(); 
     session.setAttribute("done", "done"); 
    } 
} 

public void doSomethingThatTakesALittleLongerAndShouldOnlyBeDoneOnce() { 
    this.bossInsult = generateBossInsult(); 
} 

insult.xhtml:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> 
<html> 
    <body> 
    #{bean.bossInsult} 
    </body> 
</html> 
</ui:composition> 

回答

0

使用JavaScript禁用按钮,一旦它的点击。

+0

这会工作,不幸的是,真实的情况是从我的例子有点不同。重定向发生在我无法控制的第三方页面上。 – ceggers 2010-10-14 10:13:33

2

使bean会话的作用域和注解方法与@PostConstruct。如果你坚持保持它的请求作用域,将该部分拆分为会话作用域bean,并使用@ManagedProperty将它作为请求作用域bean的托管属性。

@ManagedBean 
@RequestScoped 
public class Bean { 
    @ManagedProperty(value="#{insultBean}") 
    private InsultBean insultBean; 
} 

@ManagedBean 
@SessionScoped 
public class InsultBean { 
    @PostConstruct 
    public void init() { 
     this.bossInsult = generateBossInsult(); 
    } 
} 

那么JSF将采取它的创建,并在会议期间只调用一次护理。


更新:对不起,你使用JSF 1.x的如果是1.2,那么下面实现相同的:

public class Bean { 
    private InsultBean insultBean; 
} 

public class InsultBean { 
    @PostConstruct 
    public void init() { 
     this.bossInsult = generateBossInsult(); 
    } 
} 

<managed-bean> 
    <managed-bean-name>insultBean</managed-bean-name> 
    <managed-bean-class>com.example.InsultBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

<managed-bean> 
    <managed-bean-name>bean</managed-bean-name> 
    <managed-bean-class>com.example.Bean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
     <property-name>insultBean</property-name> 
     <value>#{insultBean}</value> 
    </managed-property> 
</managed-bean> 
+0

Aww。对不起,我的例子不够精确。我试图将bean放在会话范围内但结果相同: – ceggers 2010-10-14 11:13:25

+0

查看答案更新 – BalusC 2010-10-14 11:19:14

+0

谢谢。所以我注定要使用JSF 1.1? – ceggers 2010-10-14 11:30:57

相关问题