一、理论
* 转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
* 重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
二、代码演示
2.1、forward转发
1、新建JavaEE项目
2、配置tomcat
3、新建RequestDemo8类,代码如下
/**
* @Author wang
* @Date 2022/5/8 20:04
* @PackageName:${PACKAGE_NAME}
* @ClassName: ${NAME}
* @Description: TODO
* @Version 1.0
*/
@WebServlet("/RequestDemo8")
public class RequestDemo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo8被访问量。。。。。。。。。");
//存储数据到Request域中
request.setAttribute("msg","hello");
//转发到Demo9
request.getRequestDispatcher("/RequestDemo9").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4、新建RequestDemo9类,代码如下
/**
* @Author wang
* @Date 2022/5/8 20:04
* @PackageName:${PACKAGE_NAME}
* @ClassName: ${NAME}
* @Description: TODO
* @Version 1.0
*/
@WebServlet("/RequestDemo9")
public class RequestDemo9 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
System.out.println("Demo9被访问量。。。。。。。。。");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
5、浏览器访问RequestDemo8 这个地方地址栏是没有变化的 一次请求,一次URL
6、控制台输出样式如下
7、验证是不是 `只能访问当前服务器下的资源`
注释代码——更改代码 如下图
// request.getRequestDispatcher("/RequestDemo9").forward(request,response); request.getRequestDispatcher("https://baidu.com").forward(request,response);
2.2、redirect 重定向
1、新建JavaEE项目
2、配置tomcat
3、新建ResponseDemo1类,代码如下
/**
* @Author wang
* @Date 2022/5/9 16:43
* @PackageName:${PACKAGE_NAME}
* @ClassName: ${NAME}
* @Description: TODO Response重定向
* @Version 1.0
*/
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1............");
//访问/responseDemo1 会自动跳转/responseDemo2资源
/* //设置状态码
response.setStatus(302);
//设置响应头location
response.setHeader("location","/day15_response/responseDemo2");*/
//简单的重定向方法
response.sendRedirect("/day15_response/responseDemo2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4、新建ResponseDemo2类,代码如下
/**
* @Author wang
* @Date 2022/5/9 16:43
* @PackageName:${PACKAGE_NAME}
* @ClassName: ${NAME}
* @Description: TODO
* @Version 1.0
*/
@WebServlet("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo222222...........");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
5、浏览器访问responseDemo1这个地方地址栏是发生了变化 两次请求,两次URL
如图
6、控制台输出样式如下
7、验证是不是 `可以访问其他站点(服务器)的资源`
注释代码——修改代码
// response.sendRedirect("/day15_response/responseDemo2"); response.sendRedirect("https://baidu.com");
8、验证是不是`不能使用request对象来共享数据 `
在ResponseDemo1类中增加存储数据代码
request.setAttribute("msg","hello");
在ResponseDemo2类中增加获取数据代码 打印输出 如果为null 即为不能使用request对象来共享数据
Object msg = request.getAttribute("msg"); System.out.println(msg);