GetMapping and PostMapping annotations

2020-06-21 07:04发布

问题:

I have a doubr about this operation. Creating this class controller works:

@Controller
public class StudentController {
@RequestMapping(value = "/student", method = RequestMethod.GET)
public ModelAndView student() {
return new ModelAndView("student", "command", new Student());
}

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

But using GetMapping and PostMapping does not work, the project runs normally, but does not display the page call. Ie. :

@Controller
    public class StudentController {

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

    @PostMapping("/addStudent")
    public String addStudent(@ModelAttribute("SpringWeb")Student student,
    ModelMap model) {
    model.addAttribute("name", student.getName());
    model.addAttribute("age", student.getAge());
    model.addAttribute("id", student.getId());
    return "result";
    }
}

Code full, the way below works correctly :

Student.java

public class Student {

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

    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }   
}

StudentController

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class StudentController {

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

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

result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <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>

student.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC Form Handling</title>
</head>
<body>

    <h2>Student Information</h2>
    <form:form method="POST" action="/HelloForm/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>

SpringContext.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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

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

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<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://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>HelloForm</display-name>

  <servlet>
     <servlet-name>HelloForm</servlet-name>
     <servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
     <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

回答1:

In your SpringContext.xml file, you use DefaultAnnotationHandlerMapping class (which was deprecated since Spring 3.2) to handle @RequestMapping annotation implicitly, which doesn't understand the new annotation like @GetMapping, @PostMapping...(which was introduced into Spring since version 4.3), so it ignores the new annotations. In order to use the new annotation, you should use RequestMappingHandlerMapping class. You can simply define this bean in your SpringContext.xml like this:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- you also need to define an adapter, otherwise you will get a ServletException while handling the request -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

But the recommended way is to use the "MVC XML Namespace", it will do the job above for you. Add the following code into your SpringContext.xml (you should define the mvc namespace first):

<mvc:annotation-driven/>

Please see here for more details about this.



回答2:

You can change the @Controller to @RestController and then make use of @GetMapping and @PostMapping and run the code. This should work.



回答3:

Anonymous above sad correct, change @Controller to @RestController. It's first decision, another way - adding @ResponseBody after @GetMapping or @PostMapping.