1.引子

转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数、属性获取问题。

2.转发和重定向

1).转发

转发是服务器行为,将当前请求(Request)和响应(Response)处理打包发送给目标服务(Servlet),这样下一个目标服务就能获取或操作上一个服务中的请求和响应。

客户浏览器发送http请求—>web服务器接受此请求—>调用内部的一个方法在容器内部完成请求处理和转发动作—>将目标资源 发送给客户

转发行为是同一次请求,其URL地址仍是以前的地址,不会发生变化,但页面内容却是新页面的东西了。转发只能是在同一应用中使用,不能跨应用转发请求,比如,京东页面的请求就不可能转发给淘宝的服务器。

2).重定向

重定向就如其名字一样,是将页面定位到一个新位置。重定向客户端行为,是全新的请求,客户端不能保存当前的请求,在定位到新的页面或servlet服务时,上次的请求超出请求的作用范围了,那个请求即失效了。

客户浏览器发送http请求—>web服务器接受后发送302状态码响应及对应新的location给客户浏览器—>客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址—>服务器根据此请求寻找资源并发送给客户。

重定向至少是两次请求,重定向后URL地址是新的地址了,当然页面内容也更新为目标页面的内容了。重定向可以定位到任意页面,可以跨越不同的应用程序。比如,天猫的页面就可以重定向到淘宝的页面上。

参数(parameter)、属性(attribute)的区别,可以看我另一篇帖子-----Servlet中的属性(attribute)和参数(parameter)的区别

3.简单示例

登录页html代码

<form action="loginServlet" method="post">
用户名:
<input type="text" name="username" /> <br/>
密&nbsp;&nbsp;码:
<input type="password" name="pwd"/><br/>
<!-- 默认的submit,提交给loginServlet处理 -->
<input type="submit" value="提交至将转发的servlet"> <br/>
<!-- 一个表单内容可以提交给不同的servlet,而formaction属性值就对应提交的目标地址,
这里提交给loginServlet2进行请求处理 -->
<input type="submit" formaction="loginServlet2" value="提交至将重定向的servlet">
</form>

要转发的servlet

 @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
String pwd=request.getParameter("pwd");
System.out.println("用户名:"+name+"\t密码:"+pwd);
//request域中设置一个属性
request.setAttribute("nowDate", new Date());
//转发
request.getRequestDispatcher("forward_page.jsp?url_param=test_url_param").forward(request, response);
}

要重定向的servlet

  @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
String pwd=request.getParameter("pwd");
System.out.println("用户名:"+name+"\t密码:"+pwd);
//request域中设置一个属性
request.setAttribute("nowDate", new Date());
//重定向
response.sendRedirect("redirect_page.jsp?url_param=test_url_param");
}

将转发的登录页面

转发页的html代码

<body>
<h3>这是一个转发后的页面</h3>
request中获取参数(用户名):<label>${param.username}</label> <br/>
request中获取参数(密码):<label>${param.pwd}</label> <br/>
request中获取的属性(‘nowDate’):<label>${nowDate}</label> <br/>
url中获取的一个参数:<label>${param.url_param}</label> <br/>
</body>

servlet转发到的页面

从上图可以看出,所有的参数和属性(包括url中拼接的参数)都可以正确地获取,并显示在页面上。但url地址还是"loginServlet",不是当前页面所对应的"forward_page.jsp"地址。

将重定向的登录页面

重定向页的HTML代码

<body>
<h3>这是一个重定向后的页面</h3>
request中获取参数(用户名):<label><c:out value="${param.username}" default="空"/></label> <br/>
request中获取参数(密码):<label><c:out value="${param.pwd}" default="空"/></label> <br/>
request中获取属性‘nowDate’:<label><c:out value="${nowDate}" default="空"/></label> <br/>
url中获取的一个参数:<label><c:out value="${param.url_param}" default="空"/></label> <br/>
</body>

servlet重定向到的页面

从上图可以看出,上次请求的所有属性、参数均不能获取到。另外url地址更新了,不再是servlet的映射地址了,而当前新页面的"redirect_page.jsp"地址。
除此之外,可以看到重定向的URL中拼接的键值对参数“url_param=test_url_param”在新页面还是能获取到的。

4.总结

1.重定向,是一次新的请求,不能获得上次请求中的参数、属性;转发,是同一次请求,之前所有的参数、属性在新的页面或servlet中都可见的,它们保存在同一个request域中。
       2.转发操作,(即使转至新页面)其URL地址不会变化;而在重定向操作中,URL地址会更新变为重定向的目标地址。
       3.若要页面内容、URL地址均更新,并且新页面还要获取上次请求的参数、属性,可以通过一种曲线救国的方式实现:在重定向的URL中以键值对的方式来拼接上次请求的参数、属性;并在新页面中通过EL表达式“${param.name}”获取。

转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨的更多相关文章

  1. php 后台转发和重定向的区别及kohana框架当前url加参数方式

    1.重定向是浏览器行为,浏览器地址有变化:转发是后台服务器完成, url地址不变化. 2.kohana获取URL 当前url是http://soyoung.kohana.com/blog/add?id ...

  2. jsp:和属性相关的方法,请求的转发,重定向

    jsp中与属性相关的方法: 方法: void setAttribute(String name, Object o): 设置属性 Object getAttribute(String name):获取 ...

  3. HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向

    上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...

  4. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

      ServletRequest 基本概念 JavaWeb中的 "Request"对象  实际为   HttpServletRequest  或者  ServletRequest, ...

  5. HttpRequest,HttpResponse,乱码,转发和重定向

    HttpServletRequest简介 Web服务器收到客户端的http请求,会针对每一次请求,创建一个用于代表请求的HttpServletRequest类型的request对象,并将"H ...

  6. HttpServlet的转发和重定向

    HttpServletResponse重定向 1.HTTP协议规定了一种重定向的机制,重定向的运作流程如下 用户在浏览器输入特定的URL,请求访问服务端的某个组件. 服务端的组件返回一个状态码为302 ...

  7. Servlet(四):转发与重定向、路径问题

    在上次的小案例中用到了转发的技术,今天来仔细聊聊转发和重定向的问题,以及一些小知识的汇总. 一.转发 1.转发的概念 转发主要是将浏览器的请求交给另外一个servlet或jsp来处理,借助reques ...

  8. SpringMVC中使用forward和redirect进行转发和重定向以及重定向时如何传参详解

    转自:http://blog.51cto.com/983836259/1877188 2016-11-28 09:45:59   如题所示,在SpringMVC中可以使用forward和redirec ...

  9. springMVC3.0(文件上传,@RequestMapping加參数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传參,ajax,拦截器)

    1.项目包结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsiz ...

随机推荐

  1. SpringBoot学习(五)——Profile

    Profile是Spring对不同环境(例如开发人用开发环境,测试人员用测试环境)提供不同配置功能的支持,可以通过激活,指定参数等方式快速切换环境 1.多profile文件形式 格式:applicat ...

  2. HDU - 4405 Aeroplane chess(期望dp)

    题意:沿着x轴从0走到大于等于N的某处,每一步的步数由骰子(1,2,3,4,5,6)决定,若恰好走到x轴上某飞行路线的起点,则不计入扔骰子数.问从0走到大于等于N的某处的期望的扔骰子次数. 分析: 1 ...

  3. 字符串匹配之KMP

    说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂. 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥. 这里不扯概念 ...

  4. Codeforces Round #604 (Div. 2) 部分题解

    链接:http://codeforces.com/contest/1265 A. Beautiful String A string is called beautiful if no two con ...

  5. bestphp's revenge

    0x00 知识点 1利用PHP原生类来构造POP链 本题没有可以利用的类,没有可以利用的类就找不到POP链所以只能考虑PHP原生类 我们先来解释一下什么是POP链 POP:面向属性编程 在二进制利用时 ...

  6. Hibernate(一)——入门

    1. 前言         Hibernate是一个开放源代码的ORM持久化框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.         ...

  7. opencv vs2013提示缺少Qedit.h问题

    #pragma include_alias( "dxtrans.h", "qedit.h" ) #define __IDxtCompositor_INTERFA ...

  8. 解决configure: error: C++ compiler cannot create executables问题

    参考 yum install gcc gcc++ 呵呵,这样的话还是有组件没有安装完整的.再执行一下这个命令就可以解决问题. yum install gcc gcc-c++ gcc-g77

  9. Python笔记_第五篇_Python数据分析基础教程_相关安装和版本查看

    1. IDE说明: 所有的案例用Anacoda中的Jupiter工具进行交互式讲解. 2. 版本和安装: NumPy从如下网站安装:http://sourceforge.net/projects/nu ...

  10. docker入门2---docker的初体验

    Tomxin7 Simple, Interesting | 简单,有趣 第一个Docker镜像? 尝试运行docker自带的镜像"hello-world",了解docker镜像的下 ...