转发和重定向的不同
转发:服务端进行调用,共同的请求(会创建一个唯一的 Servlet),转发到不同的JSP时,都是同一个请求对象和响应对象中, 转发地址栏不会改变,只有转发才能访问内部资源,因为是服务端内部进行的调用
重定向:客户端进行调用,创建一个新的请求,重定向时服务端给客户端发给 302 重定向请求,客户端创建一个新的请求,重定向地址栏会改变。重定向不能返回 ModelAndView,因为 ModelAndView 只能针对一个请求
转发的方式
创建一个 ModelAndView 对象(new ModelAndView)
@GetMapping("/forward1")
public ModelAndView forward1() {
return new ModelAndView("index");
}
直接使用路径(本质上创建交给 Spring中的 视图解析器 ViewResolver 创建)
/**
* 转发视图()
*
* @return
*/
@GetMapping("/forward2")
public String forward2() {
return "index";
}
直接使用请求url
必须使用 "forward:" 前缀
注意:转发视图是通过 InternalResourceViewResolver 解析器来完成的,而转发请求的 url 是一个地址,并非视图,因此需要加上 forward:前缀,并且 url 的路径必须写完整
@GetMapping("/forward3")
public String forward3() {
return "forward:forward2";
}
重定向的方式
如果需要重定向一个视图或者请求地址,可以结合 "redirect:" 这个前缀,并且重定向的地址和视图名称必须是完整的 url 路径,
因为重定向是不会走内部资源视图解析器的,而是服务端给客户端发给 302 重定向请求,客户端创建一个新的请求
@GetMapping("/redirect1")
public String redirect1(Model model) {
return "redirect:redirect.jsp";
model.addAttribute("name", "name");
return "redirect:redirect1";
}
使用 RedirectAttributes 实现URL重写
RedirectAttributes 是 springmvc 3.1版本提供的一个类
主要用于在重定向时可以重写 url,在重定向的 url 后面加入参数,这样就可以变相在重定向的资源中获取相关的参数信息
@GetMapping("/redirect2")
public String redirect2(RedirectAttributes redirectAttributes) {
// return "redirect:redirect.jsp";
redirectAttributes.addAttribute("key", "eag");
return "redirect:forward2";
}
重定向带值的方法
- 会话作用域
- URL重写(字符串拼接)
前后端分离时的数据交互
什么是前后端分离
好处:
- 前后端分离是架构上的分离,数据和控制放在一起
都不需要管对应的实现,前后端分离后,出现了前端工程化 - 版本迭代不会影响到,其他的端
坏处: - 数据交互不方便(跨域问题)
请求协议(ajax)和请求格式(JSON)的改变 - 会话跟踪
token(JWT)
@ResponseBody 注解表示将方法返回值,以输出流的方式写回客户端,这样 springmvc 就会将序列化好的 json 数据放入响应体中并写回
当前端提交是一个 json 字符串时,此时要使用 @RequestBody 注解来映射,这样 springmvc 就会将 json字符串 反序列化为实体对象
转发、重定向、json
@GetMapping("/getUser")
public User getUser() {
User user = new User();
return user;
}
@GetMapping("/add")
public void add(@RequestBody User user) {
log.info("lldwb"+user.toString());
}