请求转发

转发的英文即 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;charset=utf-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;charset=utf-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;charset=utf-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;charset=utf-8");
        System.out.println("Myservlet02 ==》 doPost方法进入提示");
        resp.getWriter().write("响应操作成功");
        System.out.println();

        }
    }
}

 通过浏览器发送请求查看:

302状态码说明:

         HTTP 302 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. 不能共享同请求中的数据,因为是两次请求。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐