2

だから私はこの非常に小さなJSFの例を持っています:

<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>Index</title>
</h:head>
<h:body>
    <h:form>
        <h:commandButton action="#{reqScopedBackingBean.foo()}" value="Submit"/>
    </h:form>
</h:body>
</html>

foo は以下のように実装されます。

package biz.tugay.jsftags;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@RequestScoped
public class ReqScopedBackingBean {
    public String foo() {
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("message", "Success!!");
        return "hello?faces-redirect=true";
    }
}

そして最終的にhello.xhtmlは次のとおりです。

<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>Hello</title>
</h:head>
<h:body>
    <h:outputText value="#{flash.keep.message}"/>
</h:body>
</html>

上記の例では、[送信] をクリックすると、hello.xhtml にリダイレクトされ、"Success!!" というメッセージが表示されます。テキストは問題ありません。ページを更新すると、以下に示すように keep メソッドを呼び出しているため、メッセージが表示されます。

#{flash.keep.message}

次に、別の例に進みます。

index.xhtml と ReqScopedBackingBean は同じですが、今回の hello.xhtml は次のとおりです。

<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>Hello</title>
</h:head>
<h:body>
    #{otherBean.pullValuesFromFlash()}
    <h:outputText value="#{otherBean.message}"/>
</h:body>
</html>

そしてOtherBean.java、次のとおりです。

@ManagedBean
@RequestScoped
public class OtherBean {

    private String message;

    public void pullValuesFromFlash() {
        final Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
        flash.keep("message");
        final String message = (String) flash.get("message");
        setMessage(message);
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

動作が最初の例と同じになることを期待しています。ただし、hello.xhtml を使用している場合、成功メッセージは表示されません。ただし、次の行をコメントアウトすると:

// flash.keep("message");

メッセージが表示されます (ただし、hello.xhtml を更新しても、最初の例のように成功メッセージは再表示されません)。

私の質問は、ここでの違いは何ですか? どうですか

#{flash.keep.message}

とは異なる

flash.keep("message");
final String message = (String) flash.get("message");

?

4

1 に答える 1