据我所知,这个问题可能听起来很愚蠢,但我是Spring Boot和Thymeleaf的新手。
假设我目前在page1.html
。用户单击某个按钮,该按钮向我的控制器MyController.java
生成POST / GET请求,该请求使用@RequestMapping
将此请求映射到某个函数。
处理完请求后,我从控制器返回一个名为return "page2"
的视图名称。
page1.html
更改的内容,但网址仍然保持不变,如http://localhost:8080/page1
,而不是更改为http://localhost:8080/page2
我知道为了转到其他页面,我必须使用redirection
,但为什么查看无法实现这一目标?
有人可以解释一下为什么会发生这种情况,我何时应该使用重定向?何时应该使用视图?
编辑1:
这是我的控制器
@RequestMapping (value = "edit", method = RequestMethod.POST, params="action=ADD")
{
public String saveUser(@ModelAttribute UserDto userDto) {
try {
User user = new User();
if(userDto.getId() != null) {
throw new UserExists();
}
user.setName(userDto.getName());
user.setEmail(userDto.getEmail());
System.err.println("Request Recieved");
userDao.save(user);
return "success";
} catch (Exception e) {
System.err.println("Error Saving User");
e.printStackTrace();
return "failure";
}
}
这是我的观点
<form id="manipulate-data-form" th:object="${userobj}" method="post" th:action="@{/edit}">
<table id="manipulate" class="table table-bordered">
<tr>
<td>ID</td>
<td><input type="text" class="form-control" th:if="${userobj != null}" th:field="*{id}" ></input></td>
</tr>
<tr>
<td>NAME</td>
<td><input type="text" class="form-control" th:if="${userobj != null}" th:field="*{name}" ></input></td>
</tr>
<tr>
<td>EMAIL</td>
<td><input type="text" class="form-control" th:if="${userobj != null}" th:field="*{email}" ></input></td>
</tr>
<tr>
<td><input name="action" value="ADD" type="submit" class="btn btn-success" ></input></td>
<td>
<input name="action" value="DELETE" type="submit" class="btn btn-danger" ></input>
<input style="margin-left: 30px" name="action" value="UPDATE" type="submit" class="btn btn-primary" ></input>
</td>
</tr>
</table>
</form>
所以基本上点击它调用saveUser()控制器的按钮然后当我返回失败或成功视图时,URL保持不变但是内容是页面更改对应成功或失败。
答案 0 :(得分:1)
让我试着回答你的一些问题:
page1.html的内容发生了变化,但网址仍然是 与http://localhost:8080/page1相同,而不是更改为 http://localhost:8080/page2
您正在点击http://localhost:8080/page1
之类的网址。 /page1
并不意味着以名称page1.html
显示您的观点。它更多是您的@RequesteMapping
注释的Url以及应该为此请求执行的方法。
例如:
你正在击中网址:
http://localhost:8080/page1
您的映射为:@RequestMapping("/page1")
,您希望返回page1.html
。因此,您的观点是:return "page1";
现在您可以看到page1.html
的内容了。您提供的按钮现在应该有一个指向http://localhost:8080/page2
的链接,您的Controller应该有一个映射到它@RequestMapping("/page2")
。在此方法中,您可以返回return "page2"
,您的网址将更改为http://localhost:8080/page2
。
如果该按钮的链接确实包含另一个值而不是http://localhost:8080/page2
,但您想要显示此/page2
的特定网址,则需要重定向:{{1在特定return "redirect:/page2"
。
有人可以解释一下为什么会发生这种情况,我何时应该使用重定向?何时应该使用视图?
我不是100%确定这是否正确,但我认为这只是为什么有视图和重定向的规则。如果您想站在特定的URL上并希望显示为其构建的视图,那就去做吧。如果您不想显示相同的URL或想要切换到另一个页面,只需使用重定向。
重定向也会再次调用控制器,该控制器正确映射到重定向URL并返回视图。
使用重定向的一些示例如下:
@RequestMapping("/anyOtherMapping")
的特定ID,并返回包含该项目信息的视图。回答您的编辑问题:
尝试使用/item/1
更改网址。
redirection
这应该更改网址,因为您将从@RequestMapping (value = "edit", method = RequestMethod.POST, params="action=ADD")
{
public String saveUser(@ModelAttribute UserDto userDto) {
try {
User user = new User();
if(userDto.getId() != null) {
throw new UserExists();
}
user.setName(userDto.getName());
user.setEmail(userDto.getEmail());
System.err.println("Request Recieved");
userDao.save(user);
return "redirect:/success";
} catch (Exception e) {
System.err.println("Error Saving User");
e.printStackTrace();
return "redirect:/failure";
}
}
@RequestMapping("/success")
public String successPage(){
return "success";
}
@RequestMapping("/failure")
public String failurePage(){
return "failure";
}
到/edit
或/failure
页面进行重定向。如果需要,您还可以在重定向中提供参数。