Как предотвратить многократный вызов метода bean-объекта в запросе в приложении JSF? - PullRequest
1 голос
/ 14 октября 2010

Хорошо, со всеми ответами на на этот вопрос Я все еще не могу решить мою проблему.У меня есть следующее созвездие:

В веб-приложении JSF (1.1) у меня есть боб области действия запроса 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>

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

Сделайте область действия bean-сессии и аннотируйте метод с помощью @PostConstruct.Если вы настаиваете на том, чтобы держать его в области запроса, разделите эту часть на bean-объект области сеанса и сделайте его управляемым свойством bean-объекта области запроса, используя @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 позаботится о том, чтобы он создавался и вызывался только один раз во время сеанса.


Обновление : извините, вы используете 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 голосов
/ 14 октября 2010

Сделайте кнопку отключенной с помощью javascript после ее нажатия.

...