SpringMVC 转发和重定向

SpringMVC 转发和重定向

转发和重定向的不同

转发:服务端进行调用,共同的请求(会创建一个唯一的 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";
}

重定向带值的方法

  1. 会话作用域
  2. URL重写(字符串拼接)

前后端分离时的数据交互

什么是前后端分离
好处:

  1. 前后端分离是架构上的分离,数据和控制放在一起
    都不需要管对应的实现,前后端分离后,出现了前端工程化
  2. 版本迭代不会影响到,其他的端
    坏处:
  3. 数据交互不方便(跨域问题)
    请求协议(ajax)和请求格式(JSON)的改变
  4. 会话跟踪
    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());
}