Как работает <form> action?

Это может показаться тривиальным, однако у меня есть некоторые сомнения относительно того, как работает действие.

Я написал простое веб-приложение, используя Spring MVC.

Код контроллера:

@Controller
public class StudentController {

   @RequestMapping(value = "/student")
   public ModelAndView student() {
      return new ModelAndView("student", "command", new Student());
   }

   @RequestMapping(value = "/addStudent", method = RequestMethod.POST)
   public String addStudent(@ModelAttribute("Student")Student student, 
   ModelMap model) {
      model.addAttribute("name", student.getName());
      model.addAttribute("age", student.getAge());
      model.addAttribute("id", student.getId());

      return "result";
   }
}

Вот модель класса

package com.vipin.model;

public class Student {

   private Integer age;
   private String name;
   private Integer id;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      return name;
   }

   public void setId(Integer id) {
      this.id = id;
   }
   public Integer getId() {
      return id;
   }
}

Вот файлы конфигурации XML:

web.xml

<?xml version="1.0" encoding="UTF-8"?>

    <web-app  version="3.0"
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd">

    <display-name>Spring MVC Form Handling</display-name>
      <servlet>
     <servlet-name>spring-form-simple-project</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
     <load-on-startup>1</load-on-startup>
  </servlet>

     <servlet-mapping>
        <servlet-name>spring-form-simple-project</servlet-name>
         <url-pattern>/</url-pattern>
       </servlet-mapping>

   </web-app>

весна-форма-простой проект-servlet.xml

   <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:component-scan base-package="com.vipin.controllers"/>

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/"/>
      <property name="suffix" value=".jsp" />
   </bean>

</beans>

JSP файлы:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
    <title>Spring MVC Form Handling</title>
</head>
<body>

<h2>Student Information</h2>
<form:form method="POST" action="/simple-form-simple-project/addStudent">
   <table>
    <tr>
        <td><form:label path="name">Name</form:label></td>
        <td><form:input path="name" /></td>
    </tr>
        <tr>
        <td><form:label path="age">Age</form:label></td>
        <td><form:input path="age" /></td>
    </tr>
    <tr>
        <td><form:label path="id">id</form:label></td>
        <td><form:input path="id" /></td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="Submit"/>
        </td>
    </tr>
</table>  
</form:form>
</body>
</html>

result.jsp

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
    <title>Spring MVC Form Handling</title>
</head>
<body>

<h2>Submitted Student Information</h2>
   <table>
    <tr>
        <td>Name</td>
        <td>${name}</td>
    </tr>
    <tr>
        <td>Age</td>
        <td>${age}</td>
    </tr>
    <tr>
        <td>ID</td>
        <td>${id}</td>
    </tr>
</table>  
</body>
</html>

Вот мои сомнения:

У меня есть методы контроллеров, которые имеют аннотации

@RequestMapping (value = "/ student")

@RequestMapping (value = "/ addStudent", method = RequestMethod.POST)

Приложение имеет контекстный путь -> /spring-form-simple-project

Следовательно, для доступа я использую:

    http://localhost:8080/spring-form-simple-project/student

Этот контроллер, в свою очередь, возвращает student.jsp, а когда этот student.jsp передается, он вызывает контроллер с -> @RequestMapping(value = "/addStudent", method = RequestMethod.POST)

В моем web.xml я упомянул шаблон URL как "/".

Что если я поменяю шаблон URL на "/test", в таком случае как это работает?

Я пытался получить доступ, как это:

        http://127.0.0.1:8080/spring-form-simple-project/test/student

Это дало мне ошибку 404.

Кроме того, когда у нас есть этот контроллер с сопоставлением с шаблоном -> @RequestMapping(value = "/student"), это относительно пути к контексту приложения? Я не могу этого понять?

Любые указатели относительно того, как это работает в целом, были бы полезны.

Спасибо!

1 ответ

Согласно весенним документам, @RequestMapping on the class level is not required. Without it, all paths are simply absolute, and not relative.

И здесь вы не определили никакого сопоставления запросов на уровне класса, поэтому все сопоставления на уровне методов будут абсолютными. Вот абсолютный путь начнется с вашего корневого контекста (spring-form-simple-project).

Для получения дополнительной информации: - 15.3.2 Отображение запросов с помощью @RequestMapping

Другие вопросы по тегам