Spring MVC前端选择一个表单动作目标

时间:2013-01-15 04:21:24

标签: java html user-interface spring-mvc

我的网络应用程序有多种形式,其中最简单的就是登录表单(我使用的是thymeleaf):

    <form method="post" action = "#" th:action = "@{/account/login}">
        Username: <input name="username" type="text" /> <br /> 
        Password: <input name="password" type="password" /> <br /> 
                  <input name="login" type="submit" value="Login" />
    </form>

我的控制器处理程序方法是:

@RequestMapping(value = "/account/login", method = RequestMethod.POST, params = "login")
public String login(@RequestParam("username") String username, 
        @RequestParam("password") String password,
        Model model) {

    // do some logging in           
    return "/account/profile";
}

我的问题是,因为我正在对/account/login进行POST,这就是浏览器地址栏中显示的内容。我真的希望它显示/account/profile。我是否应该对/account/profile进行POST,即使从概念上讲它是不正确的。

另一种解决方案是在/account/login上进行POST,并在成功后重定向并在/account/profile上进行GET。

假设我也有这样的处理程序方法:

@RequestMapping(value = "/account/login", method = RequestMethod.GET)
public String loginPage() {
    return "/account/login";
}

哪些其他解决方案可能符合类似REST的URL映射的概念?

1 个答案:

答案 0 :(得分:2)

我认为POST后的重定向最符合您的需求:

@RequestMapping(value = "/account/login", method = RequestMethod.GET)
public String loginPage() {
    return "redirect:/account/profile";
}

该方法的优点(与当前方式相比 - 在操作中返回视图)是,如果用户按“F5”,表单将不会重新发布。这已成为一种模式:redirect after post

如果您想知道重定向后如何显示错误Spring 3.1 support it

P / s:实际上,进程链接与用户浏览器地址栏上显示的内容无关。如果您只关注URL,则可以使用“url-rewriting”库,例如Turkey URLRewriter