springboot 跳转到网页上的两种实现方式(转发与重定向详细对比)
1.情景展示
虽然现在流行的是前后端分离,后端开发与前端往往只进行数据交互,不需要参与对网页跳转的控制及网页内容的开发。
但是,由服务器(后端)跳转到客户端(浏览器)或者从A服务器跳到B服务器是一项基本的能力。
在项目开发中,真正遇到的时候,该如何实现?
哪种实现方式更好?
2.具体分析
无论是springboot,SpringMVC,其本质都是Servlet。
由服务器跳转到网页上,有且只有两种方式:
一是转发。
二是重定向。
二者具体有什么区别,文章第4部分会讲。
3.解决方案
前提条件:
控制器的注解,需要使用@Controller,不可使用@RestController。
@RestController相当于@Controller和@ResponseBody合在一起的作用,如果使用@RestController注解Controller层的话,则返回的是return里面的内容,无法返回指定的页面。
在配置文件application.properties当中增加视图解析器配置。
#配置视图解析器
#路径后缀
spring.mvc.view.suffix=.jsp
方式一:使用SpringMVC实现
关键点:创建ModelAndView对象。
在springboot出来之前,需要我们自己手动创建视图对象(ModelAndView)。
springboot只不过是帮我们做了这件事,所以,我们即使在springboot项目当中,也可以仍旧采用springMVC这种笨方法实现。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@ApiOperation("404页面")
@GetMapping("/error404Page")
public ModelAndView error404() {
ModelAndView mv = new ModelAndView();
mv.setViewName("/WEB-INF/jsp/error/404");
return mv;
}
请求最终会去WEB-INF目录下,按照上述路径找到404.jsp,并将网页内容响应给浏览器。

方式二:使用springboot实现
@GetMapping("/404")
public String demo404() {
return "/WEB-INF/jsp/error/404";
}

在springboot当中,要响应的网页,默认使用的是转发:forward,该关键词可以省略。
那如果我们加上forward会发生什么呢?
@GetMapping("/404")
public String demo404() {
return "forward:/WEB-INF/jsp/error/404";
}

我们可以看到:
在加上关键词:"forward: "之后,服务器找不到这个网页了,为什么?
原因就在于,当我们在将要转发的页面,显式地声明"forward: "之后,在配置文件里面设置的视图解析器将会失效(包括路径前缀和后缀)。
也就是说,显式地声明"forward: "之后,配置文件关于视图解析器的设置对于它而言作废。
我们必须将要转发的界面的完整路径写出来。
当然了,对于不使用forward关键字的转发路径,依然生效。
针对这一特性,我们可以这样做:
对于绝大多数相同的跳转路径前缀和后缀名,我们可以在配置文件当中配好。
对于少部分路径不同或者或者后缀名不同的转发界面,我们就可以使用forward的关键字来覆盖配置文件当中的配置。
这样一来,一举两得,互不影响。
方式三:通过原生Servlet实现
关键点:使用ServletReques和ServletResponse对象。
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@GetMapping("/404")
public void demo404(HttpServletRequest request, HttpServletResponse response) {
try {
request.getRequestDispatcher("/WEB-INF/jsp/error/404.jsp").forward(request, response);
} catch (ServletException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

4.转发与重定向
二者有何区别,我们通过示例来一起认识一下。
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
相关推荐:
- 个人主页
- SpringBoot配置404跳转页面的两种方式(配置错误页)
- html 指定页面字符集的两种方式