Я пишу приложение 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> <a href="/addnewuser">Add New User</a> <a href="/login">Log in</a>
</body>
</html>
Как вы можете видеть в мой контроллер, в else-блоке внутреннего оператора if-else, если метод addUser() возвращает true (т. е. он был успешным), я добавляю соответствующее сообщение в модель и затем перенаправляю на главную страницу. В противном случае я добавляю другое сообщение и повторно загружаю одну и ту же страницу.
Как вы можете видеть, одно ключевое различие между двумя путями состоит в том, что если addUser() возвращает true, я добавил «перенаправление» в строку моего оператора return. Причина, по которой я это сделал, заключается в том, что на mainpage.jsp я загружаю некоторые данные из другой таблицы на страницу. Простое возвращение «mainpage» означает, что данные не загружаются, но отображается сообщение, которое я хочу отобразить. Используя метод, показанный выше в моем контроллере, отображаются данные, но сообщение не отображается. Интересно, что когда я использую перенаправление, сообщение, которое я хочу отобразить, отображается как параметр в URL-адресе, но этого не происходит, когда я не использую перенаправление.
Так что я должен использовать RedirectedAttributes вместо объекта Model и model.addAttribute? Также это работает, если вы не используете перенаправление? – user1849060
Вы должны использовать его, если вы хотите, чтобы атрибут был доступен после перенаправления (что имеет место с сообщением об успешном создании). Эти атрибуты хранятся в FlashMap. Взгляните на JavaDoc, он объясняет, как это работает более подробно: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/FlashMap.html –
Я спросил об использовании класса Model, когда не используется перенаправление, потому что я не использую перенаправление, если создание завершилось с ошибкой. Но я думаю, что я все еще могу использовать класс Model в этом экземпляре. – user1849060