转发
转发是指服务器内部将请求从一个Servlet或JSP转交给另一个Servlet或JSP进行处理,而客户端对这种内部转移是不可见的。转发使用的是服务器端的资源,不会改变客户端的URL。
重定向
服务器告诉浏览器去访问新地址,浏览器再次发起请求,过程对用户可见。
转发的特点
- 单次请求:转发是在服务器内部完成的,客户端只发送一次请求。
- URL不变:客户端浏览器的URL保持不变。
- 高效:因为没有新的请求和响应的创建,所以转发的效率较高。
- 共享数据:可以使用request对象在转发前后的资源间共享数据。
- 转发可以访问内部受保护的文件(WEB-INF)里的文件,而重定向不可以。
重定向的特点
- 两次请求:重定向涉及两次请求和响应,第一次请求得到重定向指令,第二次请求重新请求新的URL。
- URL改变:客户端浏览器的URL会改变为新的URL。
- 不共享数据:因为是两个独立的请求,不能使用request对象在重定向前后的资源间共享数据。
- 适用场景:适用于需要告知客户端新的URL的情况,如处理表单提交后的跳转,防止表单重复提交。
代码示例:
java
@Controller
@RequestMapping("jsp")
public class JspController {
/**
* 快速查找视图
* 1.方法的返回值是字符串类型
* 2.不能添加@ResponseBody注解,不然后端会直接返回字符串给浏览器,不走视图解析器
* 3.返回值 对应中间的视图名称即可
* 页面请求地址: jsp/index 如果项目配置了项目名称(ApplicationContext):springmvc, 此时页面请求地址:springmvc/jsp/index
* @return
*/
@GetMapping("index")
public String index(HttpServletRequest request){
request.setAttribute("data","hello jsp!!!");
System.out.println("JspController.index");
return "index";
}
/**
* 转发:只能转发到项目下的资源
* 1.方法的返回值写成字符串
* 2.不能添加responseBody注解
* 3.返回的字符串前加 forward:/转发地址
*/
@GetMapping("forward")
public String forward(){
System.out.println("JspController.forward");
return "forward:/jsp/index";
}
/**
* 路径细节:【不使用springmvc框架,使用request,response原生组件时】
* 转发是项目下的资源跳转,路径:项目下的地址,/jsp/index 忽略 application context(项目名称)
* 重定向可以是项目下的资源也可以是项目外的资源,重定向属于二次请求 路径:项目下的地址必须写全 /springmvc/jsp/index 不能忽略application context(项目名称)
*
* 使用springmvc框架时:
* "forward:路径 | redirect:路径" 重定向,资源的地址也不需要写项目的根路径! 写成/jsp/index
* 此时,转发和重定向的地址写法都一样了, 重定向地址如果写成:/springmvc/jsp/index 则会得到 /springmvc/spingmvc/jsp/index 也就是说spingmvc框架会自动帮我们在路径上添加项目名
*/
/**
* 重定向:
* 1.方法返回值写成字符串类型
* 2.不能添加responseBody注解
* 3.返回的字符串前加 redirect:/转发地址
*/
@GetMapping("redirect")
public String redirect(){
System.out.println("JspController.redirect");
return "redirect:/jsp/index";
}
@GetMapping("redirect2")
public String redirectBaiDu(){
System.out.println("JspController.redirect");
return "redirect:http://www.baidu.com";
}
}