我应该如何在spring mvc中跨控制器发送resourcebundle消息?

IT小君   2022-09-15T08:22:53

大多数 Spring 教程和示例向您展示了如何从资源文件中获取消息以及如何在您的视图 (jsp) 中显示它,而不是您应该如何在控制器中和视图之间处理这些消息。

这是我现在如何做的一个例子,我有一个处理忘记密码的视图/控制器。发送密码后,我会重定向回登录屏幕,并显示“您的密码已发送...”的消息

@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";
}

最后我在我的视图中显示消息,在这种情况下是一个 freemarker 模板

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

这是在 Spring 框架中执行此操作的最佳方式吗?只有 1 种类型的消息很简单,但如果我需要 5 种呢?

点击广告,支持我们为你提供更好的服务
评论(3)
IT小君

只需创建一个简单的 bean 并将其推送到数据中。在该 bean 中,您可以拥有所有想要从资源包中加载的消息。(顺便说一句:你真的需要资源包吗?它做了一些花哨的技巧,除非你需要 i18n,否则完全没有必要。一个简单的属性文件在几乎所有其他情况下就足够了。)

2022-09-15T08:22:53   回复
IT小君

将错误添加到控制器中的列表中,例如

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

然后在jsp页面中迭代所有错误以显示

 <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>
2022-09-15T08:22:54   回复
IT小君

这种技术被称为 flash 消息,并在 Spring 3.1 中实现,如以下答案所示:https ://stackoverflow.com/a/7808960/142824

2022-09-15T08:22:54   回复