2013-09-05 11 views
12

Jestem nowa w Spring Mvc. Stworzyłem prostą aplikację do logowania. ale w moim przypadku po raz pierwszy za prawidłowy sposób wysyłania adresu URL i wywoływania kontrolera. za drugim razem dołącza ścieżkę z jeszcze jednym czasem kontrolera. po raz pierwszy: // localhost: 8090/springmvc/account/login secong time na tej samej stronie: // localhost: 8090/springmvc/account/account/login. jak mogę rozwiązać ten problem przekierowania?Wiosna MVC: Ścieżka do adresu URL dołączana podczas publikowania formularza

to moja strona kontroler:

@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); 
    } 
} 

to moja strona 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> 

użyłem biblioteki znaczników na wspólnej stronie:

<%@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> 

Odpowiedz

24

zależności od wersji Wiosna używasz, oto kilka opcji:

Wiosna 3,1 i niższy lub wiosną 3.2.3 i wyższe

Trzeba się używać/wykonuje operacje związane z katalogiem głównym względem ścieżki kontekstowej.

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

Uwaga: Wiosna 3.2.3 wprowadzono servletRelativeAction ale nigdy jej nie użyłem.

Wiosna 3,2

Nie robić nic, ścieżka kontekstu jest poprzedzany - to było faktycznie breaking change and eventually rolled back.

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

Rozpocznij działanie formularz z /.

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

By nie robi, mówisz przeglądarkę, aby dołączyć do działania już istniejącego adresu URL w pasku adresu.

A skąd masz takie linki bezpośrednio w HTML (nie używając sprężyny form:form), spróbuj użyć c:url prawidłowo skonstruować URL łącznie ze ścieżką kontekstu itd To zajmuje dużo bólu z dala od budowy odpowiednich adresów względnych.

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

jeśli używam/beofre linku akcji, jak oznacza, że ​​przeglądarka nie przyjmuje nazwy aplikacji w adresie URL ścieżki, tak jak ten // localhost: 8090/account/login – manivannan

+2

Spróbuj "c: url", a następnie – adarshr