2

@PostConstruct メソッドでいくつかのコードを実行する jsf アプリケーションがあります。

@PostConstruct
public void init() {
    try {
        // Do some form preparation
    } catch (Exception e) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().dispatch("error.faces");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }


}

そして、私はこのerror.xhtmlを持っています:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui" template="/templates/main.xhtml">
    <ui:define name="title">
        <title>#{msg['page.title']}</title>
    </ui:define>
    <ui:define name="body">
        #{msg['global.error']}
    </ui:define>
</ui:composition>

ここで、「global.error」と「page.title」をリソース バンドルとして静的にしないようにします。代わりに、必要なメッセージを post コンストラクトのどこかに渡して、error.xhtml が読み取って表示できるようにする必要があります。これは、この画面をすべての画面から参照する必要があるため、検索画面で「検索中にエラーが発生しました」と表示され、別の画面で「データの取得中にエラーが発生しました」または「要求したユーザーがシステムに存在しません」と表示される可能性があるためです。

4

1 に答える 1

0

機能を実現するために使用でき#{flash}ます:

@PostConstruct
public void init() {
    try {
        // Do some form preparation
    } catch (Exception e) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().getFlash().put("title", "Custom title");
            FacesContext.getCurrentInstance().getExternalContext().getFlash().put("error", "Custom error description");
            FacesContext.getCurrentInstance().getExternalContext().dispatch("error.faces");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

ビュー付き:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui" template="/templates/main.xhtml">
    <ui:define name="title">
        <title>#{flash['title']}</title>
    </ui:define>
    <ui:define name="body">
        #{flash['error']}
    </ui:define>
</ui:composition>

このアプローチは、リダイレクトの実行中にも機能します。

または、転送を行っている場合は、両方のメッセージをフィールドとして Bean に入力し、それをリクエスト属性として添付して、エラー ビューで通常の方法でアクセスすることもできます。

于 2013-06-02T10:58:21.970 に答える