我是春天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>
答案 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)
答案 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>