前言

当我们在访问一个网页的时候可能会不挺的实现页面之间的跳转,有时这种跳转还连带着一些数据,最常见的就是登陆页面


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么情况下使用转发和重定向

当我们的service被指定实现页面间的切换功能时,我们就会用到,在着就是当service处理某些请求是,为了提高效率,或者处理到错误的请求时,都会转向到其他的service或者jsp

public class ServetForword extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        System.out.println("进入了ServletForward ,现在开始转发到get1");
        //URL不会改变
        context.getRequestDispatcher("/get1").forward(req,resp);
    }

请求转发也叫请求调度,操作很简单只需要使用一个context.getRequestDispatcher("/get1").forward(req,resp);参数为想要转发的URL,但是我们发现,转发的前提也是创建一个储物柜,这是为什么呢?因为请求调度从大的方面讲是让整个请求在web中重新发出一遍,正因为这样,所以需要让web老板知道,这就需要使用储物柜给web简介提交一个转发的请求。

这里的URL—>("/get1")可以是web中注册的servlet,也可是WEB-INF下的一个页面,这里你就会很奇特的发现他们的根路径就是项目路径

在这里插入图片描述

二、再说下重定向吧

为了更好的理解转发和重定向
我们不妨设一个例子来说明下,现在index.jsp有一个登录验证的表单,我们希望RedirectServlet(这个服务员)来处理这个登录请求,处理条件是获取登录的信息并输出到控制台,登录后转发到new.jsp

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>登录页面</title>
</head>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径必须是项目的路径--%>
<%--${pageContext.request.contextPath}代表当前的项目--%>
<form action="${pageContext.request.contextPath}/red" method="get">
    用户名:<input type = "text" name="username"><br>
    密码:<input type = "password" name="password">
    <input type="submit">

</form>

</body>
</html>

我们看这个表单, form action="${pageContext.request.contextPath}/red" method=“get” 这段代码的意思是我们表单要提交给名字为/red的这个servlet(服务员)处理,提交方式为get

这个过程在我们浏览器上显示的效果就是,我们点击提交这一刻,我们的浏览器(客户端)便想web容器发送了一个请求,web老板收到请求后,会把这个请求转交给指定的servlet处理。

RedirectServlet

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username+":"+password);
        resp.getWriter().print("现在已经进入Servlet");
        //重定向的时候一定要注意路径,不然汇报404
        resp.sendRedirect("/new.jsp");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

当我们的servlet(服务员)接受到请求后,这些请求的去不信息都会封装在HttpServletRequest req中,然后我们可以通过req.getParameter(“name”)获取提交过来参数的值,随后进行处理,处理后servlet(服务员)会将处理后的数据打包到(HttpServletResponse resp),交给web老板审核后,发送到客户端。
这个过程如果本次处理的servlet希望把数据进行转发,只需在处理后 把打包的数据发送给新的页面即可 也就是resp.sendRedirect("/new.jsp");

二.简单说下转发和重定向的异同

我们先看两张图,重新认识下转发和重定向
在这里插入图片描述
在这里插入图片描述
在整个转发的过程中,客户使用的浏览器只,进行了一次请求,页面的跳转操作是在服务器端完成的,而重定向则是进行了两次的请求操作, 重定向的时候会根据实际情况,在数据到达请求域的时候,再次回到客户端完成第二次请求,已达到重定向的效果。另外需要注意的时,我们平时无论是使用重定向或者是转发的过程中一定要清晰的知道数据的迁移,在转发的作用域,是会保留请求携带上来的数据,而重定向会随着请求的离去,而丢失数据。
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐