Appearance
SpringMVC教程 - 9 转发与重定向
下面介绍一下转发和重定向。
9.1 转发
转发(forward)就是服务器内部的跳转,由服务器自己把请求交给另一个资源处理,特点是:
浏览器 只发起一次请求,
URL 不改变
请求中的参数和属性 会被保留
属于 服务器内部行为,客户端无法感知。
举个栗子:
java
package com.foooor.hellospringmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
@Controller
public class IndexController {
@GetMapping("/")
public String index(Model model) {
model.addAttribute("message", "For技术栈");
return "index"; // 转发到index视图 index.html
}
}- 上面定义了一个接口
/,方法返回值是index,是逻辑视图的名称,然后 DispatcherServlet 将请求转发给视图解析器找到模板,由模板引擎进行渲染,最终生成 HTML并返回给浏览器。所以在 Controller 中方法return "index";这种形式默认就是采用转发的方式跳转的。
我们在 Controller 中还可以将处理转发到另一个接口处理,举个栗子:
java
package com.foooor.hellospringmvc.controller;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Slf4j
@Controller
public class IndexController {
@GetMapping("/")
public String index(HttpServletRequest request) {
log.info("message:{}", request.getAttribute("message")); // 这里可以获取到 message 属性
return "index"; // 转发到index视图 index.html
}
@GetMapping("/hello")
public String hello(Model model) {
// 放入 request 作用域,在 index.html 中可以使用 ${message} 来获取
model.addAttribute("message", "For技术栈");
return "forward:/"; // 转发到/接口
}
}- 上面定义了两个接口,
/接口的返回值是index,是表示跳转到index.html视图,默认就是转发的方式,底层创建的是ThymeleafView对象。 - 而
/hello接口的返回值是forward:/表示转发到/,表示转发到另一个接口,前面的forward:是固定的,底层使用的是InternalResourceView对象完成服务器内部的调转。
打开浏览器,访问 http://localhost:8080/hello ,请求会被转发到 http://localhost:8080/ 接口 ,但是浏览器的地址依然是 http://localhost:8080/hello ,而且 request 中的参数依旧被保留,可以在 index.html 中获取到参数。
但实际开发中,这样转发到另一个接口的方式用的不多,而且需要注意,两个接口的请求方法需要一样,上面都是 Get 请求,所以转发没问题,如果将 Get 请求转发到一个 Post 请求的接口会报错。
所以转发是一种服务器内部的“跳转”机制,不需要浏览器重新发起请求,转发是属于同一个请求,request、response 还是同一个对象,只是把控制权交给另一个资源处理。
内容未完......