- SpringMVC 数据的响应的方式
- 页面跳转 (同步)
- 直接返回字符串
- 此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。
- 通过 ModelAndView 对象返回
- Model 对象和返回字符串表示视图组合
- 方法参数列表封装 ModelAndView 对象
- 方法体内实例化 ModelAndView 对象
- 使用传统的 HttpServletRequest 对象
- 回写数据 (异步)(用到@ResponseBody 注解,表示不进行视图跳转,直接进行数据响应)
- 直接返回字符串
- String
- HttpServletResponse
- 返回对象或集合
- 自定义对象转换为 json,返回 json
- Spring-mvc.xml 配置处理器映射器 (有普通配置和 mvc 注解驱动两种方式),处理器映射器可直接将将要返回的对象转换为 json
代码
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>priv.noby</groupId>
<artifactId>springMVC4</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/springMVC4</path>
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
entity
package priv.noby.springmvc4.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private Integer age;
}
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
controller
package priv.noby.springmvc4.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import priv.noby.springmvc4.entity.Student;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*@RestController注解等价于@ResponseBody + @Controller。
@RestController和@Controller的共同点是都用来表示Spring某个类是否可以接收HTTP请求,
二者区别: @RestController无法返回指定页面,而@Controller可以;
前者可以直接返回数据,后者需要@ResponseBody辅助。
*/@Controller
public class StudentController {
@RequestMapping("/selectById")
public String selectById() {
System.out.println("StudentController.selectById");
return "forward:/student.jsp";
}
@RequestMapping("/selectById2")
public ModelAndView selectById2() {
System.out.println("StudentController.selectById2");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("forward:/student.jsp");
modelAndView.addObject("info","selectById2Info");
return modelAndView;
}
@RequestMapping("/selectById21")
public ModelAndView selectById21(ModelAndView modelAndView) {
System.out.println("StudentController.selectById21");
modelAndView.setViewName("forward:/student.jsp");
modelAndView.addObject("info","selectById21Info");
return modelAndView;
}
@RequestMapping("/selectById22")
public String selectById22(Model model) {
System.out.println("StudentController.selectById22");
model.addAttribute("info","selectById22Info");
return "forward:/student.jsp";
}
@RequestMapping("/selectById23")
public String selectById23(HttpServletRequest request) {
System.out.println("StudentController.selectById23");
request.setAttribute("info","selectById23Info");
return "forward:/student.jsp";
}
@RequestMapping("/selectById3")
@ResponseBody
public String selectById3() {
System.out.println("StudentController.selectById3");
return "@ResponseBody注解 数据响应 selectById3";
}
@RequestMapping("/selectById31")
public void selectById31(HttpServletResponse response) throws IOException {
System.out.println("StudentController.selectById31");
response.getWriter().write("HttpServletResponse 数据响应 selectById31");
}
@RequestMapping("/selectById32")
@ResponseBody
public String selectById32() {
System.out.println("StudentController.selectById32");
Student student = new Student();
student.setName("noby");
student.setAge(20);
ObjectMapper objectMapper = new ObjectMapper();
String studentJson = null;
try {
studentJson = objectMapper.writeValueAsString(student);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return studentJson;
}
@RequestMapping("/selectById4")
@ResponseBody
public Student selectById4() {
System.out.println("StudentController.selectById4");
Student student = new Student();
student.setName("noby");
student.setAge(20);
return student;
}
}
http
### springMVC 响应 页面跳转,直接返回字符串
GET http://localhost:8080/springMVC4/student/selectById
### springMVC 响应 页面跳转,通过ModelAndView对象返回,ModelAndView对象为方法内部实例化
GET http://localhost:8080/springMVC4/student/selectById2
### springMVC 响应 页面跳转,通过ModelAndView对象返回,ModelAndView对象为方法参数封装
GET http://localhost:8080/springMVC4/student/selectById21
### springMVC 响应 页面跳转,通过ModelAndView对象返回,Model对象和返回字符串表示视图组合
GET http://localhost:8080/springMVC4/student/selectById22
### springMVC 响应 页面跳转,通过ModelAndView对象返回,HttpServletRequest对象和返回字符串表示视图组合
GET http://localhost:8080/springMVC4/student/selectById23
### springMVC 响应 回写数据,直接返回字符串,利用@ResonseBody注解
GET http://localhost:8080/springMVC4/student/selectById3
### springMVC 响应 回写数据,直接返回字符串,利用HttpServletResponse对象
GET http://localhost:8080/springMVC4/student/selectById31
### springMVC 响应 回写数据,直接返回字符串,使用@ResponseBody注解利用第三方工具返回自定义json格式字符串
GET http://localhost:8080/springMVC4/student/selectById32
### springMVC 响应 回写数据,返回对象或集合,配置文件配置处理器映射器(有普通配置和mvc注解驱动两种方式),处理器映射器可直接将将要返回的对象转换为json
GET http://localhost:8080/springMVC4/student/selectById4
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>student</title>
</head>
<body>
来自StudentController的转发成功 ${requestScope.info}
</body>
</html>