SpringMVC的响应处理

一、传统同步业务数据响应

Spring响应数据给客户端,主要分为两大部分:
⚫ 传统同步方式:准备好模型数据,在跳转到执行页面进行展示,此方式使用越来越少了,基于历史原因,一些旧项目还在使用;
⚫ 前后端分离异步方式:前端使用Ajax技术+Restful风格与服务端进行Json格式为主的数据交互,目前几乎都是此种方式了。

传统同步业务在数据响应时,SpringMVC又涉及如下四种形式:
⚫ 请求资源转发;
⚫ 请求资源重定向;
⚫ 响应模型数据;
⚫ 直接回写数据给客户端;

1. 请求资源转发

在这里插入图片描述

2. 请求资源重定向

在这里插入图片描述

3. 响应模型数据

响应模型数据本质也是转发,在转发时可以准备模型数据

@GetMapping("/forward5")
public ModelAndView forward5(ModelAndView modelAndView){
    
    
	// 准备JavaBean模型数据
	User user = new User();
	user.setUsername("haohao");
	// 设置模型
	modelAndView.addObject("user",user);
	// 设置视图
	modelAndView.setViewName("/index.jsp");
	return modelAndView;
}

4. 直接回写数据

直接通过方法的返回值返回给客户端的字符串,但是SpringMVC默认的方法返回值是视图,可以通过@ResponseBody 注解显示的告知此处的返回值不要进行视图处理,是要以响应体的方式处理的

@GetMapping("/response2")
@ResponseBody
	public String response2() throws IOException {
    
    
	return "Hello haohao!";
}

二、前后端分离异步业务数据响应

其实此处的回写数据,跟上面回写数据给客户端的语法方式一样,只不过有如下一些区别:
⚫ 同步方式回写数据,是将数据响应给浏览器进行页面展示的,而异步方式回写数据一般是回写给Ajax引擎的,即谁访问服务器端,服务器端就将数据响应给谁
⚫ 同步方式回写的数据,一般就是一些无特定格式的字符串,而异步方式回写的数据大多是Json格式字符串

回写普通数据使用@ResponseBody标注方法,直接返回字符串即可,此处不在说明;

回写Json格式的字符串,即将直接拼接Json格式的字符串或使用工具将JavaBean转换成Json格式的字符串回写

@GetMapping("/response3")
@ResponseBody
public String response3(HttpServletResponse response) {
    
    
	return "{\"username\":\"haohao\",\"age\":18}";
}
@GetMapping("/response4")
@ResponseBody
public String response4() throws JsonProcessingException {
    
    
	// 创建JavaBean
	User user = new User();
	user.setUsername("haohao");
	user.setAge(18);
	// 使用Jackson转换成json格式的字符串
	String json = new ObjectMapper().writeValueAsString(user);
	return json;
}

在讲解SringMVC接收请求数据时,客户端提交的Json格式的字符串,也是使用Jackson进行的手动转换成JavaBean

当我们使用了@RequestBody时,直接用JavaBean就接收了Json格式的数据,原理其实就是SpringMVC底层帮我们做了转换,此处@ResponseBody也可以将JavaBean自动给我们转换成Json格式字符串回响应

@GetMapping("/response5")
@ResponseBody
public User response5() throws JsonProcessingException {
    
    
	// 创建JavaBean
	User user = new User();
	user.setUsername("haohao");
	user.setAge(18);
	// 直接返回User对象
	return user;
}

@ResponseBody注解使用优化,在进行前后端分离开发时,Controller的每个方法都是直接回写数据的,所以每个方法上都得写@ResponseBody,可以将@ResponseBody写到Controller上,那么该Controller中的所有方法都具备了返回响应体数据的功能了

@Controller
@ResponseBody
public class UserController{
    
    

	@GetMapping("/response7")
	public ResultInfo response7() {
    
    
		// 省略其他代码
		return info;
	}
	
	@GetMapping("/response5")
	public User response5() throws JsonProcessingException {
    
    
		//省略其他代码
		return user;
	}
	
	// ... 省略其他方法 ...
}

进一步优化,可以使用@RestController替代@Controller和@ResponseBody,@RestController内部具备的这两个注解的功能

@RestController
public class UserController{
    
    

	@GetMapping("/response7")
	public ResultInfo response7() {
    
    
		// 省略其他代码
		return info;
	}
	
	@GetMapping("/response5")
	public User response5() throws JsonProcessingException {
    
    
		//省略其他代码
		return user;
	}
	
	// ... 省略其他方法 ...
}

猜你喜欢

转载自blog.csdn.net/qq_36602071/article/details/129826497