Thymeleaf中的View和Redirection有什么区别?

时间:2016-07-11 04:47:48

标签: java spring view spring-boot thymeleaf

据我所知,这个问题可能听起来很愚蠢,但我是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保持不变但是内容是页面更改对应成功或失败。

1 个答案:

答案 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并返回视图。

使用重定向的一些示例如下:

  • 成功登录后,您可以重定向到用户主页。
  • 保存项目(REST方法)后,您可以重定向到此项目@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页面进行重定向。如果需要,您还可以在重定向中提供参数。