网页的转发与重定向

在Web开发中,HTTP的转发与重定向是两种不同的处理方式。转发不会改变URL,而重定向会导致URL变化。转发发生在服务器端,浏览器只发起一次请求,多个服务器端任务可以通过转发完成;而重定向则使浏览器发起新的请求,服务器告知浏览器访问不同URL。通过代码示例展示了这两种方法的使用,以及它们在请求和响应过程中的不同表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在web开发中,转发与重定向有很大的区别。

直观看来,转发不会发生URL址的变换,而重定向则会发生URL的改变。

这仅仅只是一种表象。HttpServlet中的request对象和response对象是在用户请求网页时由服务器根据浏览器传过来的参数封装生成的。一旦从浏览器请求过来,服务器响应回去那么request和response的也就到了生命的终点了

当使用转发的时候,浏览器仅仅请求一次但是服务器端可能经历了多次的跳转。服务器端执行时发生了转发那么服务器就停止正在执行的任务,去指定转发给定地址的任务。

而使用重定向的话,浏览器则会项服务器发生多次请求。在服务器端执行代码的时候,发现发生了重定向,那么它就会通知浏览器,去访问另一个URL。浏览器就会向被发送的URL请求资源。

看一段代码:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
    <form action="myServlet" method="post">
        name :<input type="text" name="username"/><br/>
        <input type="submit"  value="submit"/>
    </form>
</body>
</html>

这是一段jsp代码,当点击提交的时候,会把表单提交给myServlet。

界面长这样:
这里写图片描述

public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = (String)request.getParameter("username");
        request.setAttribute("welcome", "welcome!!!");
        RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp");
        rd.forward(request,response);
    }
}

这是MySerlet,当用户点击提交表单,服务器就会调用MyServlet的doPost方法,在这个方法里面进行的是页面转发。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>welcome</title>
</head>
<body>
    <%=request.getParameter("username")%>
    <br/>
    <%=request.getAttribute("welcome") %>
</body>
</html>

这是welcome.jsp的代码。

提交结果为:
这里写图片描述
当点击提交按钮后后我们可以看一下网络的请求过程。
这里写图片描述

可以发现浏览器只向服务器发送了一个请求。

接下来看一下重定向。

如果把MyServlet的代码改一下。

public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = (String)request.getParameter("username");
        request.setAttribute("welcome", "welcome!!!");
//      RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp");
//      rd.forward(request,response);
        response.sendRedirect("welcome.jsp");
    }
}

可以看到结果为:
这里写图片描述

而且浏览器项服务器发送了两次请求:
这里写图片描述

从上面的结果可以看出重定向后,因为是发起的另一个请求因此welcom页面中的内容都是null。而转发则由于是同一个request对象和response对象因此既能获得浏览器请求的参数,还能拿到request总放入的属性值。

其实从代码也可以看出来,sendRedirect()方法是HttpServletResponse对象的响应方法,既然调用了响应对象的方法,那么就表明整个请求结束了,服务器端项客户端返回执行结果。而getRequestDispatcher方法是request对象的方法,表明依旧在请求因此不会立即向浏览器返回结果,而是继续执行其转发的任务。

有一点需要说明的时,不论forward方法还是sendRedirect方法中传的URL需要注意,如果以“\”开头那么,就表示这个URL是现对于servlet容器根的请求,即localhost:8080,如果没有以“\”开头,那么表明这个请求地址是相对于当前的请求URL来寻址的

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
    <!--这里改成了绝对地址  -->
    <form action="/myServlet" method="post">
        name :<input type="text" name="username"/><br/>
        <input type="submit"  value="submit"/>
    </form>
</body>
</html>

当我再次点击提交的时候:
这里写图片描述

不以”\”开头的请求地址为:
这里写图片描述

转发模型为:
这里写图片描述

重定向模型为:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值