springboot 跳转到网页上的两种实现方式(转发与重定向详细对比)

Marydon / 2023-05-25 / 原文

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 指定页面字符集的两种方式