2014-11-17 4 views
1

Я пишу приложение Spring, в котором могут быть добавлены новые пользователи. Единственными введенными данными являются имя пользователя и пароль. У двух пользователей не может быть одинакового имени пользователя, и я проверяю его (и он работает).Сообщение Spring MVC не появляется при просмотре при использовании перенаправления

Если пользователь успешно добавлен, я возвращаюсь на главную страницу и хочу отобразить сообщение «Новый пользователь добавлен». Если они не были успешно добавлены, я хочу остаться на текущей странице и отобразить сообщение «Имя пользователя уже существует». В настоящее время сценарий неудачной попытки работает. Для успешной попытки навигационная часть работает, но сообщение не отображается.

Вот соответствующий код:

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> 

Как вы можете видеть в мой контроллер, в else-блоке внутреннего оператора if-else, если метод addUser() возвращает true (т. е. он был успешным), я добавляю соответствующее сообщение в модель и затем перенаправляю на главную страницу. В противном случае я добавляю другое сообщение и повторно загружаю одну и ту же страницу.

Как вы можете видеть, одно ключевое различие между двумя путями состоит в том, что если addUser() возвращает true, я добавил «перенаправление» в строку моего оператора return. Причина, по которой я это сделал, заключается в том, что на mainpage.jsp я загружаю некоторые данные из другой таблицы на страницу. Простое возвращение «mainpage» означает, что данные не загружаются, но отображается сообщение, которое я хочу отобразить. Используя метод, показанный выше в моем контроллере, отображаются данные, но сообщение не отображается. Интересно, что когда я использую перенаправление, сообщение, которое я хочу отобразить, отображается как параметр в URL-адресе, но этого не происходит, когда я не использую перенаправление.

ответ

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> 

При добавлении сообщения в модель не будет доступно после редиректа.

+0

Так что я должен использовать RedirectedAttributes вместо объекта Model и model.addAttribute? Также это работает, если вы не используете перенаправление? – user1849060

+0

Вы должны использовать его, если вы хотите, чтобы атрибут был доступен после перенаправления (что имеет место с сообщением об успешном создании). Эти атрибуты хранятся в FlashMap. Взгляните на JavaDoc, он объясняет, как это работает более подробно: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/FlashMap.html –

+0

Я спросил об использовании класса Model, когда не используется перенаправление, потому что я не использую перенаправление, если создание завершилось с ошибкой. Но я думаю, что я все еще могу использовать класс Model в этом экземпляре. – user1849060

Смежные вопросы