2010-10-14 2 views
1

Хорошо, со всеми ответами на this question Я все еще не в состоянии справиться со своей проблемой. У меня следующее созвездие:Как предотвратить многократное использование метода бобовых объектов запроса в приложении JSF?

В JSF (1.1) webapp У меня есть запрос на фасоль bean класса Bean. Когда пользователь быстро нажимает на несколько раз, чтобы перенаправить его на страницу 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

2

Сделайте сеанс bean-сессии занятым и аннотируйте метод с помощью @PostConstruct. Если вы настаиваете на том, чтобы он запрашивал область видимости, разделите эту часть на компонент, обработанный сеансом, и сделайте это управляемым свойством компонента с запросом, используя @ManagedProperty.

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

и

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

Тогда JSF будет заботиться о том, как он создается и вызывается только один раз в течение сессии.


Update: извините, вы используете 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. Извините меня за то, что я не достаточно точен с моим примером. Я связан с JSF 1. Я экспериментировал с помещением bean-ов в область сеанса, но с тем же результатом :( – ceggers

+0

См. Ответ на вопрос. – BalusC

+0

Спасибо. Итак, я обречен на JSF 1.1? – ceggers