Spring 3 MVC额外的@RequestMapping值被附加到返回的视图

时间:2013-06-02 22:30:38

标签: spring spring-mvc spring-3

我有一个带有用户名和密码文本字段的视图'hi.jsp'。我需要将'hi.jsp'提交给'LoginController.java'。如果提交的数据中存在任何错误,则'LoginController.java'必须将请求重定向回'hi.jsp'(文本字段会重新输入已输入的数据)以及相应的错误消息。更改数据并重新提交'hi.jsp'后,我收到404错误。

因此,第一次提交成功,但在第二次提交期间出现问题。 文件的源代码如下:

hi.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  <%@ taglib uri="http://www.springframework.org/tags/form" prefix="s" %>
  <%@ page session="false" %>
  <html>
      <body>    
        <s:form method="POST" modelAttribute="loginObj" action="login/validatelogin">
           <label for="userName">UserName</label>
           <s:input path="userName" id="userName" size="15"/><br>
           <div style="{color:red}"> <s:errors path="userName"></s:errors></div>

           <label for="password">Password</label>
           <s:input path="password" id="password" size="15" /><br>
           <s:errors path="password"></s:errors>

           <input name="submit" type="submit" value="login"/>      
    </s:form>
   </body>
</html>

LoginController.java

package rajeev.spring.spitter.mvc.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/login")
public class LoginController {

    @RequestMapping(value="/validatelogin", method=RequestMethod.POST)
    public String validateLogin(@Valid @ModelAttribute("loginObj") LoginBean loginObj, BindingResult bindingResult)
    {
        System.out.println(bindingResult.hasErrors());
        if(bindingResult.hasErrors())
        {
            return "hi";
        }
        return "home";
    }
}

spitter-servlet.xml(弹簧配置)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <mvc:annotation-driven/>
    <context:component-scan base-package="rajeev.spring.spitter.mvc.controller"></context:component-scan>
     <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
  </bean>
</beans>

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>Spring Hello World</display-name>
    <welcome-file-list>
        <welcome-file>/</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>springDispatcher</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
      <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spitter-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

在第二次提交'hi.jsp'期间,tomcat日志还会显示警告:

WARNING: No mapping found for HTTP request with URI [/SpringMVC/login/login/validatelogin] in DispatcherServlet with name 'springDispatcher'

似乎在第二次提交'hi.jsp时,额外的'/login'会被附加到表单的提交路径中。

请建议上述代码是否有问题,或者我是否需要对其进行修改以使其正常工作。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是因为当您将处理程序方法映射到不同的URL

时,相对表单的帖子URL已更改
<s:form method="POST" modelAttribute="loginObj" action="login/validatelogin">

此问题的常见解决方案是使用绝对路径,但不使用硬编码,而是使用

查找上下文路径
<c:set var="root" value="${pageContext.request.contextPath}"/>

然后在你的表格上

<s:form method="POST" modelAttribute="loginObj" action="${root}/login/validatelogin"> 

您可能考虑的其他选项是在控制器处理程序方法中使用Post-Redirect模式以避免切换URL

public String validateLogin(@Valid @ModelAttribute("loginObj") LoginBean loginObj, BindingResult bindingResult) {
  ....
  return "redirect:/login";
}

答案 1 :(得分:0)

试试这个:

<c:url var="myAction" value="/login/validatelogin"/>
<s:form method="POST" modelAttribute="loginObj" action="${myAction}">