最近有人私信我说,我写的博客有些肤浅,没有深究,在此我统一回复一下,这些博客大多都是概念性东西,是用通俗的例子让你理解这个技术或者知识到底是怎么一样原理。
所以我在后面都加着适合新人,我们都是从新人走过来的,知道初学者的那种迷茫,只会代码,不懂原理和含义,就比如,注解,你不去学习理解,初学者根本就不知道那是个什么东西,为什么要使用注解。
如果是资深大牛,那就不要看了,还是那句话,适合新人。
首先,要理解一个概念:
转发与重定向都是一个转折,就比如我们的小腿骨骼和大腿骨骼,将它们连在一起的膝盖关节就是代码钟的转发与重定向
区别:
1,理解的案例:
2,转发代码演示:
现在 设定人物 : 浏览器是 A
SerlvetB是:B
SerlvetC是:C
SerlvetB代码
package com.aaa.Forward;
import java.io.IOException;
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;
/**
*
* 项目名称:Forward
* 类描述:(转发)
* 创建人:莫参商
* 创建时间:2020-1-16 下午3:37:37
* 修改人:acer
* @version
*
*/
@WebServlet("/ServletB")
public class ServletA extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 获取请求携带的id
String id = req.getParameter("id");
System.out.println("A对B说:帮我带份饭,id号是:" + id);
System.out.println("B对A说:好的");
System.out.println("----分割线----");
//---后面B直接在服务器将请求转发给C---
//获取转发对象,后面括号指定了转发的路径
RequestDispatcher dispatcher = req.getRequestDispatcher("/ServletC");
//执行转发功能,并将请求和响应一并转发过去
dispatcher.forward(req, resp);
}
}
ServletC代码
package com.aaa.Forward;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletC")
public class ServletC extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置浏览器解析的格式,否则浏览器会出现乱码
resp.setContentType("text/html;charset=utf-8");
// 获取请求携带的id
String id = req.getParameter("id");
System.out.println("B对C说:帮A拿下快递,id号是:" + id);
System.out.println("拿到快递了");
// 获取输出流
PrintWriter writer = resp.getWriter();
// 将信息返回给浏览器
writer.println("拿到快递了");
}
}
结果:
访问的路径没有变化,并且id值也得到了!
3,重定向代码演示:
现在 设定人物 : 浏览器是 A
SerlvetB01是:B
SerlvetC01是:C
SerlvetB01代码
package com.aaa.Redirect;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* 项目名称:Forward
* 类描述:(重定向)
* 创建人:莫参商
* 创建时间:2020-1-16 下午3:37:37
* 修改人:acer
* @version
*
*/
@WebServlet("/ServletB01")
public class ServletB01 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 获取请求携带的id
String id = req.getParameter("id");
System.out.println("A对B说:帮我拿带份饭,id号是:" + id);
System.out.println("B对A说:我没有空,你找下C");
System.out.println("----分割线----");
//---后面B直接在服务器将请求转发给C---
resp.sendRedirect("/Forward/ServletC01");
}
}
SerlvetC01代码
package com.aaa.Redirect;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletC01")
public class ServletC01 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置浏览器解析的格式,否则浏览器会出现乱码
resp.setContentType("text/html;charset=utf-8");
// 获取请求携带的id
String id = req.getParameter("id");
System.out.println("B对C说:帮A带份饭,id号是:" + id);
System.out.println("饭到了");
// 获取输出流
PrintWriter writer = resp.getWriter();
// 将信息返回给浏览器
writer.println("饭到了");
}
}
结果:
重定向:
转发: