Java の世界で「更新成功」 http://api.rubyonrails.org/classes/ActionController/Flash.htmlなどの Rails のようなフラッシュ メッセージを実現する最善の方法は何ですか? Spring MVC を使用しています。
5 に答える
セッション スコープ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>
これをセッション全体の HashTable として実装し、文字列キーをカスタム FlashItem オブジェクトにマッピングすることをお勧めします。FlashItem には、保存しているオブジェクトまたは文字列とブール値 (おそらく IsNew と呼ばれる) が含まれているだけで、新しいアイテムを HashTable に挿入するときに true に設定する必要があります。
ページを読み込むたびに、HashTable を反復処理し、IsNew = true アイテムを false に設定し、IsNew が既に false であるアイテムを削除します。これにより、Rails のフラッシュ機能に似た機能が得られるはずです。
これは Spring MVC 3.1.RC1 に追加されました。
3.1.15 Flash 属性と RedirectAttributes
Flash 属性を FlashMap に格納し、HTTP セッションに保存して、リダイレクト後も存続できるようになりました。Spring MVC でのフラッシュ属性の一般的なサポートの概要については、セクション16.6「フラッシュ属性の使用」</a> を参照してください。
アノテーション付きコントローラーでは、@RequestMapping メソッドは、タイプ RedirectAttributes のメソッド引数を宣言することにより、フラッシュ属性を追加できます。このメソッド引数は、リダイレクト シナリオで使用される属性を正確に制御するためにも使用できるようになりました。詳細については、セクション 16.3.3.10「リダイレクトおよびフラッシュ属性の指定」</a> を参照してください。
次のように、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(); 「リダイレクト:どこか」を返します。 } }
Spring Java アプリに多大な労力を費やしていない場合は、jruby で Rails を実行することを検討できます。Rails で jRuby を実行する利点は、Ruby gem と Java ライブラリを組み合わせて使用できることです。
アプリケーションにすでにかなりの量の作業を行っている場合、これはオプションではない可能性が高くなります。