提交 Spring 表单时上下文根没有出现 - url 模式问题

Sam*_*dha 4 servlets spring-mvc url-pattern jakarta-ee

下面是我的控制器、web xml 和使用 spring 形式的 jsp 页面。

控制器

@Controller
@RequestMapping(value = {"/*", "/login"})
public class HelloWorldController {

    @RequestMapping(method = RequestMethod.GET)
    public String helloWorld(final Model model) {
        model.addAttribute("bodyPage", "body.jsp");
        User user = new User();
        Address address = new Address();

        user.setAddress(address);

        model.addAttribute("myUser", user);
        System.out.println("hello world");
        return "login";
    }


    @RequestMapping(value = "/submitDetails", method = RequestMethod.POST)
    public ModelAndView submitDetais(final Object command) {

        System.out.println("inside submitDetais ");
        User user = (User) command;
        return new ModelAndView("result", "user", user);
    }
}
Run Code Online (Sandbox Code Playgroud)

网页 XML

<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

Jsp页面

<form:form commandName="myUser" modelAttribute="myUser" method="POST" action="submitDetails.htm" >
    <table>
        <tr>
            <td>First Name:</td>
            <td><form:input path="firstName" /></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><form:input path="lastName" /></td>
        </tr>

        <tr>
            <td>Address 1:</td>
            <td><form:input path="address.address1"  /></td>
        </tr>

        <tr>
            <td>Address 2:</td>
            <td><form:input path="address.address2"  /></td>
        </tr>

        <tr>
            <td colspan="2"><input type="submit" value="Save Changes" /></td>
        </tr>
    </table>
</form:form>
Run Code Online (Sandbox Code Playgroud)

Dispathcher servlet 只有视图解析器。现在,如果我导航到以下 url http://localhost:9080/ExampleSpringhttp://localhost:9080/ExampleSpring/,则按照 Contoller 中定义的类级别 url 模式

controll 将转到我的 jsp 页面并询问详细信息。输入详细信息后,如果我将表单操作作为 action中提到的action="submitDetails.htm"提交,它会抛出 404 错误。地址栏中的 url 是 localhost:9080/submitDetails.htm ,它缺少项目的上下文根。我的问题是我在请求映射 url 部分做错了什么?

按照我的理解

1.表单是使用post提交的,它对模式进行了数学计算 2./submitDetails.htm匹配类级别url模式映射中的模式/*,因此请求应该进入控制器,3.最后是控制器方法中的方法级别映射与 jsp 中的操作 amd 方法具有相同的 url 模式 amd 请求方法,因此它应该进入控制器方法并在控制台中打印---这不是发生的。

任何人都可以帮助我理解这一点吗?

Sta*_*tan 5

根据我的理解,您在表单的 action 属性中缺少上下文路径。尝试将其定义如下:

<form:form commandName="myUser" modelAttribute="myUser" method="POST" action="${pageContext.servletContext.contextPath}/submitDetails.htm" >
Run Code Online (Sandbox Code Playgroud)