转发和重定向
- 介绍
转发
请求转发是一种资源的跳转方式,此外重定向也是一种资源的跳转方式
请求转发的特点:
(1)请求转发是一次请求,一次响应
(2)请求转发前后,地址栏地址不会发生变化
(3)请求转发前后,request对象是同一个(域对象)
(4)进行转发的两个资源必须属于同一个Web应用(属于不同web应用的资源之间是不能进行转发的)
重定向
重定向也是一种资源的跳转方式
重定向的特点:
(1)重定向是两次请求,两次响应
(2)重定向前后,地址栏地址会发生变化
(3)重定向前后,request对象不是同一个
(不能使用域对象)
(4)进行重定向的两个资源可以不是同一个Web应用(属于不同web应用的资源之间是可以进行重定向的)
- 相关面试题
不管是刚刚开始学习jsp,还是在面试中,转发与重定向的区别,都是一个十分重要的知识点。关于转发与重定向的区别,总结如下:
1.实现
转发:用request的getRequestDispatcher()方法得到ReuqestDispatcher对象,调用forward()方法
request.getRequestDispatcher("other.jsp").forward(request, response);
1
重定向:调用response的sendRedirect()方法
response.sendRedirect("other.jsp");
1
2.地址栏
转发:不变,不会显示出转向的地址
重定向:会显示转向之后的地址
3.请求
重定向:至少提交了两次请求
4.数据
转发:对request对象的信息不会丢失,因此可以在多个页面交互过程中实现请求数据的共享
重定向:request信息将丢失
5.原理
转发:是在服务器内部控制权的转移,是由服务器区请求,客户端并不知道是怎样转移的,因此客户端浏览器的地址不会显示出转向的地址。
重定向:是服务器告诉了客户端要转向哪个地址,客户端再自己去请求转向的地址,因此会显示转向后的地址,也可以理解浏览器至少进行了两次的访问请求。
servlet实现转发和重定向
1.Servetl实现转发
- 关键方法
使用的是HttpServletRequest对象
request.getRequestDispatcher(转发到资源的URL地址).forward( request, response);
1.1 转发到jsp页面
- servlet
package com.shaoming.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.shaoming.pojo.Demo;
import cn.hutool.core.collection.CollectionUtil;
/**
*
*/
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// >>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
// >>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
// TODO...
// 生成一些测试数据,放在list集合中
List<String> doorList = new ArrayList<>();
doorList.add("1, 门店1");
doorList.add("2, 门店2");
doorList.add("3, 门店3");
doorList.add("4, 门店4");
doorList.add("5, 门店5");
// 把list集合放到request域对象中
request.setAttribute("list", doorList);
// request实现转发
request.getRequestDispatcher("doorList.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- jsp页面
forward.jsp
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf8"
pageEncoding="utf8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>Insert title here</title>
</head>
<body>
<h3>day10...doorList.jsp...</h3>
显示所有门店信息: <br/>
<%
List<String> list = (List<String>)
request.getAttribute("list");
for( String door : list ){
out.write( door +"<br/>" );
}
%>
</body>
</html>
1.2 转发到html页面
- servlet
package com.shaoming.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
public class Forward1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//>>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
//>>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//TODO...
request.getRequestDispatcher("/forward.html").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- html页面
forward.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我是servlet转发后的html页面</h1>
</body>
</html>
说明:
jsp和html页面放在项目的WebContent目录下
我是用的eclipse,如果用的idea自行查找资料
2.servlet实现重定向
- 关键方法
使用的是HttpServletResponse对象
response.sendRedirect( 重定向到资源的地址 );
2.1 重定向到本应用的html页面
- servlet
package com.shaoming.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 测试的url:
* http://localhost:8080/java-web/RedirectServlet
*/
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//>>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
//>>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//TODO...
/**
* redirect.html该html页面是放在本工程的WebContent目录下
* 说明:
* 我使用的是eclipse,如果是idea,自行百度
*/
response.sendRedirect("redirect.html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- html页面
redirect.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我是重定向后的html页面</h1>
</body>
</html>
2.2 重定向到本地应用的jsp页面
- servlet
package com.shaoming.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 测试的url:
* http://localhost:8080/java-web/RedirectServlet
*/
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//>>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
//>>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//TODO...
/**
* redirect.jsp该jsp页面是放在本工程的WebContent目录下
* 说明:
* 我使用的是eclipse,如果是idea,自行百度
*/
response.sendRedirect("redirect.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- jsp页面
redirect.jsp
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf8"
pageEncoding="utf8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>测试ajax和servlet之间的请求响应</title>
<!-- 引入jQuery使用cdn的方式引入jQuery -->
<script src="http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script>
</head>
<body>
<h1>我是重定向后的jsp页面</h1>
</body>
</html>
说明:
jsp和html页面放在项目的WebContent目录下
我是用的eclipse,如果用的idea自行查找资料
2.3重定向到同一个tomcat的另一个javaweb工程的html页面
说明:
同理,也可以是jsp页面,这里就不测试重定向到jsp页面了
- servlet
package com.shaoming.redirect;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
public class RedirectServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// >>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
// >>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
// TODO...
/**
* 重定向到同一个tomcat的另一个javaweb工程的html页面
* 工程名为java-web2
*/
response.sendRedirect("/java-web2/redirect.html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- html页面
redirect.html
说明:
新建一个动态的web工程在eclipse里面
在项目路径下的WebContent目录下新建一个html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我是javaweb2动态web工程的html页面</h1>
</body>
</html>
2.4重定向到一个网址
- servlet
package com.shaoming.redirect;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
public class RedirectServlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//>>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
//>>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//TODO...
/**
这网址是我个人博客网址,欢迎大家来光顾
*/
response.sendRedirect("http://www.shaoming.club");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
扫下方二维码,既可以访问我的个人博客主页
springmvc实现转发和重定向
- 前提
我用ssm举例,springboot整合不一定是jsp模板引擎
-
知道springmvc的视图解析配置
通常实在springmvc-config.xml里面配置,这是springmvc的配置文件
当然名字可以不一样
我的配置如下
在同一个controller里面测试转发和重定向
package com.shaoming.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* @ClassName: ForwarAndRedirectController
* @Description: TODO(这里用一句话描述这个类的作用) 重定向到项目的url
*
* 重定向到jsp页面
*
* 重定向到网址
*
* 通用的page.jsp页面
* @author shaoming
* @date 2020年9月15日
*
*/
@Controller
public class ForwarAndRedirectController {
//重定向到某个网址
@RequestMapping("/tomyblog")
public String toMyBolog() {
/**
* 重定向到我的博客网址 欢迎大家光顾
*/
return "redirect:http://www.shaoming.club";
}
// 到jsp页面
@RequestMapping("/tojsp")
public String tojsp() {
return "hello";
}
// 重定向url
@RequestMapping("/toredirecttojsp")
public String totojsp() {
return "redirect:tojsp";
}
/**
* 重定向到jsp页面
*/
@RequestMapping("/redirectjsp")
public String toredirecthtml() {
return "redirect:/index.jsp";
}
// 通用的page页面
@RequestMapping("/{page}")
public String totojsp(@PathVariable("page") String page) {
return page;
}
/**
* 转发
*/
@RequestMapping("/forwardtojsp")
public String toforwardjsp() {
return "forward:tojsp";
}
}
基于返回字符串
由于返回是字符串,所以mv的设置将没有作用,要用req来传送值
str=”forward : 路径” 请求转发到一个jsp中
str=”forward : controller的映射” 请求转发到一个controller方法中
str=”redirect: 路径” 请求转发到一个非WEB-INF的jsp
常用:
str=”redirect : controller的映射” 重定向到一个controller方法中
str=”XXX” 根据前后缀,请求转发到 前缀/XXX.后缀
dex.jsp";
}
// 通用的page页面
@RequestMapping("/{page}")
public String totojsp(@PathVariable("page") String page) {
return page;
}
/**
* 转发
*/
@RequestMapping("/forwardtojsp")
public String toforwardjsp() {
return "forward:tojsp";
}
}
```markdown
基于返回字符串
由于返回是字符串,所以mv的设置将没有作用,要用req来传送值
str=”forward : 路径” 请求转发到一个jsp中
str=”forward : controller的映射” 请求转发到一个controller方法中
str=”redirect: 路径” 请求转发到一个非WEB-INF的jsp
常用:
str=”redirect : controller的映射” 重定向到一个controller方法中
str=”XXX” 根据前后缀,请求转发到 前缀/XXX.后缀