JavaWeb中request和response 请求转发转发的英文即 froward我们需要一个请求调度的对象来进行资源的转发即通过getRequestDispatcher方法来获取请求调度对象通过该对象来调用forward方法实现资源转发。通过请求转发可以将Tomcat服务器中ServletA的资源转发到ServletB中示例代码如下MyServlet文件public class MyServlet extends HttpServlet { Override public void init() throws ServletException { System.out.println(初始化.....); } Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 可以直接两句代码和为一句 // req.getRequestDispatcher(/MyServlet02).forward(req,resp); System.out.println(Myservlet01 》 doGet.....); RequestDispatcher requestDispatcher req.getRequestDispatcher(/MyServlet02); requestDispatcher.forward(req,resp); } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); resp.setContentType(text/html;charsetutf-8); System.out.println(Myservlet01 》 doPost运行.....); } }MyServlet02文件WebServlet(urlPatterns /MyServlet02) public class MyServlet02 extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); System.out.println(Myservlet02 》 doget方法进入提示); } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); resp.setContentType(text/html;charsetutf-8); System.out.println(Myservlet02 》 doPost方法进入提示); resp.getWriter().write(响应操作成功); } } }运行结果重定向由此可以看出重定向进行了两次请求第一次是浏览器请求资源A而资源A让我们请求资源B然后浏览器第二次发出向资源B发出请求请求需要注意的是与请求转发不同请求转发是当我们请求资源A时资源A对请求可以进行一些相应处理将后续的处理从资源A继续转发到资源B中。重定向代码MyServlet文件WebServlet(urlPatterns /MyServlet) public class MyServlet extends HttpServlet { Override public void init() throws ServletException { System.out.println(初始化.....); } Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 重定向可以动态获取虚拟路径 String contextPath req.getContextPath(); resp.sendRedirect(contextPath/MyServlet02); System.out.println(Myservlet01 》 doGet.....); // RequestDispatcher requestDispatcher req.getRequestDispatcher(/MyServlet02); // requestDispatcher.forward(req,resp); } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); resp.setContentType(text/html;charsetutf-8); System.out.println(Myservlet01 》 doPost运行.....); } }MyServlet02文件WebServlet(urlPatterns /MyServlet02) public class MyServlet02 extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(Myservlet02 》 doget方法进入提示); } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(utf-8); resp.setContentType(text/html;charsetutf-8); System.out.println(Myservlet02 》 doPost方法进入提示); resp.getWriter().write(响应操作成功); System.out.println(); } } }通过浏览器发送请求查看:302状态码说明HTTP302 Found重定向状态码表明请求的资源被暂时的移动到了由该 HTTP 响应的响应头 Location 指定的 URL 上。浏览器会重定向到这个 URL但是搜索引擎不会对该资源的链接进行更新 (In SEO-speak, it is said that the link-juice is not sent to the new URL)。如何判断是否要加虚拟目录无论是在请求转发还是重定向的方式我们所请求资源转发时和重定向时都需要在代码中写上我们所转发或重定向的路径而这个路径问题是到底是加资源目录还是不加资源目录比如在html中的超链接当我们点击超链接请求是从浏览器中发出的就需要添加虚拟路径也就意味着是浏览器使用所以加上虚拟目录。在表单中的action当我们提交表单发送请求从来浏览器中是向服务器端发出的就需要添加虚拟路径也就意味着是浏览器使用所以加上虚拟目录。请求准转发是在我们服务器中进行资源转发所以不需要家虚拟目录。对于重定向我么需要明白第一次请求是从浏览器发出的当请求到我们资源A时重定向语句会让浏览器重新请求资源B请求的两次都是从浏览器发出的所以资源路径需要加上虚拟路径。请求转发1. 浏览器地址栏路径不发生变化2. 只能转发到当前服务器内部资源中。3. 转发是一次请求4. 共享同一个请求中的数据5. 请求转发可以访问WEB-INF目录中的内容重定向1. 浏览器地址栏路径发生变化2. 只能转发到当前服务器内部资源中。3. 转发是两次请求。4. 不能共享同请求中的数据因为是两次请求。