使用重定向时,Spring MVC消息不会出现在视图中

时间:2014-11-17 15:09:17

标签: java spring jsp spring-mvc

我正在编写一个可以添加新用户的Spring应用程序。输入的唯一数据是用户名和密码。两个用户不能拥有相同的用户名,我会检查这个(并且它可以工作)。

如果成功添加了用户,我将返回主页并希望显示消息"添加了新用户"。如果未成功添加,我希望保留当前页面并显示消息"用户名已存在"。目前,尝试失败的情况有效。为了成功尝试,导航部分可以工作但消息不会显示。

以下是相关代码:

UserCredentialsController.java

@Controller
public class UserCredentialsController {

    //Omitted some methods above



@RequestMapping(value = "/savenewuser", method = RequestMethod.POST)
public String saveNewUser(@Valid @ModelAttribute("newuser") NewUserValidation newUserValidation, BindingResult result, Model model)
{
 if(result.hasErrors())
 {

     //Return to form with errors displayed (messages in NewUserValidation class)
     return "newuserform";
 }
    else
 {

     //Add new user to database then redirect to main page.
     User user = new User();
     user.setUsername(newUserValidation.getUsername());
     user.setPassword(newUserValidation.getPassword());
     if(userService.addUser(user))
     {
         model.addAttribute("message", "New user added");
         return "redirect:/";
     }
     else
     {
         model.addAttribute("message", "Username already exists");
         return "newuserform";
     }
 }
}

 //Omitted some methods below.

newuserform.jsp

<%@ taglib prefix='form' uri='http://www.springframework.org/tags/form'%>
<!DOCTYPE html>
<html>
    <head>
        <title>Add New User</title>
        <link rel="stylesheet" type="text/css" href="/resources/css/styles.css" />
    </head>
    <body>
        <div class="message">
            <c:if test="${message!=null}">${message}</c:if>
        </div>
        <form:form method="post" action="savenewuser" modelAttribute="newuser">
            <table class="no-border">
                <tr>
                    <td colspan="2"><h1>Add New User</h1></td>
                </tr>
                <tr class="no-border">
                    <td class="no-border">Username</td>
                    <td class="no-border"><form:input type="text" path="username" /></td>
                </tr>
                <tr class="no-border">
                    <td class="no-border">Password</td>
                    <td class="no-border"><form:input type="password" path="password" /></td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit" value="Add New User" /><br />
                    <form:errors path="username" /><br />
                    <form:errors path="password" /></td>
                </tr>
            </table>
        </form:form>
    </body>
</html>

mainpage.jsp

<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<!DOCTYPE html>
<html>
    <head>
        <title>Main Page</title>
        <link rel="stylesheet" type="text/css" href="/resources/css/styles.css" />
        <script src="https://code.jquery.com/jquery-2.1.0.min.js"></script>
        <script type="text/javascript" src="/resources/javascript/animation.js"></script>
    </head>
    <body>
    <div class="message"><c:if test="${message!=null}">${message}</c:if></div>
    <c:if test="${myList==null}">myList not available.</c:if><br /> 
        <table>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Gender</th>
                <th>Random Answer</th>
            </tr>
            <c:forEach var="entry" items="${myList}">
                <tr>
                    <td>${entry.firstName}</td>
                    <td>${entry.lastName}</td>
                    <td>${entry.gender}</td>
                    <td>${entry.randomAnswer}</td>
                </tr>
            </c:forEach>
        </table>
        <a href="/addincident">Add New Person</a> &nbsp; <a href="/addnewuser">Add New User</a> &nbsp; <a href="/login">Log in</a>
    </body>
</html>

正如您在我的控制器中看到的,在内部if-else语句的else-block中,如果addUser()方法返回true(即它成功),那么我将相关消息添加到模型然后重定向到主页面。否则,我会添加不同的消息并重新加载同一页面。

正如您所看到的,两个路径之间的一个关键区别是,如果addUser()返回true,我添加了“重定向”#39;在我的return语句的String中。我这样做的原因是因为在mainpage.jsp上我将一些数据从另一个表加载到页面上。只需返回&#34;主页&#34;表示数据未加载但显示我要显示的消息。使用我在上面的控制器中显示的方法,显示数据但不显示消息。有趣的是,当我使用重定向时,我想要显示的消息在URL中显示为参数,但是当我不使用重定向时,这不会发生。

1 个答案:

答案 0 :(得分:3)

如果要在重定向后显示消息,请使用RedirectAttributes

以下是一个示例用法。

@RequestMapping("/foo")
public String foo(RedirectAttributes redirectAttributes) {
    redirectAttributes.addFlashAttribute("message", "User added");
    return "redirect:/";
}

并在JSP中像普通模型变量一样访问它:

<c:if test="${not empty message}">
    <c:out value="${message}" />
</c:if>

将消息添加到模型后,重定向后将无法使用该消息。