转发:
请求转发,是内部资源跳转的一个过程。
我们在实际的开发过程中,需要写不同的servlet,每个servlet完成不同的功能,当我们访问test01servlet的时候,test01servelt需要跳转到一个新的test02servlet里面,这就是资源跳转的方式,就用到了请求转发。
原理图:
实例:
test01:
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/forward01")
public class Servlet_forward01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是Servlet转发01");
// RequestDispatcher requestDispatcher = request.getRequestDispatcher("/forward02");
// requestDispatcher.forward(request,response);
// response.sendRedirect("/forward02");
// 动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/forward02");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
test02:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/forward02")
public class Servlet_forward02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是转发过来的02页面");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果如下:
特点:
转发只是一次请求,多个资源之间使用同一个请求
重定向数据共享:
重定向:
重定向:一个web资源收到客户端的请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。
数据共享:
一次请求的范围,数据可进行传输的范围,一般用于请求转发多个资源中共享数据
- 存储数据:setAttribute
- 通过名字获取值:getAttribute
- 通过键名移除键值对:removeAttribute
原理图:
实例:
test01:
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/test01")
public class Servlet_test01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(302);
response.setHeader("location","/test02");
// 设置响应体,以流的方式输出
PrintWriter writer = response.getWriter();
writer.write("wo ai ni");
// 以字节流的方式传输
ServletOutputStream os = response.getOutputStream();
os.write("wo ai ni".getBytes("utf-8"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
test02:
@WebServlet("/test02")
public class Servlet_test02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重定向过来的
System.out.println("重定向过来的");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果如下:
测试是否能共享数据:
test03:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test03")
public class Servlet_test03 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("test03来了");
// 重定向
// 1
// response.setStatus(302);
// response.setHeader("location","/test04");
// 2
// response.sendRedirect("/test04");
// 3
// response.sendRedirect("http://www.baidu.com");
// 测试是否能共享数据
request.setAttribute("user","Username cs");
System.out.println("得到的共享数据Servlet03中:"+request.getAttribute("user"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
test04:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test04")
public class Servlet_test04 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("重定向到了test04");
Object user = request.getAttribute("user");
System.out.println("通过获取共享数据user:"+user);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果如下:
结果显示:
重定向不能共享数据!
特点:
重定向是两次请求,所以不能用request域共享资源
重定向可以访问其他服务器的资源
地址栏发生变化