请求转发与重定向的区别

先来看一个简单的实例,客户端首先在一个页面输入数据,点击提交后,数据在另一个页面显示。
getDate.jsp

<body>
    <form action="<%=request.getContextPath() %>/test" method="post">
        用户名:<input type="text" name="userName"><br>
        密    码:<input  type="password" name="passWord"><br>
        <input type="submit" value="提交">
        <input type="reset" value="重置">
    </form>
</body>

showDate.jsp

您提交的信息为:<br>
用户名:<%=request.getParameter("userName")%><br>
密码:<%=request.getParameter("passWord") %><br>

LoginServlet.java

package cn.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //重定向代码
        //请求转发代码    
    }
}

web.xml配置

  <servlet>
    <servlet-name>demo</servlet-name>
    <servlet-class>cn.servlet.LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>demo</servlet-name>
    <url-pattern>/test</url-pattern>
  </servlet-mapping>

1.如果是重定向代码
地址栏输入http://localhost:8080/Project/02/getDate.jsp

resp.sendRedirect(req.getContextPath()+"/02/showDate.jsp");

这里写图片描述
输入数据点击提交页面跳转
可见前面提交的数据并没有传递过来,
并且地址栏变为http://localhost:8080/Project/02/showDate.jsp
其实这里有个中间过程:http://localhost:8080/Project/test
这里写图片描述

2.如果是请求转发代码

String zf = "/02/showDate.jsp";
        RequestDispatcher rd = req.getRequestDispatcher(zf);
        rd.forward(req, resp);

输入数据点击提交后
这里写图片描述
可见,参数传递正常并且地址栏变为http://localhost:8080/Project/test
并没有变为http://localhost:8080/Project/02/showDate.jsp

从上面的例子中可以看出重定向涉及两次请求响应,而请求转发只涉及一次请求响应。可以这样理解:A向B要一个东西,B说东西我有但是我没时间,但我可以帮你找到C,你自己去问问C吧,所以A又自己跑去C那儿问C要,但是C有没有这个东西和B没关系,比如上面的例子中几个参数值都为null,这是重定向。另一种情况是A向B要一个东西,B说没时间,我把东西先给给C然后让C给你吧,C的东西是从B那拿到的,就如上面例子中得到的参数值,这就是所谓的请求转发。所以重定向又被称为客户端跳转,而请求转发又被称为服务端跳转。
重定向的发起者和调用者使用各自的request实例和response实例,它们各自属于独立的“请求/响应”过程请求转发的发起者和调用者共享相同的request实例和response实例,它们属于同一个“请求/响应”过程。
重定向与请求转发的其他区别:
1.请求转发只能请求转发给同一个web应用中的其他组件;而重定向还可以重定到其他站点的资源上。
2.重定向访问过程结束后浏览器地址栏的URL会发生改变;请求转发过程结束后地址栏URL地址不变。
关于两者区别也可以参考这个链接内容:
http://blog.csdn.net/getstudymessages/article/details/6230325

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值