How should I send resourcebundle messages across c

2019-09-06 16:35发布

问题:

Most of the spring tutorials and examples show you how to get the message from the resource file and how to show it in your view (jsp), but not how you should handle those messages in your controller and between views.

Here is an example of how im doing it now where I have a view/controller that handles forgotten passwords. When the password is sent I redirect back to the login screen with a message that "your password is sent ..."

@RequestMapping(value="/forgottenpassword")
public String forgottenpassword(@RequestParam String email) {
     ....something something
     if(email != null){
         return "redirect:/login?forgottenpassword=ok";
     }
}

@RequestMapping(value="/login")
public String login(HttpServletRequest request) {
    if(request.getParameter("forgottenpassword") != null && request.getParameter("forgottenpassword").equals("ok")) {
        data.put("ok_forgottenpassword", "forgottenpassword.ok");
    }

    return "login";
}

Finaly I display the message in my view, in this case a freemarker template

<#if (ok_forgottenpassword?exists)>
     <div class="alert alert-success"><@spring.message "${ok_forgottenpassword}" /></div>
</#if>

Is this the best way of doing it in a Spring framework? It's simple with just 1 type of message, but what if I need 5?

回答1:

Just create a simple bean and push it to data. In that bean you can have all the messages what you want loaded from a resourcebundle. (by the way: do you really need the resource bundle? It does a few fancy tricks which are completely unnecessary unless you need i18n. A simple properties file would suffice in almost every other case.)



回答2:

Add errors into list in your controller like

List<String> errorsList = new ArrayList<String>();
errorsList.add("error.invalid.username");
errorsList.add("error.invalid.password");
errorsList.add("error.invalid.passwordResetLinkSent");
.....

Then in jsp page iterate all errors to display like

 <c:if test="${!empty errorsList}">
    <ul>
    <c:forEach var="error" items="${errorsList}">
        <li><spring:message message="${error}"></spring:message></li>
    </c:forEach>
    </ul>
  </c:if>


回答3:

This technique is actullay called flash message and is implemented in Spring 3.1 as found in this answer: https://stackoverflow.com/a/7808960/142824