Spring boot 页面跳转详解

今天处理Springboot统一异常拦截的时候,遇到了页面跳转的问题,折腾了半天才大致弄明白了其中的坑坑洼洼。

有三个方面的问题需要注意:

一.jar包依赖:Springboot有自己默认的模板引擎。一定要引用相应的依赖包。我就是没引用,导致一直无法跳转。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

二.注解:@ResponseBody

  在@Controller 控制层,是否为请求地址添加该注解也是影响跳转是否成功的因素。@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,然后直接输出到页面,并不会走视图处理器。

例如1:

@RequestMapping("/tiaozhuan.htm")
@responseBody
public ModelAndView tiaozhuan() { ModelAndView view = new ModelAndView("/403.html"); return view; }

GET请求:http://localhost:9999/tiaozhuan.htm ;加不加@responseBody都可以正常地访问403.html页面(springboot默认访问 src/main/resources 下的 templates文件夹目录)

例如2:

@RequestMapping("/tiaozhuan.htm")
public String tiaozhuan() {        
    return "/403.html";
}

GET请求:http://localhost:9999/tiaozhuan.htm ;不加@responseBody,可以正常访问,加上则访问的内容为:/403.html

例如3:

@RequestMapping("/tiaozhuan.htm")
public String tiaozhuan() {
    return "redirect:/403.html";
}

GET请求:http://localhost:9999/tiaozhuan.htm ;不加@responseBody,可以正常访问(该种为重定向,默认目录为src/main/resources 下的 static文件夹目录);加上           @responseBody则访问的内容为:/403.html

三.post与get请求:post请求与get请求也会有差别

  问题:使用Ajax向SpringMVC中Controller层发送POST请求,无论我们使用return "index.jsp"、转发、重定向还是 ModelAndView,都无法解决页面跳转的问题。

  原因:Ajax实际上就是通过XMLHttpRequest来发送请求对象向服务器发送异步请求,从服务器获取数据,然后使用JS来操作DOM而更新页面。服务器端返回的是纯文本流,可以是xml格式,html格式,js格式,也可以是字符串格式。但是客户端获取ajax异步获取结果后,不是直接显示在页面上,而是必须要先由js处理,完成之后才能显示在页面。当Ajax请求后,返回的只能是字符流,不是页面。<详细链接:https://www.cnblogs.com/boycelee/p/6243646.html>

例如1:
@RequestMapping("/tiaozhuan.htm")
public ModelAndView tiaozhuan() {
    ModelAndView view = new ModelAndView("/403.html");
    return view;
}

POST请求:http://localhost:9999/tiaozhuan.htm ;ajax报错,但是http请求成功。但是无法跳转页面。

例如2:
@RequestMapping("/tiaozhuan.htm")
public String tiaozhuan() {
    return "redirect:/403.html";
}

POST请求:http://localhost:9999/tiaozhuan.htm ;ajax报错304,并且无法跳转界面

  所以,当Ajax的post请求后,返回的只能是字符流,不是页面,无法实现跳转功能。

 

总结:在springmvc框架下,在前端ajax的post请求下,后端是无法实现页面跳转的,只有使用get请求才能实现跳转。所以post请求下的页面跳转只能交给前端去实现。

 
posted @ 2018-09-07 17:57  井井凉风  阅读(9167)  评论(0编辑  收藏  举报