web-dev-qa-db-ja.com

Spring MVCベースのサイト(注釈コントローラー)のステータスメッセージ

注釈コントローラーを使用して、Spring MVCベースのサイトでステータスメッセージ(「データが正常に保存/追加/削除されました」)を整理するための最良の方法は何ですか?

したがって、問題は、コントローラーのPOSTメソッドからメッセージを送信する方法にあります。

26
olegflo

Muanisが述べたように、春の3.1以降、最善のアプローチはRedirectAttributesを使用することです。ブログのサンプルにi18nを追加しました。したがって、これは完全なサンプルになります。

@RequestMapping("/users")
@Controller
public class UsersController {

            @Autowired
            private MessageSource messageSource;

            @RequestMapping(method = RequestMethod.POST, produces = "text/html")
            public String create(@Valid User user, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest, Locale locale, RedirectAttributes redirectAttributes) {
                ...
                ...
                redirectAttributes.addFlashAttribute("SUCCESS_MESSAGE", messageSource.getMessage("label_user_saved_successfully", new String[] {user.getUserId()}, locale));
                return "redirect:/users/" + encodeUrlPathSegment("" + user.getId(), httpServletRequest);
            }
    ...
    ...
}

メッセージバンドルに適切なメッセージ、たとえばmessages.propertiesを追加します。

label_user_saved_successfully=Successfully saved user: {0}

関連する属性を使用するようにjspxファイルを編集します

<c:if test="${SUCCESS_MESSAGE != null}">
  <div id="status_message">${SUCCESS_MESSAGE}</div>
</c:if> 
16
krishnakumarp

実証済みのアプローチは、次のGET要求まで保持する必要があるメッセージに特別なフラッシュスコープを使用することです。

セッションスコープのフラッシュオブジェクトを使用するのが好きです。

public interface Flash {
    void info(String message, Serializable... arguments);
    void error(String message, Serializable... arguments);
    Map<String, MessageSourceResolvable> getMessages();
    void reset();
}

@Component("flash")
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
public class FlashImpl implements Flash {
    ...
}

特別なMVCインターセプターがフラッシュオブジェクトからフラッシュ値を読み取り、それらをリクエストスコープに配置します。

public class FlashInterceptor implements WebRequestInterceptor {
    @Autowired
    private Flash flash;

    @Override
    public void preHandle(WebRequest request) {
        final Map<String, ?> messages = flash.getMessages();
        request.setAttribute("flash", messages, RequestAttributes.SCOPE_REQUEST);

        for (Map.Entry<String, ?> entry : messages.entrySet()) {
            final String key = "flash" + entry.getKey();
            request.setAttribute(key, entry.getValue(), RequestAttributes.SCOPE_REQUEST);
        }

        flash.reset();
    }

    ...
}

これで、コントローラーでメッセージを「フラッシュスコープ」に配置できます。

@Conteroller
public class ... {
    @Autowired
    private Flash flash;

    @RequestMapping(...)
    public void doSomething(...) {
        // do some stuff...
        flash.info("your.message.key", arg0, arg1, ...);
    }
}

あなたの見解では、フラッシュメッセージを繰り返し処理します。

<c:forEach var="entry" items="${flash}">
    <div class="flash" id="flash-${entry.key}">
        <spring:message message="${entry.value}" />
    </div>
</c:forEach>

これがお役に立てば幸いです。

8
Philipp Jardas

しばらく頭を叩いた後、ようやくうまくいきました。

私はSpring3.1を使用しており、リダイレクトを介して渡されるrequestFlashAttributesをサポートしています。

私の問題を解決するための鍵は、戻り値の型をModelAndViewオブジェクトではなく文字列に変更することでした。

この男は、Springでのフラッシュメッセージの使用について優れた投稿をしました(http://www.tikalk.com/Java/redirectattributes-new-feature-spring-mvc-31)

1
Jose Muanis

JSPにメッセージを表示する最も簡単な方法は、表示するメッセージを含むスコープ(セッション、リクエストなど)のオブジェクトを用意することです。たとえば、次のことができます。

... Java stuff ...
List messages = new ArrayList();
messages.add("some message");
messages.add("some other message");
request.addAttribute("NotableMessages", messages);
... Java stuff ...

... jsp and JSTL stuff ...
<c:if test="not empty NotableMessages">
<ul>
<c:forEach items="${NotableMessages}" var="item">
<li>${item}</li>
</c:forEach>
</ul>
</c:if>
... jsp stuff ...
0
DwB

シンプルに保ち、特定のHTTP1.1ステータスコードを使用する必要があります。したがって、通話が成功すると、200OKが返されます。また、クライアント側では、コントローラーが200を返したときにユーザーに特定のメッセージを表示する場合は、そこに表示します。

0
Robby Pond

適切なステータスコードとともに、必要な特定のメッセージを含むヘッダーをいつでも設定できます。もちろん、これは、コントローラーの使用方法を制御できる場合(つまり、サードパーティがない場合)にのみ有効です。

0
AHungerArtist

POSTの後にページが再読み込みされることを意味する場合は、ビューにフラグ(JSPまたは速度または使用するもの)を含めることができます。例えば。このようなもの

<c:if test="${not empty resultMessage}">
 <spring:message code="${resultMessage}" />
</c:if>

また、メッセージバンドルには、そのコードのメッセージが含まれている必要があります。

AJAX POSTデータを送信する(つまり、ページがリロードされておらず、メッセージを表示する必要がある)場合)

1)JSファイルを動的にし(JSPまたはVelocity)、そこに<spring:message>タグを挿入します(このオプションはあまり好きではありません)

または

2) このリンク からのアドバイスに従い、@ResponseBodyを使用してステータスオブジェクトをJSに返します。 @ResponseBodyとしてマークしたオブジェクトの中に、ステータスとメッセージの両方を入れることができます。例えば。 この場合 のようにメッセージバンドルを使用します。

0
Leonid