1

わかりました、この質問へのすべての答えで、私はまだ私の問題を処理することができません。私は次の星座を持っています:

beanJSF(1.1)Webアプリケーションに、クラスのリクエストスコープのBeanがありBeanます。ユーザーがすばやく複数回クリックしてページcommandButtonにリダイレクトすると、メソッドが複数回呼び出される場合があります(Tomcat 6の場合)。どうすればこれを防ぐことができますか?insult.xhtmldoSomethingThatTakesALittleLongerAndShouldOnlyBeDoneOnce

...
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>
4

2 に答える 2

2

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は、セッション中に1回だけ作成され、呼び出されるように注意します。


更新:申し訳ありませんが、JSF1.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>
于 2010-10-14T10:58:38.713 に答える
0

ボタンをクリックしたら、javascript でボタンを無効にします。

于 2010-10-14T10:02:06.190 に答える