Spring MVC:发布表单时附加的Url路径

时间:2013-09-05 08:17:12

标签: spring jsp spring-mvc

我是春天mvc的新手。我创建了一个简单的登录应用程但在我的情况下第一次发布url并正确调用控制器方法。在第二次它是附加一个控制器时间的路径。第一次发布:   // localhost:8090 / springmvc / account / login 同一页面中的时间: // localhost:8090 / springmvc / account / account / login 。我该如何解决这个重定向问题?

这是我的控制器页面:

@Controller
@RequestMapping("account")
public class AccountController {
    AccountService service = new AccountService();
    @RequestMapping(value = "account/default", method = RequestMethod.GET)
    public ModelAndView RegisterUser() {
        return new ModelAndView("/Account/Index","command",new User());
    }

    @RequestMapping(value = "/registeruser", method = RequestMethod.POST)
    public ModelAndView RegisterUser(User user) {
        user.setMessage(service.Register(user));
        return new ModelAndView("/Account/Index", "command", user);
    }

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public ModelAndView RegisterUer(User user) {
        user.setMessage(service.Register(user));
        return new ModelAndView("/Account/create", "command", user);
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public ModelAndView LoginUser(User user, ModelMap model) {
        String msg = service.isAuthendicated(user) ? "Logged in" : "Failed";
        user.setMessage(msg);
        return new ModelAndView("/Account/Index", "command", user);
    }
}

这是我的jsp页面:

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%>

<t:genericpage>
    <jsp:body>
       <h2>Login</h2>
       <div>
            ${command.message} </div>
      <a href="account/register">Register</a>
    <form:form action="account/login" method="post">
        <div>
                <form:input path="username" />
            </div>
        <div>
                <form:input path="password" />
            </div>
        <input type="submit" value="Login">
    </form:form>
    </jsp:body>
</t:genericpage>

我将标签库用于公共页面:

<%@tag description="Master Page" pageEncoding="UTF-8"%>
<html>
<body>
    <div id="pageheader">
        <h2>WElcome</h2>
    </div>
    <div id="body">
        <jsp:doBody />
    </div>
    <div id="pagefooter">
        <p id="copyright">Copyright</p>
    </div>
</body>
</html>

4 个答案:

答案 0 :(得分:24)

根据您使用的Spring版本,以下是一些选项:

Spring 3.1及更低版本OR Spring 3.2.3及更高版本

您应该根据您的上下文路径确定您的网址/操作根目录。

<form:form action="${pageContext.request.contextPath}/account/login" method="post">

注意:Spring 3.2.3引入了servletRelativeAction,但我从未使用它。

Spring 3.2

不做任何事情,上下文路径是前置的 - 这实际上是breaking change and eventually rolled back

<form:form action="/account/login" method="post"> 
//will produce action="/springmvc/account/login"

答案 1 :(得分:7)

使用/开始您的表单操作。

<form:form action="/account/login" method="post">

如果不这样做,您告诉浏览器将操作附加到地址栏上现有的URL。

如果您直接在HTML中使用此类链接(不使用Spring的form:form),请尝试使用c:url正确构建包含上下文路径等的URL。这会带来很多痛苦从建立适当的相对URL。

<a href="<c:url value="/account/register" />">Register</a>

答案 2 :(得分:0)

使用../获取当前上下文根的URL:

<form:form action="../account/login" method="post"> 

来自here

答案 3 :(得分:0)

我尝试通过仅设置相对路径来尝试spring标记,它会自动附加上下文路径,如:

<!DOCTYPE html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html lang="en">

<head>
<!-- ... -->
<spring:url value="/account/login" var="loginUrl" />
<form:form action="${loginUrl}" method="post">

上下文路径在application.properties中设置为以下行:

server.servlet.contextPath=/MyApp

在jsp页面中,它产生:

<a class="nav-link" href="/MyApp/account/login"> <i class="fas fa-play"></i> <span>Click here</span></a>