6

Java の世界で「更新成功」 http://api.rubyonrails.org/classes/ActionController/Flash.htmlなどの Rails のようなフラッシュ メッセージを実現する最善の方法は何ですか? Spring MVC を使用しています。

4

5 に答える 5

6

セッション スコープBeanを使用して、Spring MVC でまさにそれを行いました。

public class FlashImpl implements Flash, Serializable{

private static final long serialVersionUID = 1L;

private static final String ERROR = "error";
private static final String WARNING = "warning";
private static final String NOTICE = "notice";

private String message;
private String klass;

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

public void notice(String message) {
    this.message(NOTICE, message);
}

public void warning(String message) {
    this.message(WARNING, message);
}

public void error(String message) {
    this.message(ERROR, message);
}

public boolean isEmptyMessage() {
    return message == null;
}

public void clear() {
    this.message = null;
    this.klass = null;
}

public String getMessage() {
    String msg = message;
    this.clear();
    return msg;
}

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

public String getKlass() {
    return klass;
}

public void setKlass(String klass) {
    this.klass = klass;
}}

秘訣は、メッセージを初めて読んだときにメッセージを消費することです。このようにして、投稿後のリダイレクトまで生き残ることができます。

リクエストのメッセージは 1 種類だけだと思います!. これが望ましくない場合は、既に提案されているようにハッシュマップを作成できます。

この Bean をコントローラーに注入します (実際には、他のすべてのコントローラーから継承された基本コントローラーに注入します)。

JSP に、次のようなコードを追加する必要があります。

<c:if test="${!flash.emptyMessage}" >
    <div class="${flash.klass}">${fn:escapeXml(flash.message)}</div>
</c:if>
于 2010-01-26T11:15:42.830 に答える
5

これをセッション全体の HashTable として実装し、文字列キーをカスタム FlashItem オブジェクトにマッピングすることをお勧めします。FlashItem には、保存しているオブジェクトまたは文字列とブール値 (おそらく IsNew と呼ばれる) が含まれているだけで、新しいアイテムを HashTable に挿入するときに true に設定する必要があります。

ページを読み込むたびに、HashTable を反復処理し、IsNew = true アイテムを false に設定し、IsNew が既に false であるアイテムを削除します。これにより、Rails のフラッシュ機能に似た機能が得られるはずです。

于 2009-04-07T15:56:04.863 に答える
2

次のように、Spring MVC で Manolo Santos の例を使用しました。

Flash クラスに @Component のアノテーションを付け、boolean 変数を追加して、メッセージがもう 1 つの要求のために存続する必要があるかどうかを示します。

@成分
パブリック クラス フラッシュ {

    プライベート静的最終文字列 INFO = "info";
    private static final String SUCCESS = "成功";
    private static final String ERROR = "エラー";
    private static final String WARNING = "警告";
    private static final String NOTICE = "通知";

    プライベート最終マップ msgs = new HashMap();

    プライベート ブール値 isKept; // もう 1 つのリクエストのために msg を保持します (コントローラ メソッドが別のリクエストにリダイレクトするとき)

    private void message(文字列の重大度、文字列のメッセージ) {
        msgs.put(メッセージ、重大度);
    }

    public void info(文字列メッセージ) {
        this.message(情報、メッセージ);
    }

    public void success(文字列メッセージ) {
        this.message(成功、メッセージ);
    }

    public void notice(文字列メッセージ) {
        this.message(通知、メッセージ);
    }

    public void warning(文字列メッセージ) {
        this.message(警告、メッセージ);
    }

    public void error(文字列メッセージ) {
        this.message(エラー、メッセージ);
    }

    public boolean isEmptyMessage() {
        msgs.isEmpty(); を返します。
    }

    public void clear() {
        msgs.clear();
        isKept = false;
    }

    public Map getMessage() {
        メッセージを返します。
    }

    public boolean isKept() {
        リターンは保持されます。
    }

    public void keep() {
        isKept = true;
    }

    public void unKeep() {
        isKept = false;
    }
}

インターセプターを使用して、フラッシュ メッセージをモデル オブジェクトに追加します。

public class FlashMessageInterceptor extends HandlerInterceptorAdapter {

    @リソース
    フラッシュフラッシュ;

    @オーバーライド
    public void postHandle(HttpServletRequest リクエスト、HttpServletResponse レスポンス、オブジェクト ハンドラ、ModelAndView modelAndView) throws Exception {
        if (!flash.isKept()) {
            modelAndView.addObject("フラッシュ", フラッシュ);
        }
    }

    @オーバーライド
    public void afterCompletion(HttpServletRequest リクエスト、HttpServletResponse レスポンス、オブジェクト ハンドラ、Exception ex) throws Exception {
        if (flash.isKept()) {
            flash.unKeep();
        }
        そうしないと {
            flash.clear();
        }
    }
}

コントローラーで、別のメソッドにリダイレクトするメソッドがある場合は、次のように言うことができます。flush.keep()、フラッシュ メッセージを表示します。

@コントローラ
パブリック クラス ComputerCampLove {

    @リソース
    プライベート フラッシュ フラッシュ;

    @RequestMapping(メソッド = RequestMethod.GET)
    public String takeMeToAnotherPlace(Model モデル) {

        flash.info("ファファファ!");
        flash.keep();

        「リダイレクト:どこか」を返します。
    }
}
于 2011-08-08T14:33:46.297 に答える
0

Spring Java アプリに多大な労力を費やしていない場合は、jruby で Rails を実行することを検討できます。Rails で jRuby を実行する利点は、Ruby gem と Java ライブラリを組み合わせて使用​​できることです。

アプリケーションにすでにかなりの量の作業を行っている場合、これはオプションではない可能性が高くなります。

于 2009-04-07T18:08:39.660 に答える