Как работает <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